【问题标题】:Reply to an email using SMTP使用 SMTP 回复电子邮件
【发布时间】:2015-04-08 21:02:50
【问题描述】:

我的项目的想法是使用 IMAP 从 Gmail 中检索电子邮件并将其存储在数据库中。
比使用 PHPMailer 发送新消息。 我的问题是如何回复数据库中存在的电子邮件,以及回复电子邮件需要哪些信息。 这是我用来发送电子邮件的代码。但我无法回复电子邮件。当我想回复一封电子邮件时,我发现我只是发送新的。 这只是模型

public function send_email_reply($from, $to, $subject, $message)
    {
        $body =
            '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
            <html xmlns="http://www.w3.org/1999/xhtml">
            <head>
                <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
                <title>'.htmlspecialchars($subject, ENT_QUOTES, $this->email->charset).'</title>
                <style type="text/css">
                    body {
                        font-family: Arial, Verdana, Helvetica, sans-serif;
                        font-size: 16px;
                    }
                </style>
            </head>
            <body>
            '.$message.'
            </body>
            </html>';
            $body = $this->email->full_html($subject, $message);
            $result = $this->email
                ->from($from)
                ->to($to)  
                ->subject($subject)
                ->message($body)
                ->send();

        return $result;
    } 

【问题讨论】:

  • 看看您的尝试可能会有所帮助。
  • @d00dle 你是什么意思

标签: smtp gmail phpmailer


【解决方案1】:

当电子邮件客户端回复消息时,它实际上是一条新消息。但是,该消息看起来像一个回复,并且会与原始消息相关联,因为生成回复的邮件客户端部分经过精心构建。

为了使它看起来像回复,原始消息的文本通常会在每行前面缩进一个竖线。对于消息的纯文本部分,每行前面都带有一个尖括号,这并不太难。对于 HTML 部分,客户端必须构建能够正确呈现的内容,这可能非常困难。

从您的代码示例中,我无法判断您是如何构建消息的,但它可能没有考虑到这些因素。您将需要分析原始消息的 MIME 结构,获取 TEXT/PLAIN 部分并构建一个看起来合适的 TEXT/PLAIN 回复,然后您需要对 TEXT/HTML 部分执行相同的操作。一旦你有了正确结构的部分,你需要用你的 TEXT/PLAIN 和 TEXT/HTML 部分构建一个新的 MIME 消息。

有几个 PHP MIME 解析器,我没有具体的推荐,我们实际上根据需要使用了几个,包括我们内部编写的一个。 php-mime-mail-parser 还不错。

要使您的消息表现类似于回复,您需要正确输入几个标题。获取原始消息的 Message-ID 并将其放在新消息的 In-Reply-To: 标头中。从原始消息中获取References: 标头并将原始Message-ID 附加到列表的末尾,用一个空格分隔不同的Message-ID。如果之前不存在,请仅使用原始 Message-ID 创建一个新的。

如果References: 标头变长,您可能需要截断条目。我不知道具体的限制,在我们的实现中我们没有施加任何限制。只是为了确保fold 行不超过 998 个字符。

In-Reply-To: 和 References: 的回复标头在 RFC 5322 sec 3.6.4 中指定。

有关线程如何工作的更详细的讨论,请参阅Jamie Zawinski's work on email threading,它在我们的 E-Discovery 工具的电子邮件线程分析中非常有用。它已过时,但仍然相关。

【讨论】:

  • 最后一段可能是这个回复中唯一重要的部分,但它相当不完整。您需要找出正确的回复地址,如果 References: 标头过长,您需要修剪它。另请参阅 cr.yp.to/immhf/thread.html 和 cr.yp.to/immhf/response.html 以及链接页面。
  • 该 MIME 解析器已移至 here。它现在在 packagist 中,并且似乎在 github 上得到了更积极的维护。另一个受欢迎的选择是Zend Framework's MIME module。
  • @tripleee,是的,References: 标头确实需要被截断,如果它变得很长,很好。 @er_web-pr,这对您的情况有帮助吗?如果没有,您能否明确说明您想要做什么。
猜你喜欢
  • 2016-04-17
  • 2013-02-07
  • 2018-04-01
  • 2013-09-19
  • 1970-01-01
  • 1970-01-01
  • 2017-04-27
  • 2011-11-29
相关资源
最近更新 更多