PHPやります!PHPでスクリプト/CGI作ります! -4ページ目

【コーディング】ブログを簡単に見るヤツ10

sendmailの設定が出来たのでメール送信処理です。

メールを送信するタイミングは、
・アカウント登録処理。
・メールアドレス変更処理。
・メール送信時間になった時。

↑の3つかな。この処理の時にメール送信処理を行う。

必要なパラメータ
・宛先
・件名
・本文

処理の流れ
1.mb_stringの初期化

2.送信パラメータの初期化

3.MIMEヘッダーの設定

4.MAILオブジェクトの生成

5.本文のエンコード(JIS)

6.送信

7.エラーチェック → エラーがあった場合は、X-StatにERR_MAIL(504)を設定してレスポンス。


public static function send($rcpt, $subject, $body)
{
mb_language("japanese");
mb_internal_encoding("UTF-8");

$params["host"] = "メールサーバのホスト";
$params["port"] = ポート番号;
$params["auth"] = TRUE;
$params["username"] = "sendmailのユーザー名";
$params["password"] = "sendmailのパスワード";
$params["localhost"] = "自ホスト名";

$from = '送信者';

$headers["From"] = mb_encode_mimeheader("送信者名")."<$from>";
$headers["To"] = implode(",", $rcpt);
$headers["Reply-To"] = $from;
$headers["Subject"] = $subject;

$mail = Mail::factory("smtp", $params);

$body = mb_convert_encoding($body, "JIS", "UTF-8");

$ret = $mail->send($rcpt, $headers, $body);
if (PEAR::isError($ret))
{
echo "error: " . $ret->getMessage();
throw new exception_mail($this->m_mysqli->error);
}
}
$rcptは配列 例:send(array($to1, $to2), "件名", "本文");


---------出来た---------
・ログイン
・ログインチェック
・RSS登録
・RSS解除
・ログアウト
・メール送信フラグ設定
・メールアドレス変更/登録
・メール送信時間設定
・オレ専用RSS作成
・メール送信(※sendmailの設定が必要)

---------まだ---------
・アカウント登録
・アカウント削除

メールの送信さえ出来れば後は簡単です。もうちょっとだ。
ところで、メールアドレス変更処理はやっぱり直さないとダメでした。

【設計】ブログを簡単に見るヤツ8

やっとメールサーバの設定出来ました。自宅サーバーでは、複数のドメインを扱ってるので、
メールヘッダに出力される項目についても、注意してます。

今回は、Receivedヘッダのところでつまづいてました。
unknownとか
localhostとか・・・

