Home > PHP

mb_send_mail

mb_send_mailはマルチバイト文字を正しく解釈してくれるありがたい関数です。コマンドのsendmailに比べてとても簡単に使えます。
 しかし、php導入をしたばかりの時など時としてmb_send_mailが使えない設定になっている時がありますので、その設定と導入から。

設定

 /etc/php5/apache2/php.iniという場所にphpの設定ファイルがあります。php的には Configuration Fileという名前みたいです。すでにphpを使用している場合は<? phpinfo(); ?>からそのファイルパスを探すことができます。適当なエディタで開いてから、mailセクションの項目を編集・設定します。
 [mail function]というタイトル以下にメールに関する設定項目郡があります。

[mail function]
; For Win32 only.
SMTP = localhost
smtp_port = 25

; For Win32 only.
;sendmail_from = me@example.com

; For Unix only.  You may supply arguments as well (default: "sendmail -t -i").
sendmail_path = /usr/sbin/sendmail -t -i

; Force the addition of the specified parameters to be passed as extra parameters
; to the sendmail binary. These parameters will always replace the value of
; the 5th parameter to mail(), even in safe mode.
;mail.force_extra_parameters =

;
; マルチバイトの文字列を扱う際の設定
; mb_send_mailで使用する。たぶん初期設定にはないので自分で書いてください。
mbstring.internal_encode = UTF-8
mbstring.language = Japanese

 
太字の部分を編集します。;sendmail_path = となっている場合は、コメントアウト(;)を外して正しいsendmailパスを書き込みます。sendmailパスは、端末などから「which sendmail [Enter]」で表示されます。私の環境では/usr/sbin/sendmailでした。(/usr/lib/sendmailというパスも一般的なので、リンクを貼っておいてもいいかもです。って思って確かめたらもう貼ってありました...)
 次にマルチバイト文字を日本語で使えるように設定します。mbstring.internal_encode = utf8 は自分の使っている文字コードを書きます。EUCの場合やShift_JISの場合は便宜書き換えてください。このディレクティブはphpのマルチバイトコード全般に影響する設定です。マルチバイトの正規表現なども正しくできるようになります。同時にメール送信でも文字コードを正しく扱ってくれるようになります。mbstring.language = Japanese ではmb_send_mailで使用する言語を設定します。普通は日本語なのでJapaneseを設定。
 以上を書き込んで保存したら、/etc/init.d/apache2 restart で再起動します。これでmb_send_mail()が使えるようになると思います。

mb_send_mail

 mb_send_mailの形式は以下のようになります。

mb_send_mail (<送信先>, <メールの件名>, <メール本文>, <追加するヘッダ>, <追加するパラメーター>);

  • 送信先::送信先には送信先を指定します。
  • メールの件名::メールのタイトルです。
  • メールの本文::メールの本文を入れます。
  • 追加するヘッダ::ここには、送信元の情報などを埋め込みます。送信先のメール送信サーバー元と送信者本人のメールアドレスが違う場合などにヘッダを追加します。$header = "From:user@example.com";というような感じで指定します。これがないと送信サーバーのメールアドレスが返信メール先になってしまいます。
  • 追加するパラメーター::ここではいわゆるReturn-Pathを入れておくといいです。-fオプションをつけて、もしメールが配信されなかった場合の返ってくるメールアドレスを付加します。受信メールサーバーによってはこのReturn-Pathがないメールをスパムと判断するフィルターもあるようで通常"-f user@example.com"という感じで入れておいた方がいいかも。
 余談ですが、これは真っ当なスパム判断の材料ではないです。しかし、Return-Pathに架空のアドレス(example.com)を設定して送信したものと、きちんと実在するメールアドレスを入れて送信したものとをGmailで実験したら、前者はスパム、後者は普通にメールボックスに入ってきました。さすがGmailですね。
 と思って2012.01現在にもう一度機会があったので試してみたら、どちらも「このメッセージは次のアドレスから送信されたものではない可能性があります:」といわれてしまいました。とほほ。

 しかし、自動送信しなくてはいけない機能が多いので、それはそれでしかたないということで。

 実際にmb_send_mailを利用してphp.iniの設定を変えてさえも文字化けが発生してしまったら、コードにいくつか内部エンコードなんかを加えるときちんと日本語でも送信できるようになりました。

<?php
mb_language("uni"); 
mb_internal_encoding("utf-8");
mb_http_input("auto");
mb_http_output("utf-8");
 
mb_send_mail ("to@example.com","テスト","テスト送信","From:from@example.com","-f  testuser@gmail.com");

print "sended !";
?>
なかなか面倒です。






プロフィール



  • Name :: 山上オサム ♂(37)
  • Hobby :: 武術
  • Work :: Web Designer