PHPMailer 和 Gmail 对话视图

2024-04-24

当我们的服务器收到更新(通常与付款相关)时,我使用 PHPMailer 发送电子邮件以提供支持。

我正在尝试将相关电子邮件显示为 Gmail 对话,以便支持人员更轻松地跟踪之前的更新/回复。我最初认为它是基于主题的,但这似乎没有什么区别。

我的邮件代码:

$mail               = new PHPMailer;                        // create a new instance
$mail->isSMTP();                                            // set that we're using stmp
$mail->CharSet      = 'UTF-8';                              // make sure it's utf-8 encoded
$mail->Host         = 'smtp.gmail.com';                     // the hostname of the mail server
$mail->Port         = 587;                                  // set the smtp port number (587 for authenticated TLS)
$mail->SMTPSecure   = 'tls';                                // set the encryption to use, ssl (deprecated) or tls
$mail->SMTPAuth     = true;                                 // should we use smtp authentication?
$mail->Username     = MY_EMAIL_LOGIN;                       // the user name for the smtp authentication
$mail->Password     = MY_EMAIL_PASSWORD;                    // the password for smtp authentication
$mail->wordWrap     = 70;                                   // make sure we've no lines longer than 70 chars
$mail->Subject      = "[Payment] - Player {$payment->user->name} ({$payment->user->id}) - Payment ID {$payment->id}";
$mail->Body         = $htmlBody;                            // our html body
$mail->AltBody      = $plainBody;                           // our fallback, plain-text body
$mail->setFrom( SUPPORT_EMAIL, 'Support' );                 // who this is from
$mail->addReplyTo( SUPPORT_EMAIL, 'Support' );              // who we can reply to
$mail->addAddress( SUPPORT_EMAIL );                         // who we're sending it to
$mail->isHTML( true );                                      // is this a html formatted email?
if( !$mail->send() )
    error_log( "Can't send an email to support about payment {$payment->id} for user {$payment->user->id}" );

如果我收到来自同一用户的两封与同一付款相关的电子邮件(因此主题相同),我希望它的内容如下:

+-----------------------------------------------------------------------------+
| Support (2)       | [Payment] Player foo (123456789) - Payment ID 123456789 |
+-----------------------------------------------------------------------------+

它实际上是什么:

+-----------------------------------------------------------------------------+
| Support           | [Payment] Player foo (123456789) - Payment ID 123456789 |
+-----------------------------------------------------------------------------+
| Support           | [Payment] Player foo (123456789) - Payment ID 123456789 |
+-----------------------------------------------------------------------------+

我错过了一些简单的事情吗?


对于任何寻找有效方法的人:点击 @ErikNedwidek 留下的链接将引导您看到这篇博文:http://www.sensefulsolutions.com/2010/08/how-does-email-threading-work-in-gmail.html http://www.sensefulsolutions.com/2010/08/how-does-email-threading-work-in-gmail.html

指定了两条规则:

  • 主题必须相似。
  • 发送者必须是线程的一部分或者必须使用回复。

第一个被覆盖,因为主题是相同的,并且第二个的第一部分应该被覆盖,因为发送者与接收者相同。

还有这一部分:

值得注意的一件有趣的事情是,如果您从 Gmail 发送电子邮件,它们也会被线程化。除了一个小细节外,规则与您收到规则时完全相同。如果您在没有主题前缀的情况下发送相同的消息两次(例如,主题是 test 而不是 re: test),它确实会在接收端线程化,但不会在发送端线程化。相反,如果它确实包含前缀(例如 re: test),则在这两种情况下都会将其线程化。

我认为它没有被线程化,因为发送者和接收者地址是相同的。将接收者地址更改为另一个测试地址意味着消息在接收时可以正确线程化。保持发送者和接收者地址相同,但添加另一个接收者地址也意味着它们可以正确连接。不过,仅拥有一个与发件人地址相匹配的收件人地址是行不通的。

我尝试在主题的开头添加“re:”,但这没有任何区别。然而,有效的是使用以下命令添加“In-Reply-To”标头:

$mail->addCustomHeader( 'In-Reply-To', '<' . SUPPORT_EMAIL . '>' );

请注意,< and >很重要,因为没有它似乎会被忽视。

