PHPで日本語メールを送信するまでの足跡

Mac OS X 10.5 にXAMPP for Mac 1.7.3をインストール。GmailのSMTPサーバからPHPのmb_send_mail関数をつかって日本語メールを送ろう、という試みについての報告。
先日、図書館からオライリーの"Head First PHP&MySQL"という本を借りた。この本は、書店でよく見るコンピュータ技術書が持っていない親近感を持っている。小難しい技術についても、おもしろおかしく紹介してくれるので、読んでいて楽しめるし飽きない。もし、この本に対しての他のユーザーの声が聞きたいならば、ぜひAmazonのレビューを見てみてほしい。

クリックでAmazonへ飛ぶ!

本文を読む前の支度

わたしの環境を書いておこう。
  • Mac OS X 10.5
  • XAMPP for MAC 1.7.3
  • Head First PHP&MySQL
なかなかいい本なのだが第一章、UFOにさらわれた飼い犬のファングを探すお話、"さらわれたファングについての情報を集めるために、入力フォームつきWebサイトをつくる"ところで、そのフォームの内容をメールで送信しようとしてもうまく送信できなかった。使ったサーバーはGmailのSMTPサーバー。なぜだらう?と本をめくる。本の付録iiには日本向けに、XAMPPのインストール手順が紹介されていた。XAMPPとはWebアプリケーションをつくるのに必要なソフトがまとまったものだ。
  1. Apache:httpサーバ
  2. PHP:サーバ側で処理をするスクリプト
  3. MySQL:データベース管理システム
  4. などなど
私はこのXAMPPをMac OS Xにインストールしてあった。そしてメール送信設定は本を参考に、自分の環境にあわせてphp.iniファイルの中に書き込んだ。こんな感じに、
[mail function]
; For Win32 only.
SMTP = smtp.gmail.com
smtp_port = 587

; For Win32 only.
sendmail_from = 自分のアドレス@gmail.com

; For Unix only.  You may supply arguments as well (default: "sendmail -t -i").
;sendmail_path =
しかしここで気づく。この設定にはあれが足りないことに。なにか?それは、Gmailのサーバを使う時に必要となる、認証(ログイン)用パスワードだ。この設定ではそれが抜けていた。しかし、どこにパスワードを設定すればよいのだらうか?私はPHPなんて初めてなので、知識はまったくない。そこで、PHPがどのようにメールを送信するのかを調べた。

結果はこうだ

1、Webサイトの送信ボタンをクリック

2、PHPスクリプトがページとメールを作る

3、PHPがメール送信プログラムにメールを渡す

4メール送信プログラムがSMTPサーバに接続しメールを送信

5、メール送信完了!
どうやらあの設定(php.iniの設定)は、チャートでいうをするための設定のようだ。Gmailへのログインはメール送信プログラムが行うらしい(本ではこの部分に触れていない)。ということは、メール送信プログラムにGmailのパスワードを教えてあげれば、GmailのSMTPサーバに勝手にログインして、PHPから受け取ったメールを送信してくれることだらう!

善は急げ

気になったらググる。メール送信プログラムについて調べた。どうやらMTA(Mail Transfer Agent:メール転送エージェント)と呼ぶらしい。sendmailqmailpostfixという3つのMTAが有名とのこと。で、Mac OS Xにはpostfixがプリインストールされているらしく、PHPはこのpostfixにメールを渡しているようだった。そのpostfixはMacの中の"/etc/postfix/"という場所にいることもわかった。

今から行うミッションはこうだ。postfixというMTAにGmailのパスワードを教える。それだけで、メールが送信できるようになるはずだ!
・参考サイト:RIVERTURNブログのアーカイブ
* この参考サイトはとても簡潔にまとめられているので、このブログを読むのに飽きたら少しお邪魔してみるといいかもしれない。

ターミナル

