2010年1月27日水曜日
シビア過ぎる… - xamppでsendmail

いい加減、ローカルでもメールの送信テストが出来るようにと、xamppをあれこれいじってみる。

まずはphp.iniから。
バージョンによって場所が違うかもしれないので、パスは書かない。

[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 = "インストールディレクトリ\sendmail\sendmail.exe -t"


SMTPとsmtp_portには、使用したいメールサーバの設定を記述する。
sendmail_fromはそのままにしておきました。どーせphpで送信する場合にはfromを設定するから。
でもって、sendmail_pathもコメントを外して、パスの確認。

[mail function]
; For Win32 only.
SMTP = smtp.xxxxx.co.jp
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 = "インストールディレクトリ\sendmail\sendmail.exe -t"


続いてはsendmailの設定をしたいので、xamppをインストールしたディレクトリ直下にあるsendmailディレクトリのsendmail.iniを開く。

ここでも同じようにsmtp_serverとsmtp_portの設定を行う。php.iniの記述と合わせるのは当然のこと。
hostnameはとりあえずlocalhostのまま。
force_senderは変更してみた。意味があるかどうかは判らないけど。

デバッグログやエラーログが取りたい場合は、debug_logfile、error_logfileの項目のコメントを外して、有効にする。ファイル名だけだから、sendmailディレクトリに出来るんだろう。フルパスや相対パスを書くと変更できるのかな?

念の為、xamppでapacheの再起動(停止→起動)しておく。


で、いよいよテスト。

送信!


…届かない。

小一時間ほどあれこれ試してみましたが、よく判らない。
デバッグログを眺めていると…

10/01/27 10:16:54 ** Cc:
10/01/27 10:16:54 ** Bcc:Content-Type: text/plain; charset=ISO-2022-JP


あ!

改行コードが抜けとるがや!

phpのソースに
."\r\n".
を追加して再度実行してみると、無事に送信できました。

Content-typeの記述を追加した際に、改行コードを付け忘れたってだけか。

ううむ…
そんなヘッダでも送信できてたサーバのsendmailが大雑把なのか、xampp付属のsendmail.exeがシビアなのかどうか…

そもそも記述を間違える僕がいけないっつー話なんだけど。



1 コメント | コメントを書く | コメントの表示
2010年1月15日金曜日
PHPでメールを送るけど、Beckyだけが…

PHPでサイト構築しました。
メールを送るんだけど、まぁこんなカンジ。
抜粋ね。

mb_language('ja');
mb_internal_encoding('UTF-8');
$admin_name = mb_encode_mimeheader($admin_name, 'UTF-8');
$mail_header = "From: ".$admin_name." <".$admin_mail.">\r\n";
$mail_header .= "Content-Type: text/plain; charset=ISO-2022-JP\r\n";
$mail_header .= "Content-Transfer-Encoding: 7bit";
mb_send_mail($mail, $subject, $body, $mail_header);


mb_language()とかmb_internal_encoding()とかは冗長かとは思ったんだけど、改めて指定してみた。

問題は$admin_nameなんだな。
要するに送信者名を日本語で設定したいというので、mb_encode_mimeheader()を使うことになった。

色々とテストしてみると、何故かBecky!だけが化ける。
いくつかのケータイとiphone、Windows Live Mailで試したけど、問題なし。
Becky!だけが問題。

受信メールの一覧、メールのプロパティでは正常に表示されている。
しかしメールを表示する際のミドルバー上の差出人とヘッダ表示ではまともに表示できていない。

試しに返信してみると、宛先の日本語表示は正しい。

色々調べるが、有効な情報は見つからない。

まぁ、Becky!はクセがあるみたいだしなぁ…


じゃ、僕のコードがまずいんだろうなってことで、Content-Typeを消してみたり、Content-Transfer-Encodingを消してみたり色々試したが一向に改善されない。

改めてphpinfo()を確認するが、mb_internal_encodingはUTF-8である。


結論はこれ。
$admin_name = mb_encode_mimeheader($admin_name, 'UTF-8');


ここで指定している'UTF-8'を外すと、Becky!でも正常に表示されました。

$admin_name = mb_encode_mimeheader($admin_name);


$admin_nameで指定している文字コードもUTF-8だし、改めて指定する必要もないかな??
一応Windows Live Mailでも正常に受け取れたし…

なんだったんだろう?
全然ワカラン。

実は根本的なことが判ってないのかも。



0 コメント | コメントを書く | コメントの表示
Template Design: © 2007 Envy Inc.