PHPのメール送信を考える(前編)

先日WordPressプラグイン「ContactForm7 」と「WP Mail SMTP」を使ったメールフォームを作りました。
「WP Mail SMTP」には送信元アドレスやメーラーSMTP ホストなどを設定できますが、このプラグインを使わなくても「ContactForm7 」でメールフォームを作って送信できたはず、一体何が起こっているのだろう...と気になったので調べました。

メールは奥が深い

初心者(?)がイチから調べるにはあまりにも必要な知識が多すぎる! 気になることが後から後から出てきていつも以上に収拾がつかなさそうなので、ひとまずメール送信機能を作ってみます。

環境

  • MacMAMP(ローカル環境)でメールフォームを作る
  • SMTPサーバーはMAMP内に入っていれば(?)それを使って、なければGmailを使う
  • Gmailが送信側で絡むかもしれないので、送信先アドレスはyahooにする

↑書いていることも正しいのか今の時点では怪しいですが、これでスタートします。

フォームの作り方

まずはプラグインなしのPHPでメールフォームの作り方を学びます。

お問い合わせフォームを作る | GRAYCODE PHPプログラミング

きっとこちらが一般的な作り方なのだろうと信じます。

要点は

  • form要素をaction="" と空の値の属性を入れることで、1つのPHPファイル(index.php)で入力画面、確認画面、送信完了画面を用意する
  • 入力・確認はそれぞれPOST通信でデータを送る。
  • 確認・送信ボタンにそれぞれname属性を付け、その値($_POST['name名'])で入力・確認・送信完了画面の判別をする
  • メール送信は mb_send_mail関数を使う

です。

今回は入力画面、確認画面や見た目は考えず、送信だけできるページを作ります。

index.phpの一部

<?php if(empty($_POST["btn_submit"])): ?>
  <h1>ボタンを押すと送信</h1>
  <form method="post" action="">
      <input type="submit" name="btn_submit" value="送信">
  </form>
<?php else: ?>
  <h1>送信!</h1>
  <?php mySendMail(); ?>
<?php endif; ?>

<?php
function mySendMail() {
  // 変数の設定
  $to = "xxx@yahoo.co.jp";
  $subject = "メール送信のテスト";
  $text = "メール本文です。";

  // メール送信
  mb_send_mail($to, $subject, $text);
}
?>

f:id:yokoyoko_115:20200916132118p:plain
表側はとてもかんたんなつくり

送信してみる

送信先のメールアドレスが間違っていないか、いつも以上に確認して送信ボタンを押すと...

なんと送受信ができた!ダメ元だったのに。

yahooのメールアドレス宛に送信すると迷惑メール扱いすらされず受信箱に入っていました。
gmailのメールアドレスでは迷惑メールになっていました)

index.php では設定していなかった送信者情報がメールに入っていたので、送信時にどこかで設定された値が使われたと考えられます。

mb_send_mail関数について

mb_send_mail関数は、日本語などマルチバイトの文字をメール送信する時に使う関数で、中で mail関数を呼んでいます。

mb_send_mail( $to, $subject, $text, $header, $parameter);

mb_send_mail関数の引数 $header (省略できる)には、メールヘッダーに追加する送信者情報を入れる部分があります

送ったメールがスパム判定(迷惑メール)されないためのヘッダー設定 | GRAYCODE PHPプログラミング

送信者情報(抜粋)

・Content-Type – メール形式 ・Return-Path – 送信先メールアドレスが受け取り不可の場合に、エラー通知のいくメールアドレス
・From – 送信者の名前(または組織名)とメールアドレス
・Sender – 送信者の名前(または組織名)とメールアドレス
・Reply-To – 受け取った人に表示される返信の宛先
・Organization – 送信者名(または組織名)
・X-Sender – 送信者のメールアドレス
・X-Priority – メールの重要度を表す

これらの情報は、改行コードを入れながら一つの文字列にします。

MAMPのどこかで送信者情報が設定されているはずなので調べました。

PHPのメール送信に関する設定値

MAMPのスタートページから「TOOLS > PHOINFO」のページを見るとメール送信に関連する設定がありました。

Core(一部抜粋) PHP Version 7.4.2

Directive Local Value Master Value
sendmail_from no value no value
sendmail_path /usr/sbin/sendmail -t -i /usr/sbin/sendmail -t -i
SMTP localhost localhost
smtp_port 25 25

このページは phpinfo() を実行した結果を表示させたページです。
phpinfo() では、php.ini(拡張子の読みは「イニ」が多そう)ファイルなどで設定した、PHPの設定値を見ることができます。
設定値の変更はphp.iniだけではなく、Apache側からや.htaccessからもできます。優先順位があるそうです。

ちなみに読み込んでいるphp.iniの場所は、phpinfoの「Loaded Configuration File」にあります。

phpinfo関数による設定内容の確認 | PHPインストールと初期設定

php.iniファイルの確認と修正 | XAMPPの使い方

sendmailとは

phpinfoにもあった sendmail についてです。
mb_send_mail関数では内部でsendmailコマンドが実行されます。
sendmail」というのはメール転送エージェント(MTA)というメール配信用プログラムです。「postfix」というのも同じくMTAです。

メール転送エージェント:
https://wa3.i-3-i.info/word11134.html

sendmail コマンドの実行は、phpinfoにある「sendmail_path」の値を見て行われるのだと思います。

途中結果

ということは、今のところ

SMTPlocalhost ←ローカル環境にSMTPサーバがある?
SMTPのポート番号:25
送信者情報:sendmail の設定値?

と推測しました。

このsendmailpostfixの設定、何やら難しそうです...。

次回でsendmailについて調べられたらいいと思います。

挫折せずに後編を書けるといいです...!