2011-01-14 22 views

答えて

2

fsockopenを使用してソケットを開きます。 fwriteを使用してソケットに書き込みます。 fgetsを使用してソケット行から、またはfreadを使用してバイトごとに読み取ります。

+0

これはまさに私が探していたものです。注意: 'fwrite()'を使ってsmtpサーバに通信するときは、smtpサーバがコマンドの実行を開始するために、コマンド文字列を改行** '\ r \ n" '**文字で終了する必要があります。 – FactoryAidan

0

mail()のドキュメントを参照してください。

+0

あなたは私が何を求めているのか理解できませんでした。 – Bronislaw

+0

@Bronislaw私は本当に彼がそうしていると思っています。ここに別のリソースがありますhttp://email.about.com/od/emailprogrammingtips/qt/PHP_Email_SMTP_Authentication.htm答えが気に入らなければ、あなたの質問にもっと詳しく書いてください。 –

+0

送信する必要があります。 RCPTに頼んで回答を得る...私はメールを送りたくない。 – Bronislaw

0

が、それはメールで行うために必要なすべての機能を持っていたZend_Mailを見てみましょう

-http://framework.zend.com

-http://framework.zend.com/manual/en/zend.mail.html

1

私は多分それはいくつかの助けになることができ、私の個人的なPHP framework, phunctionEmail()方法のために、このスニペットを書きました。私が使った正規表現は、SMTPサーバからの個々の応答を検証することができます。

if (isset($smtp) === true) 
{ 
    $result = null; 
    $stream = stream_socket_client($smtp); 

    if (is_resource($stream) === true) 
    { 
     $data = array('HELO ' . $_SERVER['HTTP_HOST']); 
     $result .= substr(ltrim(fread($stream, 8192)), 0, 3); 

     if (preg_match('~^220~', $result) > 0) 
     { 
      $auth = array_slice(func_get_args(), 8, 2); 

      if (count($auth) == 2) 
      { 
       $data = array_merge($data, array('AUTH LOGIN'), array_map('base64_encode', $auth)); 
      } 

      $data[] = sprintf('MAIL FROM: <%s>', implode('', array_slice($from, 0, 1))); 

      foreach (array_merge(array_values($to), array_values($cc), array_values($bcc)) as $value) 
      { 
       $data[] = sprintf('RCPT TO: <%s>', $value); 
      } 

      $data[] = 'DATA'; 
      $data[] = implode("\r\n", array_merge(array_diff_key($header, array('Bcc' => true)), array(''), $content, array('.'))); 
      $data[] = 'QUIT'; 

      while (preg_match('~^220(?>250(?>(?>334){1,2}(?>235)?)?(?>(?>250){1,}(?>354(?>250)?)?)?)?$~', $result) > 0) 
      { 
       if (fwrite($stream, array_shift($data) . "\r\n") !== false) 
       { 
        $result .= substr(ltrim(fread($stream, 8192)), 0, 3); 
       } 
      } 

      if (count($data) > 0) 
      { 
       if (fwrite($stream, array_pop($data) . "\r\n") !== false) 
       { 
        $result .= substr(ltrim(fread($stream, 8192)), 0, 3); 
       } 
      } 
     } 

     fclose($stream); 
    } 

    return (preg_match('~221$~', $result) > 0) ? true : false; 
} 
関連する問題