4

Zend_Mail_Message クラスを使用して PHP アプリ内にメールを表示し、件名、内容、日付、さらには送信者の名前 ($message->from を使用) を出力できますが、方法がわかりません。メッセージを送信した人のメールアドレスを取得します。ドキュメントは役に立たず、グーグルはZendでメッセージを送信する方法について何百万もの結果を見つけますが、メッセージを送信したアドレスを取得することについては何も見つけません.

4

3 に答える 3

3

編集:

これが私がやった方法です。さらに掘り下げた後、「return-path」というフィールドに送信者のメールが見つかりました。残念ながら、このフィールドの名前にはダッシュが含まれているので (WTF??)、アクセスするには次のようにする必要がありました。$message->reply_to = $zendMessage->$return_path;


return-path を使用すると、一部のメール、特に返信のないアカウント (mail-noreply@gmail.com、member@linkedin.com など) からのメッセージで問題が発生しました。これらのアドレスは、次のようになります。

m-9xpfkzulthmad8z9lls0s6ehupvordjdcor30geppm12kbvyropj1zs5@bounce.linkedin.com

...フロントエンドの「from」フィールドでの表示では明らかに機能しません。Apple Mail や Gmail などの電子メール クライアントでは、mail-noreply@gmail.com や member@linkedin.com と表示されるので、私もそれを目指していました。

とにかく、さらに調査した結果、Zend Mail Message オブジェクトの「from」フィールドは常に次のようになっていることがわかりました。

"user account name" <user@email.com>

< > の部分は私が求めていたものですが、単純に $from = $zend_message->from を実行すると、ユーザーのアカウント名しかわかりません (したがって、私の元の質問)。もう少し遊んだ後、これが最終的に機能するようになった方法です。

  $from   = $zendMessage->from;
  $start  = strpos($from, '<');
  $email  = substr($from, $start, -1);
  $result = str_replace('<', '', $email);

うまくいけば、これは誰かの欲求不満を救うでしょう. もっと簡単な方法を知っている人がいたら教えてください。

于 2012-10-09T16:11:42.330 に答える
2

これはうまくいきます..

        $senderMailAddress = null;
        foreach ( $message->getHeader('from')->getAddressList() as $address ) {
            if ( $senderMailAddress === null) {

                $senderMailAddress = $address->getEmail();
            }
        }
于 2013-09-28T02:51:53.633 に答える
1

ここでの主な問題は、途中で多くの電子メール プログラム、リレー エージェント、およびウイルス スキャナが、実際には単純で明確に定義された電子メール標準に対しておかしなことを行うことです。

Zend_Mail_Message は、 というメソッドを持つ Zend_Mail_Part に拡張されgetHeaders()ます。getContent()これにより、アクセスされる本文と実際の電子メールメッセージに対して、ヘッドに格納された電子メールからのすべてのデータが保持されます。

このメソッドを使用すると、ヘッダー内のすべてのキーと値のペアの配列を取得し、開発中に実際に必要なヘッダー フィールドを決定できるはずです。getHeader('field_name')実際のフィールドを実際の名前で、または実際の名前で直接取得できることがわかったら。

ただし、多数の異なる電子メール送信者が必要な場合は、完全なヘッダー配列に固執し、「返信先」アドレスがある場合のように複数のフィールドを評価して最良の結果を得ることができます。ここでも、標準が常に守られているとは限らないため、多くの不確実性があります。

于 2012-08-04T22:57:13.910 に答える