ちょっと、怪しい内容になってたので。
久々にRFCに目を通しました(汗
しかも和訳されてなくて。
ちなみに、確認したのは主に「RFC4021」です。

ということで、ドメインの取得は目の前です。ドメインなににしようかしら♪

では・・・アカウント登録処理を考えます。

1.アカウント登録画面からメールアドレスとパスワードを入力。

2.メールアドレスがすでに登録されていないか確認。 → 登録されている場合は、登録済のエラー。

3.仮登録テーブルに、「メールアドレス・日時・トークン」を追加。

4.既に仮登録テーブルにメールアドレスが登録されている場合は、上書き。

5.仮登録テーブルから日時が24時間経過しているものを削除。

6.メールアドレス宛てに仮登録メールを送信。本登録用のURLを記載。(token=XXXXXXXXXXXXXXXXXXXXXXXXXX)

7.本登録URLから、ワンタイムトークンを取得。ワンタイムトークンが仮登録テーブルに登録済か確認。

8.登録されていない場合は、無効なアクセスとしてエラー。

9.登録されている場合は、登録完了画面を表示する。(ログイン用のフォーム付き)


こんなカンジかな?たぶん・・・あれ?メールアドレスの変更処理ってどうなってたかな。。。
アドレス変更したら、変更メール送信するべきだよな。

ちょっと見てみよっと。

【コーディング】ブログを簡単に見るヤツ9

オレ専用RSS作成処理です。

今回長くなったので(200行程度)、コードはドメイン取ってから公開にします。
ちなみに、全コード公開する予定です。

必要なパラメータ
なし
cronに登録して定時刻になったら動かす。
(登録例) パスは、適当なので夜露死苦。この例だと毎日1時に動きます。
0 1 * * * /usr/share/rss.php

処理の流れ
1.ユーザ一覧をDBから取得。
使用するSQL
select ID, NAME, MYRSS, MAIL, MAILFLAG, MAILTIME from tbl_user

1.DOMDocumentオブジェクトを作成。

2.rssノードを作成。

3.channelノードを作成。

4.必須項目をchannelノードに追加。

5.ユーザーが登録しているRSS一覧を取得。
使用するSQL
select ID, RSSID, RSSURL from tbl_rss where ID = ?
$stmt->bind_param("d", $user['ID']);

6.XML_RSSオブジェクト作成。 new XML_RSS($rss['RSSURL'])

7.一個目の記事itemからノードを作成する。

8.itemノードをchannelノードに追加。

9.5~7を登録数分繰り返す。

10.channelノードをrssノードに追加する。

11.rssノードをDOMDocument追加する。

12.rsses/$NAME.rssが存在するか確認。 → 存在する場合は、削除。

13.RSSをrsses/$NAME.rssにファイル出力。

---------出来た---------
・ログイン
・ログインチェック
・RSS登録
・RSS解除
・ログアウト
・メール送信フラグ設定
・メールアドレス変更/登録
・メール送信時間設定
・オレ専用RSS作成

---------まだ---------
・アカウント登録
・アカウント削除
・メール送信(※sendmailの設定が必要)


後は、メールですな。。。

【設計】ブログを簡単に見るヤツ7

前回の記事で、RSSの出力する方法が解ったので、【オレ専用RSS】の処理の流れを考えます~。

まず、必須なのが、
rss version="2.0"
→channel
→→title $NAME専用RSS
→→link http://XXXXXXXXXXXXXX.com 【ブログを簡単に見るヤツ】トップへのURL
→→description 【ブログを簡単に見るヤツ】って素晴らしいね
→→language  ja
→→atom:link http://XXXXXXXXXXXXXX.com/rsses/$NAME.rss

後は、記事毎のitemノード。
itemノードは、登録したRSSの最新だけを追加することにしよう。
そうしないと、登録したRSSの数に比例してでかくなっちゃうので。んー全部追加だとよくないよなぁ・・・
またいい方法あれば考えます。


XMLを出力する

XMLを出力するコードです。

XMLとDOMの説明は、気が向いた時にでもしてみます。
でも簡単に少しだけ。

XML・・・データを構造化して記述するための言語。
DOM・・・XMLを操作するための機能/処理

//DOMDocumentオブジェクト
$doc = new DOMDocument("1.0", "utf-8");
$doc->formatOutput = true;

//ルートノードの作成
$root = $doc->createElement("rss");
//ルートノードにversion属性を設定
$root->setAttribute("version", "2.0");

//チャンネルノードの作成
$channel = $doc->createElement("channel");

//タイトルノードの作成
$title = $doc->createElement("title");
//チャンネルノードにテキストノードを追加
$title->appendChild($doc->createTextNode("たいとる"));
$channel->appendChild($title);

//リンクノードの作成
$link = $doc->createElement("link");
//リンクノードにテキストノードを追加
$link->appendChild($doc->createTextNode("りんく"));
$channel->appendChild($link);

//デスクリプションノードの作成
$description = $doc->createElement("description");
//デスクリプションノードにテキストノードを追加
$description->appendChild($doc->createTextNode("ですくりぷちょん"));
$channel->appendChild($description);

//ラングエッジノードの作成
$language = $doc->createElement("language");
//ラングエッジノードにテキストノードを追加
$language->appendChild($doc->createTextNode("らんぐえじ"));
$channel->appendChild($language);

//ルートノードにチャンネルノードを追加
$root->appendChild($channel);

//DOMDocumentにルートノードを追加
$doc->appendChild($root);

//作成したXMLをファイルに出力する
$doc->save("test.xml");



出力結果
xml version="1.0" encoding="utf-8"
rss version="2.0"
channel
titleたいとる/title
linkりんく/link
descriptionですくりぷちょん/description
languageらんぐえじ/language
/channel
/rss

アメブロでタグ書けないから、見づらいですよね。

これで、出力出来るので後は、マージする処理だ。