仕事で「携帯メールで更新」という要望があったので、このブログをメールで更新ができるようにチャレンジしてみました。
結構難しいかなと思ったんですが、PEARの
Mail_mimeDecodeと
Net_POP3を利用すれば案外簡単に出来そうだということがいくつかのサイトでわかったのでやってみました。
参考サイト
PEAR::Net_POP3を使ってPOP3サーバにアクセスしよう
stdinからのメール処理でメール情報を取得する
PEAR で簡易メール受信
PEAR::Net_POP3
上記のサイトを参考にして出来たメール内容を解析するソースがこちら。
一応添付画像もアップロードしてくれるようになっているのですが、僕の携帯が古いので大きなファイルをメールで送信できないんで、あんまり使ってません。
// インスタンス作成
$pop3 = new Net_POP3();
// 接続
$res = $pop3->connect ("domain.name", 110);
// ログイン ( APOP )
$res = $pop3->login( "mail_acount", "password", true);
// 更新件数取得
$numMsg = $pop3->numMsg();
for ($i=1; $i<=$numMsg; $i++) {
//メールをパースする
$decoder = new Mail_mimeDecode($pop3->getMsg($i));
$params['include_bodies'] = true; //ボディを解析する
$params['decode_bodies'] = true; //ボディをコード変換する
$params['decode_headers'] = true; //ヘッダをコード変換する
$structure = $decoder->decode($params);
//送信者のメールアドレスを抽出
$mailaddress = $structure->headers['from'];
$mailaddress = addslashes($mailaddress);
$mailaddress = str_replace('"','',$mailaddress);
//署名付きの場合の処理を追加
preg_match("/<.*>/", $mailaddress, $str);
if ($str[0]!="") {
$str = substr($str[0], 1, strlen($str[0])-2);
$mailaddress = $str;
}
// 日付を取得
$date = date("Y-m-d", strtotime($structure->headers['date']));
// 件名を取得
$subject = $structure->headers['subject'];
switch(strtolower($structure->ctype_primary)){
// シングルパート(テキストのみ)
case "text":
$body = $structure->body;
break;
// マルチパート(画像付き)
case "multipart":
foreach($structure->parts as $part){
switch(strtolower($part->ctype_primary)){
// テキスト
case "text":
$body = $part->body;
break;
// 画像
case "image":
//画像の拡張子を取得する(小文字に変換
$type = strtolower($part->ctype_secondary);
//JPEGチェック(GIFやPNG形式の画像チェックなども可
if($type != "jpeg" and $type != "jpg"){
continue;
}
//添付内容をファイルに保存
$fp = fopen("image/tmp/".uniqid("tmp_diary_").".".$type, "w");
$length = strlen($part->body);
fwrite($fp, $part->body, $length);
fclose($fp);
break;
}
}
break;
default:
$body = "";
$i++;
}
// データを取得したら削除
$pop3->deleteMsg($i);
}
// 接続解除
$pop3->disconnect();</pre>
いやあ、ライブラリにおんぶに抱っこのソースですな。
今日は久しぶりに早く帰れたので、さっさと寝たいと思います。