もう迷惑メールに入らない!SMTPを使ってPHPでメールを送信する方法


ホームページを作ったら、必ずと言っていいほど設置するのがフォームですね。
問い合わせや資料請求、イベントへの申し込み、採用応募等、ホームページからフォームを使ってメールを送信してもらうことはコンバージョンとしても重要な位置づけです。
PHPでメールフォームを作成する場合の一般的な方法としては、mail()関数などのWEBサーバーのsendmailの機能を使ったメール送信ではないでしょうか。
ただ、その関数の使い方を見ればわかる通り、sendmailを使ったメール送信は非常に簡易的なもので、受信するサーバーにとってはあまり信頼できるものではありません
また、sendmail自体が使えないサーバーもあります。
手間にはなりますが、可能であればSMTPを利用したメールの送信をできると良いでしょう。
今回は、SMTPを使ったメールの送信について紹介したいと思います。
SMTPって何?という人も、ここを読んでSMTP送信にトライしてみましょう。

sendmailとSMTP

sendmail

PHPを勉強してメールフォームを作るときに、初めに学ぶのがWEBサーバーのsendmailを利用したmail()関数によるメールの送信プログラムでしょう。
mail()関数はホームページがアップロードされているWEBサーバーからメールを送るため、メールサーバーのアカウントなどが必要なく、以下のような関数1つで好きなアドレスでメールが送れてしまいます

mail(
    string $to,
    string $subject,
    string $message,
    array|string $additional_headers = [],
    string $additional_params = ""
): bool

簡単であるがゆえに問題点も多くあります。
認証なしに関数一つで好きなメールアドレスを装ってメールを送れるということは、その信頼性は低いということですね。
そのため、sendmailで送信されたメールは迷惑メールに分類されやすいという特徴があります。

SMTP

一方のSMTPを使った送信では、sendmailのように好き勝手にメールを送れるのではなく、メールサーバーを利用して認証を必要としています
メールサーバーで設定された情報で認証してメールを送るので、sendmailよりも信頼性が高く、受信側でも迷惑メールに入りにくいメールとなります。
具体的には、事前に次のような認証パラメータの設定が必要になります。

phpmailer = new PHPMailer(true);
phpmailer->isSMTP();
phpmailer->Host       = $host;
phpmailer->SMTPAuth   = true;
phpmailer->Username   = $username;
phpmailer->Password   = $password;
phpmailer->SMTPSecure = $SMTPSecure;
phpmailer->Port       = $port;

イメージとしての解説としてとらえて欲しいのですが、
sendmailはホームページ自身がメール送信の機能を使ってメールを送るイメージで、SMTPはメールサーバーにメール送信を依頼してメールを送るイメージでしょうか。
SMTPを使用したメール送信では、その役割を完全に分離していますので、例えばローカルで動かしているPHPでもメールサーバーにメール送信を依頼することでメールを送ることができます
問い合わせフォームのテストはサーバーにアップしてからという人も多いと思いますが、ローカルでテストができると開発も進みますね。

SMTPを使ったメールの送信

プログラム

実際にSMTPを利用したメールの送信について紹介していきましょう。
SMTPを使ったPHPによるメール送信はいくつか方法がありますが、私が使っているのはPHPMailerというものです。
composerでライブラリをインストールする必要があるので、composerがわからない方はまずはcomposerを勉強してください。
残念ながら当サイトではcomposerについて解説したページが無いので、ググって調べてみましょう。

まずは、以下のコマンドでPHPMailerをインストールします。

composer require phpmailer/phpmailer

composerの動作ですが、インストールしたいフォルダに移動して上記のコマンドをたたくことで、そのフォルダのvendorフォルダ内にライブラリがインストールされます
例えば

/y-com.info/public_html

へ移動したところで、composerでインストールをすると、

/y-com.info/public_html/vendor/

にライブラリがインストールされます。
のちに、インストールしたPHPMailerを読み込むので、ここを覚えておきましょう。

では、実際にプログラムを書いてみましょう。

先ほどインストールしたPHPMailerを使用するための準備です。
vendorフォルダの階層は、先ほど少し説明した内容から調べましょう。

require './vendor/autoload.php';

// PHPMailerクラスを使用
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;


次に実際にメールを送る処理の認証などの設定です。
PHPMailerのインスタンスを作成して、ホストやアカウント、送信方法の設定などを行います。

$phpmailer = new PHPMailer(true);               // PHPMailerのインスタンスを作成。trueを渡すことでexceptionsが有効になります。
$phpmailer->isSMTP();                           // SMTPを使用してメールを送信する設定にします。
// $phpmailer->SMTPDebug = SMTP::DEBUG_LOWLEVEL;   // SMTPのデバッグ情報を出力するための設定。デバッグレベルは低いものに設定。
$phpmailer->SMTPAuth   = true;                  // SMTP認証を有効にします。
$phpmailer->Host       = 'xxx.example.com';     // SMTPサーバーのホスト名やIPアドレスを設定。
$phpmailer->SMTPSecure = 'tls';                 // セキュリティのためのプロトコルを設定('tls'または'ssl')。
$phpmailer->Port       = '587';                 // SMTPサーバーのポート番号を設定。通常は587(TLSの場合)や465(SSLの場合)。
$phpmailer->Username = 'your_email@example.com';// SMTP認証のためのユーザー名(通常はメールアドレス)を設定。
$phpmailer->Password = 'your_password';         // SMTP認証のためのパスワードを設定。

