[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 メーリングリストの案内