Recent Comments

PHP:fsockopen()を使ってSMTPでメール送信
 [04/10] げんき
 [04/09] freeman様
 [04/09] freeman様
PHP:アンケートでハイスコアを得たエントリ一覧を表示する
 [03/31] げんき
 [03/30] YSAK様
WindowsXP:仮想メモリを無しにする。
 [03/02] げんき
 [02/27] YSAK様
DirectX 9.0cをインストール→動画再生が真っ暗に。
 [02/12] げんき
 [02/12] 匿名さん
BIND+PHPによるDiCEで更新可能なダイナミックDNSサーバ構築
 [12/27] げんき
 [12/21] oreoyaji様
 [12/20] げんき

Profile

 Vine Linux 3.2で自宅サーバ構築・運営するにあたっての覚え書き。トラブルシューティング・思いつきのPHPスクリプト。愛車CB5 VIGORのDIY。やらの紹介。

中の人

なかのひと
Graph 2008.8.28
Year:  Month:  Day

<<< DynamicDNSサーバ構築に至った理由 <<<  ||  >>> ノートパソコンのHDD交換 >>>

PHP:fsockopen()を使ってSMTPでメール送信

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。

<<< DynamicDNSサーバ構築に至った理由 <<<  ||  >>> ノートパソコンのHDD交換 >>>

アンケート

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

トラックバック

このエントリーのトラックバックURL:
http://www.genkikko.net/mt/mt-tb.cgi/40

コメント (3)

はじめまして。
SPAMに埋もれて気づきませんですみません。

if ($STATUS == "OK"){

}
の中に、mail()を入れればいいんじゃないでしょうか。
日本語を使いたければmb_send_mail()ですね。
mail()およびmb_send_mail()の使い方は、ググればすぐ見つかります。

このページで紹介しているメール送信法法は、あくまでもUNIX系サーバでMTAがインストールされていないという結構特殊な状況での話ですので、一般的には上記の関数で問題なく送信できると思います。

どうしてもここで紹介している方法が良いというお話でしたら、簡単に使えるように関数化してみます。

お返事まってます。

freeman:

PHPプログラムで取得したデータの送信について

PHPプログラムで取得したデータの送信について




php
if ($STATUS == "OK"){
// $SHOP_ID = "IDが入ります";
// $SHOP_PASSWD = "パスワード";
$ORDER_ID = "";
$BCS_ID = $BCS_ID; //カード判定の戻り値

$SHOP_ID_val = new xmlrpcval( $SHOP_ID, 'string' );
$SHOP_PASSWD_val = new xmlrpcval( $SHOP_PASSWD, 'string' );
$ORDER_ID_val = new xmlrpcval( $ORDER_ID, 'base64' );
$BCS_ID_val = new xmlrpcval( $BCS_ID, 'string' );
$struct = new xmlrpcval(array("SHOP_ID" => $SHOP_ID_val,
"SHOP_PASSWD" => $SHOP_PASSWD_val,
"BCS_ID" => $BCS_ID_val,
"ORDER_ID" => $ORDER_ID_val), "struct");
//メッセージ作成
$message = new xmlrpcmsg(
'Settlement.do_settlement',
array($struct)
);
//メッセージ送信
$result = $c->send($message);
if( !$result ){
exit('Could not connect to the server.');
}else if( $result->faultCode() ){
exit('XML-RPC fault ('.$result->faultCode().'): '
.$result->faultString());
}

$struct = $result->value();
$ERRORval = $struct->structmem('ERROR');
$ERROR = $ERRORval->scalarval();

$STATUSval = $struct->structmem('STATUS');
$STATUS = $STATUSval->scalarval();

if ($STATUS != 'OK'){
echo "

";
print_r($ERROR);
echo "
";
exit;
}

$LOG_IDval = $struct->structmem('LOG_ID');
$LOG_ID = $LOG_IDval->scalarval();

$BALANCEval = $struct->structmem('BALANCE');
$BALANCE = $BALANCEval->scalarval();

$SALES_IDval= $struct->structmem('SALES_ID');
$SALES_ID = $SALES_IDval->scalarval();

print "だめです ::" . $STATUS . "
n";
print "LOG_ID ::" . $LOG_ID . "
n";
print "SALES_ID::" . $SALES_ID . "
n";
print "BALANCE ::" . $BALANCE . "

n";
}

freeman:

はじめまして。

フリーマンといいます。


ちょっと以下の事項について
お聞きしたくコメントしています。


PHPプログラムで取得したデータの送信について

以下のPHPプログラム内において

決済実行でSTATUSがOKとして返ってきた後、
その旨を自動で自分のメールアカウントに送信できる
コードを知りたいのですが、

どの場所にどんなコードを入れればよいでしょうか?


ちなみこれはbitcash社の課金システムプログラムで
これを使って有料メルマガの配信を準備しています。




お忙しい中、有難うございます。

では

コメントを投稿