レンタルサーバー(さくらインターネット)で受信したメールの添付ファイルをサーバーに保存する
レンタルサーバー(さくらインターネット)で受信したメールの添付ファイルを保存する方法を調べてみた。ちょっと大変だったけど、なんとか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