Finderで、commandキーshiftキーgキーを同時に押す(もしくはメニューの"移動>フォルダへ移動"をクリック)。"/etc/postfix/"と入力しreturnキー。表示された場所こそがpostfixの中枢だ。今回はターミナルを利用して設定しようと思う。 ターミナルに次のコードを打ち込みreturnキーを押す。
sudo vi /etc/postfix/sasl_passwd
これでGmailのパスワードを格納するファイルが作成される。画面が変わり編集できるようになる。returnキーを押し、下の方にINSERTと表示されたのを確認したら次のコードを埋め込む。
smtp.gmail.com:587 自分のアドレス@gmail.com:パスワード
自分のアドレスとGmailのパスワードをコロン(:)で区切って入力。 入力し終えたらescキーを押して次のコマンドを入力。
:wq
保存コマンドだ。これでログインに必要な情報(ファイル名:sasl_passwd)は保存された。では、次のコードを使って設定を有効可しよう。
sudo postmap /etc/postfix/sasl_passwd
次にpostfix本体に、"Gmailは認証が必要なサーバーだからさっき作ったsasl_passwdというファイル中にあるパスワードを使ってログインするように"と伝える。その伝言はmain.cfというファイルに記せば良いようだ。
sudo vi /etc/postfix/main.cf
こうしてmain.cfを編集モードにする。カーソルをファイルの一番下まで持って行き、そして改行。ファイルの1番下に次のコードを追記する。
# Minimum Postfix-specific configurations.
mydomain_fallback = localhost
mail_owner = _postfix
setgid_group = _postdrop
relayhost=smtp.gmail.com:587

# Enable SASL authentication in the Postfix SMTP client.
smtp_sasl_auth_enable=yes
smtp_sasl_password_maps=hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options=

# Enable Transport Layer Security (TLS), i.e. SSL.
smtp_use_tls=yes
smtp_tls_security_level=encrypt
tls_random_source=dev:/dev/urandom
そして保存。保存は先程と同じで、escキーからの:wqだ。さぁ、伝言は伝えた。postfixはgmailにログインしてくれるはずだ。設定は完了!postfixをスタートさせる。
sudo postfix start
これといって怪しげな警告やエラー文が出力されていなければ次のコードを入力。
sudo postfix reload
postfix更新完了。試しにメールを送信したいなら次のコードで送信しよう。
date | mail -s test 自分のアドレス@gmail.com
メーラを開いてメールを受信。testって件名のメールが届いていれば大成功だ!

メールが届かないときは…

もし、いくら待ってもメールが届かない時は、次のコマンドを入力してキュー(送信待ちメール)やログ(エラーや警告などの記録)を確認。メール送信を妨げている問題が表示されるかも。
-mailq
もしくは
sudo postfix check
mail queue is emptyなら送信待ちはない。正常なら特に文は出力されない。もしそれ以外の文が出力されたら、その文が意味している間違いを直す。もしくは、送信待ちのメールが悪さをしないように、次のコマンドできれいさっぱりリフレッシュしておく。
sudo postsuper -d ALL
メールが届いたなら、MTAの設定は大成功!これで本に沿ってプログラミングを楽しむことが出来るようになった。
あ、せっかくだからもうひとつ。まだ設定する気力が少しでも残っているなら、次の設定をしておくことをオススメする。なぜなら次の設定をするだけで、postfixがMacの起動と同時に勝手にスタートしてくれるようになるからだ。この設定をサボると、Macの再起動後にいちいちsudo postfix startコマンドでスタートさせなくてはならなくなる。
sudo vi /System/Library/LaunchDaemons/org.postfix.master.plist
編集モードになったら</dict>という文字列を見つける。その文字列の前に次のコードを入力する。
<key>RunAtLoad</key>
<true/>
これでpostfixは自動的に起動するようになった!
ちなみに、PHPのメール送信用関数にはmb_send_mail()関数を使っている。これは英文メールのみに対応しているmail関数の拡張版で、マルチバイト文字=日本語に対応している(その証拠にmbはマルチバイトの頭文字!)。しかし文字コードをしっかり決めておかないと(この場合UTF-8)恐ろしい文字化けが襲ってくる。私は身をもって体験してしまった。文字化けホラー好きでない限り、しっかり文字コードを決めてからメールを送ろう。決め方は本の付録iiiにしっかり載っている。
- 報告終了 -
間違いや足りない手順がある場合は連絡してもらえると助かります。
8043129023395844538 http://www.storange.jp/2012/01/php.html http://www.storange.jp/2012/01/php.html PHPで日本語メールを送信するまでの足跡 2012-01-20T01:00:00+09:00 http://www.storange.jp/2012/01/php.html Hideyuki Tabata 200 200 72 72