るいすときのこの物語

オタクエンジニアの雑記

PHPでメール送信するには結局どれが最強なのか


PHPでメール送信するときは ・mb_send_mail ・Qdmail がよく使われる気がする。

mb_send_mail は SMTPサーバーを指定することは可能だけどSMTP認証ができません! Qdmailはもうライブラリが古い!

ということで PHPMailer を使ってみた。 https://github.com/Synchro/PHPMaile

SMTP認証

LOGIN, PLAIN, NTLM, CRAM-MD5 and Google's XOAUTH2 over SSL and TLS が使えます。Postfixの解説サイトってPLAIN or CRAM-MD5 が多い気がするので困ることはないと思います。 Google's XOAUTH2 ってなんなんでしょうか。

 

XOAUTH2

メールの送受信にパスワードなんていらない こちらに詳しく書かれていました。

新しく取得したGmailアカウントにおいて、これまでの一般的なメーラーではもはやメールの送受信はできません。いや、完全にできないわけではなく、とある設定を変更しないと使えないようになっています。その設定名ときたらなんと、

「安全性の低いアプリのアクセス」です。

メーラーを使うためにはこの設定を「オン」にしなければなりません。 なんとも精神衛生上よろしくない行為ですよね。

通常この設定は「オフ」になっていて、ユーザー名とパスワードで認証する従来のメーラーはアクセスできず、いわゆる”安全性の高い”アプリしかアクセスできません。

では安全性の高いアプリとはなんでしょうか? その答えはXOAUTH2認証を用いたメールアプリです。

らしいです。

PHPMailerでの使い方は公式Githubにあります。 https://github.com/PHPMailer/PHPMailer/wiki/Using-Gmail-with-XOAUTH2

 

 

DKIM

DKIMも使えます! SPFとはちょっと違いますがまぁスパム認定されにくくなります。

 

多くのオープンソースでも使われ  WordPress, Drupal, 1CRM, SugarCRM, Yii, Joomla! and many more らしいです。

CCやBccを使うことも想定されていた作りになっており、添付ファイルもパスを記述するだけです。

 

軽く使ってみた

<?php
require_once 'PHPMailer-master/PHPMailerAutoload.php';

if ($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {
    $name = htmlspecialchars($_POST['name']);
    $address = htmlspecialchars($_POST['address']);
    $naiyou = htmlspecialchars($_POST['naiyou']);
    $youken = htmlspecialchars($_POST['youken']);
    /* 送信内容 */
    $content = "名前: ${name} \r\n内容: ${naiyou}\r\n返信先: ${address}";
    $mailer = new PHPMailer();
    $mailer->IsSMTP();
    $mailer->Host = 'ssl://smtp.gmail.com:465';
    $mailer->SMTPAuth = TRUE;
    $mailer->Username = 'Gmail User name';
    $mailer->Password = 'Gmail User password';
    $mailer->From = 'From';
    $mailer->FromName = mb_encode_mimeheader(mb_convert_encoding("${youken}", "JIS", "UTF-8"));
    $mailer->Subject = mb_encode_mimeheader(mb_convert_encoding("${youken}", "JIS", "UTF-8"));
    $mailer->Body = mb_convert_encoding("${content}", "JIS", "UTF-8");
    $mailer->AddAddress('atesaki'); // 宛先
    if ($mailer->Send()) {
        header("Content-Type: text/plain; charset=UTF-8");
        print "情報の送信に成功しました。返信は48時間以内に行います。";
        exit;
    } else {
        header("HTTP/1.0 400 Bad Request");
        header("Content-Type: text/plain; charset=UTF-8");
        print "情報の送信に失敗しました。復旧するまで今しばらくお待ち下さい";
    }
} else {
    header("HTTP/1.0 400 Bad Request");
    header("Content-Type: text/plain; charset=UTF-8");
    print "情報の送信に失敗しました。復旧するまで今しばらくお待ち下さい";
}
?>

今回はSMTPサーバーにGoogleを使いました。 XOAUTH2を使っていないので安全性の低いアプリへのアクセスをONにしています。

いと便利です。