1

サーバーへの電子メールが Zend Framework 2 インデックス (MVC に続く) にパイプされ、コントローラーに送信されます。

public function incomingMailAction()
{
    $message ='';
    $stdin = fopen('php://stdin', 'r');

    while($line = fgets($stdin)) {
        $message .= $line;
    }

    fclose($stdin);

    // Parse e-mail here and store in database (including attachments)
}

私はデータベース部分への保存を処理できますが、その生のメッセージを取得して、それを有用なもの (To、From、ReplyTo、CC、BCC、ヘッダー、添付ファイルなど) に変換する方法がわかりません。

ありがとう!

4

3 に答える 3

3

使用できますがZend\Mail\Message::fromString($rawMessage);、MIME ボディはデコードされません。

于 2013-02-02T08:05:48.710 に答える
1

私も ZF2 で電子メールを解析しようとしましたが、実際には Zend Mail コンポーネントのソース コードに、メッセージのデコードが todo リストにあり、まだ実装されていないというコメントが見つかりました。現在、これを行う簡単な方法はないようです。

代わりに、 php-mime-mail-parserを使用することをお勧めします。代わりにそのライブラリを使用することになりました。pecl 拡張メールパース (インストールが必要な場合があります) の機能を使用し、驚くほど簡単です。開始する必要があるいくつかの例:

$message = new \PhpMimeMailParser\Parser();
$message->setText($rawMail); // Other functions to set a filename exists too

// All headers are retrieved in lowercase, "To" becomes "to"
// and "X-Mailer" becomes "x-mailer"
$recipient = $message->getHeader('to');
$date = $message->getHeader('date');
$xmailer = $message->getHeader('x-mailer');

// All headers can be retrieved at once as a simple array
$headers = $message->getHeaders();
$recipient = $headers['to'];

// Attachments can be retrieved all at once as "Attachment" objects
$attachments = $message->getAttachments();

foreach($attachments as $attachment) {
  $attachment_as_array = array(
    'type' => $attachment->getContentType(),
    'name' => $attachment->getFilename(),
    'content' => (string)$attachment->getContent(),
  );
}

このライブラリは PHP の既存の拡張機能を使用しており、メモリ管理の点で非常に効率的であるように思われるため、おそらく ZF よりも電子メールの解析に適していると思われます。また、非常に使いやすいです。私にとって唯一の欠点は、すべてのサーバーに mailparse pecl 拡張機能を追加でインストールすることでした。

于 2016-02-29T16:44:21.790 に答える
-1
public function incomingMailAction()
{
    $message ='';
    $stdin = fopen('php://stdin', 'r');

    while($line = fgets($stdin)) {
        $email .= $line;
    }     

    fclose($stdin);

    $to1 = explode ("\nTo: ", $email);
    $to2 = explode ("\n", $to1[1]);
    $to = str_replace ('>', '', str_replace('<', '', $to2[0]));
    list($toa, $tob) = explode('@', $to);
}

盗難元:PHP電子メール配管get'to'フィールド

于 2013-02-01T18:22:43.527 に答える