[mb_send_mail] 自宅Debianサーバーからメール送信 [Debian,exim4,Gmail]

この記事は約6分で読めます。
スポンサーリンク

自宅サーバー(Debian)から、外部へメールを送信する。

システムのエラー発生等を、携帯電話へメールで送信する等に使える。

MTAには、exim4を使うとよいだろう。

MTAとはMail Transfer Agentの略で、メール転送エージェントである。

今回は、exim4Gmailを組み合わせることにする。

# 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で決定。

間違って進んでしまったら、<取消>で戻れる。

メール設定の一般的なタイプ

システムメール名

メールサーバの設定

入力側SMTP接続をリスンするIPアドレス

メールを受け取るその他の宛先

メールをリレーするマシン

送出スマートホストのIPアドレスまたはホスト名

送出するメールでローカルメール名を隠しますか?

表示するローカルユーザのドメイン名

メールサーバの設定

DNSクエリの数を最小限に留めますか(ダイヤルオンデマンド)?

ローカルメールの配送方式

設定を小さなファイルに分割しますか?

設定終了し、黒画面(コマンド)になったら、

/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_languagemb_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であるが、ブラウザで送信したのと変わりはない。

タイトルとURLをコピーしました