PHPでメールを送信するとき、普通はmail()関数か、日本語含むならmb_send_mail()関数を用いるところ。
しかしこれはsendmailを利用するので、sendmailがインストールされていない環境では使えない。
php.iniの中には、

; For Win32 only.
SMTP = localhost
smtp_port = 25

ってSMTPサーバの設定らしきものがあるわけだけど、残念ながらWindows版のみ。
Linuxでは外部のSMTPサーバを使う設定が無いみたい。

まぁ、メール送信ぐらいそんなに難しくないだろうし、書いちゃおうか。

ということで。

<?php
//各種設定
$to = "test@genkikko.net";
$from = "admin@genkikko.net";
$body = <<<EOF
今日はいい天気ですね。
台風が来てますよ。
雨は降ってません。
EOF;
$body = mb_convert_encoding($body,"JIS");
$subject = mb_convert_encoding("Subject: SMTPでメール発射","JIS");
$server = "mail.genkikko.net";

$sock = fsockopen($server,25); メールサーバの25番ソケットを開いて

fputs($sock,"HELO $server\r\n"); //SMTPコマンド発行
echo "HELO $server<br>\n"; //発行したコマンドを表示

$result = fgets($sock,128); //サーバからのレスポンスを取得
echo $result."<br>\n"; //それを表示

fputs($sock,"MAIL FROM:<$from>\r\n"); //FROMアドレス指定
echo "MAIL FROM:<$from><br>\n";

$result = fgets($sock,128);
echo $result."<br>\n";

fputs($sock,"RCPT TO:<$to>\r\n"); //宛先指定
echo "RCPT TO:<$to><br>\n";

$result = fgets($sock,128);
echo $result."<br>\n";

fputs($sock,"DATA\r\n"); //DATAを送信後、ピリオドオンリーの行を送るまで本文。
echo "DATA<br>\n";

$result = fgets($sock,128);
echo $result."<br>\n";

fputs($sock,"$subject\r\n"); //Subjectヘッダ送信
echo $subject."<br>\n";

fputs($sock,"$body\r\n"); //本文送信
echo $body."<br>\n";

$result = fgets($sock,128);
echo $result."<br>\n";

fputs($sock,"\r\n.\r\n"); //ピリオドのみの行を送信。
echo ".<br>\n";
$result = fgets($sock);
echo $result."<br>\n";
if(!ereg("^250",$result)){ //成功すると250 OK~と返してくるので
echo "送信失敗<br>\n;"; //それが返ってこなかったら失敗。
}
fclose($sock); //ソケット閉じる
?>


こんなんを書いて動かしてみると、
HELO mail.genkikko.net
220 mail.genkikko.net ESMTP Postfix
MAIL FROM:<admin@genkikko.net>
250 mail.genkikko.net
RCPT TO:<test@genkikko.net>
250 Ok
DATA
250 Ok
Subject: SMTPプロトコルでメール発射
今日はいい天気ですね。台風が来てますよ。雨は降ってません。
354 End data with .
.
250 Ok: queued as 6ECAD1B815F

こんな風になってメールが届く。
携帯宛で実験したけど一瞬で届く。

注意すべきは、日本語をJISでエンコードして送信することぐらいかな。
euc-jpのままだと文字化けしまくった。

あとは、いちいち$resultは取る必要が無いから、どんどんコマンド発行していっていい。
これは何が起こってるかを見える化するためにやっただけなので。
逆に、毎度$resultを見て、成功かどうか判断するのもいいんでしょうけど。
メール発射ぐらいでそんな面倒なことやってられないので俺はこれでok。


データベースに接続できませんでした。

アンケート

このページの内容はいかがでしたか?
片手間にポチっと送信してやってください。
役に立った 0
おもしろかった 0
ふつー 0
つまらなかった 0
欲しい情報と違った 0
Score:0