总结一下:

  • [email protected] /cdn-cgi/l/email-protection发送至[email protected] /cdn-cgi/l/email-protection= 无螺纹
  • [email protected] /cdn-cgi/l/email-protection发送至[email protected] /cdn-cgi/l/email-protection= 螺纹加工
  • [email protected] /cdn-cgi/l/email-protection发送至[email protected] /cdn-cgi/l/email-protection and [email protected] /cdn-cgi/l/email-protection= 两者都有螺纹
  • [email protected] /cdn-cgi/l/email-protection发送至[email protected] /cdn-cgi/l/email-protection with re:放在主题前面 = 无线程
  • [email protected] /cdn-cgi/l/email-protection发送至[email protected] /cdn-cgi/l/email-protection带标题In-Reply-To set to [email protected] /cdn-cgi/l/email-protection= 无螺纹
  • [email protected] /cdn-cgi/l/email-protection发送至[email protected] /cdn-cgi/l/email-protection带标题In-Reply-To set to <[email protected] /cdn-cgi/l/email-protection>= 螺纹加工

完整的 PHPMailer 代码:

$mail               = new PHPMailer;                                // create a new instance
$mail->isSMTP();                                                    // set that we're using stmp
$mail->CharSet      = 'UTF-8';                                      // make sure it's utf-8 encoded
$mail->Host         = 'smtp.gmail.com';                             // the hostname of the mail server
$mail->Port         = 587;                                          // set the smtp port number (587 for authenticated TLS)
$mail->SMTPSecure   = 'tls';                                        // set the encryption to use, ssl (deprecated) or tls
$mail->SMTPAuth     = true;                                         // should we use smtp authentication?
$mail->Username     = MY_EMAIL_LOGIN;                               // the user name for the smtp authentication
$mail->Password     = MY_EMAIL_PASSWORD;                            // the password for smtp authentication
$mail->wordWrap     = 70;                                           // make sure we've no lines longer than 70 chars
$mail->Subject      = "[Payment] Player {$payment->user->name} ({$payment->user->id}) - Payment ID {$payment->id}";
$mail->Body         = $htmlBody;                                    // our html body
$mail->AltBody      = $plainBody;                                   // our fallback, plain-text body
$mail->setFrom( SUPPORT_EMAIL, 'Support' );                         // who this is from
$mail->addReplyTo( SUPPORT_EMAIL, 'Support' );                      // who we can reply to
$mail->addAddress( SUPPORT_EMAIL );                                 // who we're sending it to
$mail->addCustomHeader( 'In-Reply-To', '<' . SUPPORT_EMAIL . '>' ); // so we get threading on gmail (needed as to and from are the same address)
$mail->isHTML( true );                                              // is this a html formatted email?
if( !$mail->send() )
    error_log( "[paymentsRealtimeUpdates] Can't send an email to support about payment {$payment->id} for user {$payment->user->id}" );

