4

我正在使用 Zend_Mail_Message 类在我的 PHP 应用程序中显示电子邮件,并且能够输出主题、内容、日期甚至发件人的姓名(使用 $message->from),但我不知道如何获取发送消息的人的电子邮件地址。文档没有帮助,谷歌搜索找到了一百万个关于如何使用 Zend 发送消息的结果,但没有关于获取发送消息的地址。

4

3 回答 3

3

编辑:

这就是我最终做到的方式。经过一番挖掘,我在一个名为“return-path”的字段中找到了发件人的电子邮件。不幸的是,这个字段的名称中有一个破折号(WTF??)所以要访问它,我必须这样做: $return_path = 'return-path'; $message->reply_to = $zendMessage->$return_path;


使用返回路径会导致一些电子邮件出现一些问题,特别是来自无回复帐户(mail-noreply@gmail.com、member@linkedin.com 等)的消息。这些地址最终看起来像这样:

m-9xpfkzulthmad8z9lls0s6ehupvordjdcor30geppm12kbvyropj1zs5@bounce.linkedin.com

...这显然不适用于前端的“来自”字段中的显示。Apple Mail 和 Gmail 等电子邮件客户端显示 mail-noreply@gmail.com 或 member@linkedin.com,所以这也是我想要的。

无论如何,经过更多研究,我发现 Zend 邮件消息对象中的“发件人”字段总是如下所示:

"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 回答