レンタルサーバー(さくらインターネット)で受信したメールの添付ファイルをサーバーに保存する

2020年3月17日

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

まず必要となる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のコードは修正なしでも大丈夫だったかも。

参考リンク

Tipsphp

Posted by ucci1372