使用SMTP回复电子邮件

时间:2015-04-08 21:02:51

标签: smtp gmail phpmailer

我的项目的想法是使用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;
    } 

1 个答案:

答案 0 :(得分:0)

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

要使其看起来,就像回复一样,原始邮件的文本通常包含在每行前面的竖线中。对于消息的纯文本部分,每行前面都有一个尖括号,这并不太难。对于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,它对我们的电子披露工具的电子邮件线程分析非常有用。它已过时,但仍然相关。