2008年7月10日

[PHP-users 33809] Re:既存のmail、mb_send_mailを使用しないSMTP送信について

聖と申します。


> ・ソケット通信で送信したときの動作や、その仕組み


下記の例は DoCoMo の SMTP サーバに直接接続して、
利用者への配送をお願いするソケット通信を行います。


通信中のエラー処理、日本語処理などの細かい部分を全く考えてませんが、
一応できそうなので、掲載してみます。

<?php

function mailto_docomo( $rcpt, $from, $subject, $message ){

$mailbody = implode( "\r\n", array(
"From: <$from>",
"To: <$rcpt>",
"Subject: $subject",
"",
"$message",
".\r\n"
));

$domain = split( '@', $from );

if( !($s = fsockopen( 'mfsmax.docomo.ne.jp', 25 ) ) ) return false;

$r = array( 'socket'=>$s );

if( ( $r['load'] = 0 + fgets( $s, 1024 ) ) != 220 ) return $r;

if(!( $r['HELO_PUT'] = fputs($s, "HELO {$domain[1]}\r\n") ) ) return $r;
if( ( $r['HELO_GET'] = 0 + fgets( $s, 1024 ) ) != 250 ) return $r;

if(!( $r['RSET_PUT'] = fputs($s, "RSET\r\n") ) ) return $r;
if( ( $r['RSET_GET'] = 0 + fgets( $s, 1024 ) ) != 250 ) return $r;

if(!( $r['FROM_PUT] = fputs($s, "MAIL FROM:<$from>\r\n") ) ) return $r;
if( ( $r['FROM_GET'] = 0 + fgets( $s, 1024 ) ) != 250 ) return $r;

if(!( $r['RCPT_PUT'] = fputs($s, "RCPT TO:<$rcpt>\r\n") ) ) return $r;
if( ( $r['RCPT_GET'] = 0 + fgets( $s, 1024 ) ) != 250 ) return $r;

if(!( $r['DATA_PUT'] = fputs($s, "DATA\r\n") ) ) return $r;
if( ( $r['DATA_GET'] = 0 + fgets( $s, 1024 ) ) != 354 ) return $r;

if(!( $r['BODY_PUT'] = fputs($s, $mailbody ) ) ) return $r;
if( ( $r['BODY_GET'] = 0 + fgets( $s, 1024 ) ) != 250 ) return $r;

@fclose( $s ); // 本当は最後に QUIT を送るべきですが省略してます
$r['success'] = true;

return $r;
}


// 送信
print_r ( mailto_docomo( $_GET['to'], $_GET['from'], 'Subject', 'Message' ) );

?>



_______________________________________________
PHP-users mailing list PHP-users@xxxxx
http://ml.php.gr.jp/mailman/listinfo/php-users
PHP初心者のためのページ - 質問する前にはこちらをお読みください
http://oldwww.php.gr.jp/php/novice.php3


投稿者 xml-rpc : 2008年7月10日 20:32
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/75165
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。