レンタルサーバー(さくらインターネット)で受信したメールの添付ファイルをサーバーに保存する
レンタルサーバー(さくらインターネット)で受信したメールの添付ファイルを保存する方法を調べてみた。ちょっと大変だったけど、なんとかQdmailReceiverを使って、受信したメールを処理することができたのでメモ。
目次
準備
まず、さくらインターネットのレンタルサーバーのコントロールパネル(https://secure.sakura.ad.jp/rscontrol/)からログインし、ログインしたら、「メールに関する設定」「メールアドレスの管理」から、受信するメールアドレスの追加(今回はtestとする)を行う。
test@●●●.sakura.ne.jp(●●●はさくらのアカウント)
次に、「メールアドレス毎の設定」から、作成したメールアドレスの「ウェブメール」を開き、「電子メールの転送」で、適当なアドレスへの転送を設定し、その設定を削除する。
そして、FTPでサーバーに接続する。自分のディレクトリにメールを処理するPHPを入れるmail_hookと、添付ファイルを保存するmail_attachの2つのディレクトリを作成する。また、さっき作成したメールアドレスのディレクトリ(/home/●●●/MailBox/test)の中に、空の.mailfilterファイルができているので、そのファイルを開いて
cc "| /home/●●●/mail_hook/test.php"
を追記する。
ここまでで、受信用のメールアドレスと、受信したメールを指定したPHPファイル(test.php)に送る設定が完了。
受信メールからPHPが起動するか確認
下のPHPファイルを作成し、さっき作成した/home/●●●/mail_hook/のディレクトリにFTPでアップロードする。
#!/usr/local/bin/php-cgi <?php $content = null; $fp=fopen("php://stdin",'r') or die('File Open Error'); $fpw=fopen("mail.txt",'w'); while( !feof($fp) ){ $content .= fgets( $fp ,1024); } fputs($fpw,$content); ?>
注意点として、
・test.phpのエンコードはeucに、改行コードはLFにする。
・ファイルパーミッションは744に設定する。
ここまでできたら、テストメールを送ってみる。うまく行けば、mail_hookの中に「mail.txt」ができるはず。
QdmailReceiverのインストールとコードの修正
メールの解析にはQdmailReceiverを利用する。
QdmailReceiver Multibyte mail decoder & POP Client
http://hal456.net/qdmail_rec/
元の作者の方の開発(http://hal456.net)は止まっているが、引き継いでいる方がGitHubで公開しているのでこれを利用する。
- Qdmailシリーズのgithub版です。PHP5.4対応(https://github.com/ftngrn/qdmail)
- QdmailをPHP7.0に対応させる(https://gist.github.com/YukiYamashina/2c53e0c43bf035ffc8d2bf0dcfbf7b29)
まず必要となるphpファイルqdmail_receiver.phpは、Qdmailシリーズのgithub版です。PHP5.4対応からダウンロードする。qdmail_receiver.phpは、PHP5.4までしか対応していないので、これをPHP7.1に対応させるためにQdmailをPHP7.0に対応させるのREADME.mdを参考にしてコードを少し修正。
class QdDecode extends QdDecodeBase{ var $name ='QdDecode'; function __construct( $param = null ){ // function QdDecodeを、__constructに修正 if( !is_null( $param ) ){ $param = func_get_args(); } parent::__construct( $param ); }
781行目を修正。
class QdPop extends QdPopBase{ var $name = 'QdPop'; function __construct( $param = null ){ // function QdPopを、__constructに修正 parent::__construct( $param ); } }
1210行目を修正。
static function & getInstance( $class_name , $param = null){ $version = (float) PHP_VERSION ; if( 5 > $version ){ $obj = new $class_name($param); // &を削除 }else{ $obj = new $class_name($param); } return $obj; }
1311行目を修正。
修正したら、「/home/●●●/mail_hook/」にFTPでアップロードする。
qdmail_receiver.phpの動作確認
http://hal456.net/qdmail_rec/stdin_baseを参考に、test.phpを書き換えて、qdmail_receiver.phpの動作確認をする。
#!/usr/local/bin/php-cgi <?php include_once('qdmail_receiver.php'); qd_receive_mail( 'stdin' ); //メール件名 $subject = qd_receive_mail( 'header' , array('subject','name') ); //メール本文の取得 $body = qd_receive_mail( 'body' ); $fp = fopen('sample.txt', 'w'); fwrite($fp, 'メール件名:'.$subject.' メール本文:'.$body ); fclose($fp); ?>
修正したtest.phpをアップロードして、準備したアドレスにメールを送る。うまく行けば、送ったメールの件名と本文をsample.txtに書き出してくれるはず。
添付ファイルの保存
http://hal456.net/qdmail_rec/function_baseを参考に、メールに添付されたファイルを保存するように、test.phpを書き換える。
#!/usr/local/bin/php-cgi <?php include_once('qdmail_receiver.php'); qd_receive_mail( 'stdin' ); //添付ファイルの取得 $attach = qd_receive_mail( 'attach' ); foreach($attach as $att){ $fp=fopen('../mail_attach/'.$att['filename_safe'],'w'); fputs($fp,$att['value']); fclose($fp); } ?>
修正したtest.phpをアップロードして、準備したアドレスにファイルを添付したメールを送る。添付ファイルが「mail_attach」に保存されていれば成功!! QdmailReceiverを使えば、意外と簡単にできるもんやね!
その他雑感
レンタルサーバーのPHPバージョンを7.1にしていたので、手間が増えてしまった。5.6のままだったら、qdmailReceiver.phpのコードは修正なしでも大丈夫だったかも。
参考リンク
- http://www.cpa-lab.com/tech/0143
- http://www.y-tti.com/blog/2007/06/mailfilter.php
- http://hal456.net/qdmail/
- http://hal456.net/qdmail_rec/stdin_base
- http://hal456.net/qdmail_rec/function_base
- https://github.com/ftngrn/qdmail
- https://gist.github.com/YukiYamashina/2c53e0c43bf035ffc8d2bf0dcfbf7b29
- https://dbweb.0258.net/wiki.cgi?page=PHP%A5%E1%A1%BC%A5%EB%BC%F5%BF%AE%A5%E9%A5%A4%A5%D6%A5%E9%A5%EA%A1%D6qdmail%5Freceiver%A1%D7