自宅サーバー(Debian)から、外部へメールを送信する。
システムのエラー発生等を、携帯電話へメールで送信する等に使える。
MTAには、exim4を使うとよいだろう。
MTAとはMail Transfer Agentの略で、メール転送エージェントである。
今回は、exim4とGmailを組み合わせることにする。
# Sendmailやqmail、Postfix等もあるが、exim4はDebianの標準のMTAなので、これを利用。
当然、Gmail(自宅サーバーから見ると外部)なので、自宅サーバーがインターネットに接続されている必要がある。
Gmailを使うので、ドメイン取得も不要。
今回は送信専用なので、固定IPである必要はない。
送信時にexim4がインターネット回線経由でGmailに接続し、Gmailがメール送信するイメージ。
以下、手順。
まず、Gmailのアカウントを取得する(無料)。
取得したメールアドレスとパスワードを忘れないように。
次に、Tera Term等を立ち上げ、sudoができる(権限の)user(※)で自宅サーバーにアクセス。
sudo aptitude install exim4
とすると、色々動くので、完了したら
dpkg-reconfigure exim4-config
とする。
青画面になるので、
・メール設定の一般的なタイプ ->スマートホストでメール送信: SMTP または fetchmail で受信する
・システムメール名 ->何でもよい(localhost等)
・入力側SMTP接続をリスンするIPアドレス ->127.0.0.1
・メールを受け取るその他の宛先 ->未入力
・メールをリレーするマシン ->未入力
・送出スマートホストのIPアドレスまたはホスト名 ->smtp.gmial.com::587 (←注意コロン2つ)
・送出するメールでローカルメール名を隠しますか? ->はい
・表示するローカルユーザのドメイン名 ->何でもよい
・DNSクエリの数を最小限に留めますか(ダイヤルオンデマンド)? ->いいえ
・ローカルメールの配送方式 ->/var/mail内のmbox形式
・設定を小さなファイルに分割しますか? ->いいえ
青画面では、矢印キー又はTABキーで移動、Enterで決定。
間違って進んでしまったら、<取消>で戻れる。
設定終了し、黒画面(コマンド)になったら、
/etc/exim4/passwd.client を編集する。
編集は
sudo vi /etc/exim4/passwd.client
でもよいが、面倒なので、(※)と同じuserで自宅サーバーにFTPで入り、ファイル編集。
passwd.clientの初期内容は、以下のようにコメント行のみ。
# password file used when the local exim is authenticating to a remote
# host as a client.
#
# see exim4_passwd_client(5) for more documentation
#
# Example:
### target.mail.server.example:login:password
なので、その下に以下の三行を追記し、保存。
gmail-smtp.l.google.com:xxx@gmail.com:password
*.google.com:xxx@gmail.com:password
smtp.gmail.com:xxx@gmail.com:password
先に取得したGmailのメールアドレスとパスワードね。
保存後、
sudo update-exim4.conf
すると、
update-exim4.conf.conf が /etc/exim4 に生成される。
念のため、exim4を再起動。
/etc/init.d/exim4 restart
Stopping MTA for restart: exim4_listener.
Restarting MTA: exim4.
ここでメール送信テストをしておこう。
(送信テストが成功したとして、次!)
PHP内で、
mb_language(“Japanese”) ;
mb_internal_encoding(“UTF-8”) ;
$to = “xxx@xxx.com” ;
$subject = “件名” ;
$msg = “本文” ;
$header = “(ヘッダー)” ;
if(mb_send_mail($to,$subject,$msg,$header)){
echo “メール送信成功”;
}else{
echo”!メール送信失敗!”;
}
mb_language と mb_internal_encoding は、文字化け回避のため。
自己レポート等で英語だけのメールにできるなら、mb_send_mailではなくsend_mailだけでよく、mb_languageもmb_internal_encodingも不要。
第1引数の$to(TO)には、カンマ区切りで複数の送信先を指定できる。
CCやBCCについてはコチラが詳しい。
第3引数の本文($msg)については後述する。
第4引数($header)を
$header = “From: ” .mb_encode_mimeheader(“文字列A 文字列B”) .”
とすると、From(送信者)を設定できそうだが、メールアドレスはGmailのものとなる(test@test.comとはならない)。
また、文字列Aと文字列Bの間に半角スペースがあると「姓 名」と判断されるためか、
iOS端末の標準メーラーでは、
差出人:文字列B 文字列A
と表示されてしまう(欧米か!)。
さらに、文字列部分に日本語を用いる場合は、
mb_language(“Japanese”) ;
mb_internal_encoding(“UTF-8”) ;
を $header の前に置かないと、文字列が化けてしまう。
第3引数の本文($msg)であるが、
組み立てはHTML(PHP)で行い、
ob_start() ;
(~本文~)
$str = ob_get_contents() ;
で $msg に格納するとよいだろう。
その際、HTMLタグはメール本文にそのまま表れてしまうので、
$str = str_replace(“
“,”\n”,$str) ; ← 「\n」は改行
等の置換を行った上で、
$str = strip_tags($str) ;
でタグを除去すればよい。
ob_xxx_clean()を行うと、意図的に($strをprintする等で)表示しない限り、組み立て内容がブラウザ上では表示されない?ので、使用しない。
ブラウザ上では表示されなくても、ob_get_contents()で取得した内容が$strに格納されていれば、本文は存在し、メール送信される。
関連:ob_get_clean() は、基本的に ob_get_contents() および ob_end_clean() を同時に実行するのと同じ。
もちろん、一度に多先に送信や、短時間送信を繰り返すとスパム扱いとされるだろうから、送信先の件数と送信間隔には注意。
スパム送信扱いされると、Gmailのアカウント停止(=送信不可能)されると思われる。
定期報告であれば、送信先は自分の携帯メールのみ、頻度は1時間に1回程度で十分だろう。
なお、Gmailにブラウザでログインすると、送信済メールが格納されている。
プログラム→exim4→Gmailであるが、ブラウザで送信したのと変わりはない。