[PHP-users 33809] Re: 既存のmail、mb_send_mailを使用しないSMTP送信について
聖歩美
hijiri.walk @ gmail.com
2008年 7月 10日 (木) 20:32:30 JST
聖と申します。
> ・ソケット通信で送信したときの動作や、その仕組み
下記の例は 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 メーリングリストの案内