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や、サーバー本体の設定からメールのポートが閉じられていないか確認しましょう。

参考

以下のサイトを参考にさせていただきました。