$phpmailer->SMTPDebug

はコメントアウトしていますが、こちらは処理内容を書き出してくれるので、デバッグ時に役立ちます。
指定する値もいろいろと用意されているので、調べてみてください。
運用時はコメントアウトしておくといいでしょう。

見てもらうとわかるように、ホスト名やユーザー名、パスワードを入れています。
メールソフトと同じように、その情報で認証できた場合にしか送信できないので信頼性があるんですね。

上記の設定ができたら、メールの送信元や送信先などの情報を入れましょう。

$phpmailer->CharSet = 'UTF-8';                  // メールの文字エンコーディングを'UTF-8'に設定します。
$phpmailer->setFrom('sender@example.com', '送信者の名前');      // 送信者のメールアドレスと名前を設定します。
$phpmailer->addAddress('receiver@example.com', '受信者の名前'); // 受信者のメールアドレスと名前を設定します。
$phpmailer->Subject = '件名';                   // メールの件名を設定します。
$phpmailer->Body    = '本文内容';               // メールの本文を設定します。

上記が代表的な設定です。
他にも

・返信先のメールアドレス
・CCメールアドレス
・BCCメールアドレス

などが設定できます。

事前処理と送信先など必要なことが設定し終わったので、あとはsend()で送るだけです。

$phpmailer->send();

上記のコードをまとめておきますので、コピペして使ってみましょう。

require './vendor/autoload.php';

// PHPMailerクラスを使用
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;

$phpmailer = new PHPMailer(true);               // PHPMailerのインスタンスを作成。trueを渡すことでexceptionsが有効になります。
$phpmailer->isSMTP();                           // SMTPを使用してメールを送信する設定にします。
// $phpmailer->SMTPDebug = SMTP::DEBUG_LOWLEVEL;   // SMTPのデバッグ情報を出力するための設定。デバッグレベルは低いものに設定。
$phpmailer->SMTPAuth   = true;                  // SMTP認証を有効にします。
$phpmailer->Host       = 'xxx.example.com';     // SMTPサーバーのホスト名やIPアドレスを設定。
$phpmailer->SMTPSecure = 'tls';                 // セキュリティのためのプロトコルを設定('tls'または'ssl')。
$phpmailer->Port       = '587';                 // SMTPサーバーのポート番号を設定。通常は587(TLSの場合)や465(SSLの場合)。
$phpmailer->Username = 'your_email@example.com';// SMTP認証のためのユーザー名(通常はメールアドレス)を設定。
$phpmailer->Password = 'your_password';         // SMTP認証のためのパスワードを設定。

$phpmailer->CharSet = 'UTF-8';                  // メールの文字エンコーディングを'UTF-8'に設定します。
$phpmailer->setFrom('sender@example.com', '送信者の名前');      // 送信者のメールアドレスと名前を設定します。
$phpmailer->addAddress('receiver@example.com', '受信者の名前'); // 受信者のメールアドレスと名前を設定します。
$phpmailer->Subject = '件名';                   // メールの件名を設定します。
$phpmailer->Body    = '本文内容';               // メールの本文を設定します。

$phpmailer->send();

こうやって見ると、設定が多いのでとても難しそうに思えますが、一つ一つは難しいものではないので誰でもできると思います。

今後の改善点

このように、SMTPでは実際のメールアカウントを利用してメールを送信するため、第三者がそのメールアドレスでメールを送ることはできません(ただ、メールアドレスの偽装のようなことはこれでもできちゃうのですが・・・)。
ただ、まだ問題はあります。
本来メールの設定情報というのは、メールを利用する本人以外には知らせてはいけないものです。
しかし、ソースコード上にそれらの設定情報が必要となり、パスワード等の情報を開発者に伝える必要があり、あまりよいことではないですよね。
そのために二段階認証を利用している場合の「アプリパスワード」やOAuth認証など、本来のメールアカウント情報を渡さずに設定をすることも可能です。
機会があれば、こちらについてもブログで書いていければと思います。

いかがだったでしょうか。
これまでシンプルなメール関数を使ってメールを送っていた人も多いと思います。
ただ、よくメール迷惑メールに入ってしまって困っていたという人も多いと思います。
SMTPを利用した方法だと明らかにメールの信頼性が上がるため、迷惑メールに入る確率も下がるでしょう。
sendmailに比べて多少の手間はかかりますが、それでも知ってしまえば難しくはありません。
安心してメールを届けるためには、SMTPで実装するようにしてみましょう。

[RelService] [Service]