携帯で空メールを投稿して会員登録するシステムはずいぶんと普及して当たり前のようになりました。また、mixiやブログなど多くのソーシャルネットワーク系のサービスでは写メール送信で画像付き日記をアップしたり、といったことがもはや主流です。 そこで、現在進行中のプロジェクトで写真を添付してコンテンツをアップするシステムを作っているのですが、どうもうまくいかず(サンプルプログラムなどそのまま使っても)、ドツボにハマってしまったので、そのあたり、どのようにしてきたか、メモをしておこうと思います。 空メール受付システムはレンサバでは難しいものでしたが、980円で使える安価なさくらのVPSのようなサービスが普及すると、個人でもそういったサイトを創ることがずいぶんと増えそうな気がしています。
前提
- さくらのVPSに申込み、本日現在でのデフォルトのCentOS5.4(64bit版)を動かしていること。
- PHPは5.2.14を入れて、PEARのMail、mimeDecode.phpがインストールされていること
- メールサーバが稼働していること。ここではPostfixを採用してデフォルトのsendmailから切り替えて使用しているいる。
ここまでの流れは他のサイトなどを参考にしても進められると思うので、いくつか参考にして進めていただくと良いと思います。 CentOS + Pear mail mime + PHP + postfix + シリアル通信プログラム = ? – とあるころねの生存報告 上記記事の前半を見ていただければ、手順書としては良いかと思います。 ここまでの流れやサンプルソースなどはだいたいどの参考書籍でもサイトでも似たようなものなのですが、どうしても動かずハマっていました。
修正したポイント
携帯の空メール機能を実装 « kawama.jpのソース参考にさせてもらいました。 このサンプルソースでは所定のアドレスに空メールを送ると、自動的にそのメールアドレス情報を含んだURLを生成して、携帯へ返信します。 ソースはざっとこんな感じにしています。
#!/usr/local/bin/php -q
<?php
//PEARのライブラリ読み込み
require_once(‘/usr/share/pear/Mail/mimeDecode.php’);
//メールソースを標準入力から読み込み
$source = file_get_contents(“php://stdin”);
if(!$source)
{
echo “fail!n”;
exit();
}
//メール解析
$params[‘include_bodies’] = true;
$params[‘decode_bodies’] = true;
$params[‘decode_headers’] = true;
$decoder = new Mail_mimeDecode($source);
$structure = $decoder->decode($params);
$from = mb_convert_encoding(mb_decode_mimeheader($structure->headers[‘from’]), mb_internal_encoding(), “auto”);
if( preg_match( ‘/<([^>]+)>$/’, $from, $regs )){ $from=$regs[1]; }
$from = strtolower($from);
//会員登録用URL
$body = “https://hoge.com/user_regist.php?mail=” . rawurlencode($from);
//メール返信
mb_internal_encoding(“utf-8”);
mb_language(“japanese”);
mb_send_mail($from, “empty_mail”, $body, “From: ore@oreore.net“);
?>
ドツボにハマった原因の一つが、PEARのパスをフルパスで指定する必要があったことです。このあたりの情報は下記サイトが詳しいです。
次に、メールのエイリアスを編集する部分です。
regist: “| /usr/bin/php /var/www/html/empty_mail_regist.php”
ここもsendmailとpostfixでは指定方法の種類が違うとか諸説あったのですが、最終的にこれで動きました。ググる中でもいろんな説があったので、他の原因を調べるのと同時に翻弄され続けてきたものです。
登録用URLは単純にメールアドレスをURLエンコードしてパラメータとして渡しているので、PHPで会員登録システムを作り慣れている方であれば、すぐに会員登録システムは作れてしまうでしょう。
次は画像アップロードのほうにチャレンジしてみたいと思います。
コメント