不相关的小点-无论你为该设置什么地址setFrom似乎被忽略了 - Gmail 会采用后面的任何地址MY_EMAIL_LOGIN login.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHPMailer 和 Gmail 对话视图 的相关文章

  • PHP cookie 和会员安全

    我创建了一个论坛 该论坛在登录时使用 PHP 会话来确定用户 ID 并使用 cookie 来进行日志登录 我想我有两个问题 这是最好 最安全的方法吗 可以使用javascript通过地址栏手动添加cookie 这是一个巨大的安全风险 有没有
  • mysqli_query() 需要至少 2 个参数,其中 1 个参数在? [复制]

    这个问题在这里已经有答案了 每次运行这个 php ini 时 我都会遇到同样的 3 个错误 我不知道我做错了什么 有人可以帮忙吗 以下是错误 2014 年 5 月 5 日 19 20 50 美洲 芝加哥 PHP 警告 mysqli quer
  • preg_replace 内的 preg_replace

    现在我在替换已经从 preg match 中出来的字符串时遇到问题 假设我有 bbcode b bla b 我有这部分正在替换 b with b 但我们只是说出于所有测试目的 他们所做的 b hi b test b b 最终出来的是 hi
  • Android - 如何通过检查已发送的项目来确定电子邮件是否已发送

    我有一个应用程序 我使用意图发送电子邮件 如下所示 TODO attach and send here try Log i getClass getSimpleName send task start String address emai
  • 如何计算PHP中内置函数的总数? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 如何计算
  • 检查变量是否为空或空字符串的更好方法?

    由于 PHP 是一种动态语言 检查提供的字段是否为空的最佳方法是什么 我想确保 null 被视为空字符串 仅包含空格的字符串被视为空 0 不被视为空 这是我到目前为止所得到的 question trim POST question if q
  • vagrant + virtualbox 等待机器启动时超时

    抱歉 我对 vagrant 很陌生 我正在运行 vagrant 1 4 3 和 virtualbox 4 3 26 我的主机操作系统是 ubuntu 14 04 2 我是一名 php 开发人员 我正在努力让我的开发环境为几个项目做好准备 我
  • 通过php将MYSQL数据导出到Excel/CSV

    我想通过 php 将 MYSQL 数据导出到 Excel CSV 这样我以后就可以使用我的数据库 或者有人可以使用并理解它 要使用适合 EXCEL 的语法创建 CSV 文件 您可以使用基本 SQL SELECT FROM mytable I
  • php中UCS2/HexEncoded字符转UTF8

    我之前问过一个问题 从 UTF 8 获取 UCS 2 HexEncoded 字符串 我在以下链接中得到了一些人的帮助 UCS2 HexEncoded 字符 https stackoverflow com questions 1872773
  • 自动生成序列号

    我编写了下面的计数代码 目的是让它为我的数据生成自动序列号 以代替删除行后的 MySQL 序列号 但是当我运行它时 我发现 MySQL 表中没有任何条目 后来我将代码更改为 Dreamweaver 插入记录 并观察到 SN 序列号 字段不需
  • PHP/HTML 添加删除按钮

    我有下面的代码来从数据库中检索行 其中用户名列与基本目录名称匹配 username basename dirname FILE username mysql real escape string username result mysql
  • 在 Google Analytics 中准确报告通过 PayPal 进行的付款的推荐人

    在我们的 Google Analytics 电子商务中 PayPal 被视为推荐人 我发现许多文章概述了 utmnooveride 的使用 以确保 PayPal 交易传递数据 以便原始推荐人获得信用 我们使用 PayPal 处理我们的信用卡
  • 多维数组上的数组合并

    要么我是瞎子 要么我在任何地方都找不到这个问题 昨天我在合并数组时遇到了问题 我可以在 SO 的帮助下解决这个问题 今天 我再次遇到了合并数组的问题 但这一次是多维数组 我有一个数组 usergroup groups 和一个数组 userg
  • 如何像mysql一样对数组进行排序

    如何对与数据库数据相同的数组进行排序 我请求谷歌分析数据 数据是一个大数组 我想将数组与本地数据库中的一些其他字段连接起来 然后我再次扩展大数组 现在我想对大数组进行排序 这与使用我的 sql 相同 如下所示 select from ga
  • PHPQuery WebBrowser 插件 - 使用 cookies

    我正在尝试使用 PHPQuery 的 WebBrowser 插件登录网站 我能够成功登录 但我不确定如何重用上一次调用中的 cookie 到下一次调用 client phpQuery browserGet https website com
  • 不在对象上下文中时使用 $this php

    我刚刚开始学习 php 中的 OOPS 我写了一个简单的程序来实现继承 当不在对象上下文中时 我收到 this 的致命错误 谁能解释一下这个错误 它是什么意思 这是我的代码
  • Facebook 爬虫严重攻击我的服务器并忽略指令。多次访问相同资源

    Facebook 爬虫每秒多次访问我的服务器 它似乎忽略了 Expires 标头和 og ttl 属性 在某些情况下 它会在 1 5 分钟内多次访问同一 og image 资源 在一个示例中 爬虫程序在 3 分钟内使用 12 个不同的 IP
  • 获取数组的第一个元素

    我有一个数组 array 4 gt apple 7 gt orange 13 gt plum 我想获取这个数组的第一个元素 预期结果 字符串apple 要求一 它不能通过引用传递来完成 so array shift这不是一个好的解决方案 我
  • 如何通过 JQuery Post 传递 Javascript 数组,以便可以通过 PHP $_POST 数组访问其所有内容?

    如何通过 JQuery Post 传递 Javascript 数组 以便可以通过 PHP POST 数组访问其所有内容 请展示一个可以实现此目的的代码示例 Thanks 如果你想传递一个 JavaScript 对象 哈希 即 PHP 中的关
  • 另一个数组内的 stdClass 对象数组

    我正在尝试从下面的 array1 获取信息 通过执行以下操作 我可以毫无问题地获取场地名称和地点地址 array2 array array3 array foreach array1 as item array2 item gt venue

随机推荐