PHPでメールを送信するとき、普通はmail()関数か、日本語含むならmb_send_mail()関数を用いるところ。
しかしこれはsendmailを利用するので、sendmailがインストールされていない環境では使えない。
php.iniの中には、
SMTP = localhost
smtp_port = 25
ってSMTPサーバの設定らしきものがあるわけだけど、残念ながらWindows版のみ。
Linuxでは外部のSMTPサーバを使う設定が無いみたい。
まぁ、メール送信ぐらいそんなに難しくないだろうし、書いちゃおうか。
ということで。
//各種設定
$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); //ソケット閉じる
?>
こんなんを書いて動かしてみると、
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。
freeman
はじめまして。
フリーマンといいます。
ちょっと以下の事項について
お聞きしたくコメントしています。
PHPプログラムで取得したデータの送信について
以下のPHPプログラム内において
決済実行でSTATUSがOKとして返ってきた後、
その旨を自動で自分のメールアカウントに送信できる
コードを知りたいのですが、
どの場所にどんなコードを入れればよいでしょうか?
ちなみこれはbitcash社の課金システムプログラムで
これを使って有料メルマガの配信を準備しています。
$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プログラムで取得したデータの送信について
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";
}
げんき
はじめまして。
SPAMに埋もれて気づきませんですみません。
if ($STATUS == "OK"){
~
}
の中に、mail()を入れればいいんじゃないでしょうか。
日本語を使いたければmb_send_mail()ですね。
mail()およびmb_send_mail()の使い方は、ググればすぐ見つかります。
このページで紹介しているメール送信法法は、あくまでもUNIX系サーバでMTAがインストールされていないという結構特殊な状況での話ですので、一般的には上記の関数で問題なく送信できると思います。
どうしてもここで紹介している方法が良いというお話でしたら、簡単に使えるように関数化してみます。
お返事まってます。
初心者
この情報は初心者にとっては最高につかえるものである。なぜなら、初心者の大半がメール設定でつまずいてしまうからだ。目的は『メールを送信したい』だけなのに、たいていの方法ではそれがむずかしい。しかし、ここに書かれた方法ならば『メールを送信する』という目的を即座に達成できるだろう。