Ubuntu/PHPでメールを受信できるようにする方法
この記事では、サーバー(Ubuntu)で受信したメールをPHPのプログラムへ転送する方法と、その解析方法をご紹介します。
目次
main.cf / aliases の編集
vim ( vi ) でmain.cfを開きます。
$ sudo vim /etc/postfix/main.cf
次の行がもしコメントアウトされていたら、コメントを解除してください。
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
Postfixの再起動を行います。
$ sudo systemctl restart postfix
aliasesの編集をします。
$ sudo vim /etc/aliases
最終行に、次の内容を追記します。
{メールアドレスのユーザー名}: {メールアドレス名}, "|/usr/bin/php {PHPファイルまでのフルパス}"
例えばcontent@{ドメイン名}に送りたい場合次のようになります。
content: content, "|/usr/bin/php /var/www/html/example.com/execmail.php"
※phpのパスの前の「 | 」を忘れないように注意してください
設定を反映させます。
$ sudo newaliases
メールの解析ツールをインストール
composerをインストール
※既にcomposerがインストールされている方は読み飛ばしていただいて構いません。
まず依存関係のインストールを行います。
$ sudo apt update -y
$ sudo apt install curl php-cli php-mbstring git unzip
公式のコマンドより、composerをインストールします。
$ php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
$ php -r "if (hash_file('sha384', 'composer-setup.php') === 'e0012edf3e80b6978849f5eff0d4b4e4c79ff1609dd1e613307e16318854d24ae64f26d17af3ef0bf7cfb710ca74755a') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
$ php composer-setup.php
$ php -r "unlink('composer-setup.php');"
composerのインストール位置を変更し、どこからでも使えるようにします。
$ mv ./composer.phar $(dirname $(which php))/composer && chmod +x "$_"
最後に動作確認でバージョンが表示されていれば完了です。
$ composer --version
PHP Mime Mail Parserのインストール
依存関係をインストールします。
$ sudo apt install php-cli php-mailparse
composerでインストールします。
$ composer require php-mime-mail-parser/php-mime-mail-parser
動作確認で「mailparse」と表示されればOKです。
$ php -m | grep mailparse
サンプルコード
(先ほどaliasesで追加したパスのPHPファイルです。)
メールを受信したら解析した内容を特定のメールに送るサンプルコードです。
autoloadの箇所や送信先メールなどは適時変更してください。
<?php
$mail_content = file_get_contents("php://stdin");
if(!$mail_content){exit;}
require_once '/var/www/vendor/autoload.php';
$Parser = new PhpMimeMailParser\Parser();
$Parser->setText($mail_content);
$to = $Parser->getHeader('to'); // "test" <[email protected]>, "test2" <[email protected]>
$addressesTo = $Parser->getAddresses('to'); //Return an array : [[test, [email protected], false],[test2, [email protected], false]]
$from = $Parser->getHeader('from'); // "test" <[email protected]>
$addressesFrom = $Parser->getAddresses('from'); //Return an array : test, [email protected], false
$subject = $Parser->getHeader('subject');
$text = $Parser->getMessageBody('text');
$html = $Parser->getMessageBody('html');
$addressesTo=var_export($addressesTo,true);
$addressesFrom=var_export($addressesFrom,true);
mb_language("Japanese");mb_internal_encoding("UTF-8");
$mail="テストの会社 <[email protected]>";
$return_path="-f [email protected]";
$niti=date('Y/m/d');
$header_info="From: ".$mail." \r\nReturn-Path: [email protected] \r\nX-Priority: 1 \r\nContent-Type: text/html;charset=UTF-8\r\nX-Sender: ".$mail."\r\nOrganization: Certake\r\n";
$body = <<< EOM
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="ja">
<head>
<meta http-equiv="Content-Language" content="ja">
<meta http-equiv="Content-Style-Type" content="text/css">
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
</head>
<body style="background:#fff;padding:10px 0;">
<div style="margin:auto;width:100%;max-width:700px;height:auto;box-shadow: 0 0 8px gray;background:white;border:1px solid #999;padding:20px;box-sizing:border-box;">
メールの内容:<br>
<br>To:<br>{$to}
<br>addressesTo:<br>{$addressesTo}
<br>from:<br>{$from}
<br>addressesFrom:<br>{$addressesFrom}
<br>subject:<br>{$subject}
<br>text:<br>{$text}
<br>html:<br>{$html}
{生データ}<br>
<pre>{$mail_content}</pre>
</div>
</body>
</html>
EOM;
$body=mb_convert_encoding($body, "UTF-8", "auto");
mail('{メール送信先}','メール受信しました',$body,$header_info,$return_path);
メールが受信できない場合
考えられる原因として、ファイアーウォールが考えられます。
ufwや、サーバー本体の設定からメールのポートが閉じられていないか確認しましょう。
参考
以下のサイトを参考にさせていただきました。