使用PHP,phpmailer和Message-ID

时间:2019-05-31 07:20:06

标签: php phpmailer imap

我有一个PHP Web应用程序,其中有一个部分可通过电子邮件将发票发送给所有合作伙伴。 每个合作伙伴可能会有多于1封电子邮件。

例如:COMPANY-1,电子邮件:email_1@company1.com和email_2@company1.com

我用phpmailer发送所有邮件。

我将服务器邮件(在本例中为gmail)的发送响应保存到数据库中。

如果发送,我将保存true,否则保存false-每封电子邮件。

但是有些电子邮件有时不正确(由于插入时键入错误)或被公司拒绝(在这种情况下,公司不通知我们,我们仍发送给这封已删除的电子邮件),我想检索这些“问题“使用网络应用。

(如果我登录到google webmail,我可以看到每一封返回给不存在的电子邮件的电子邮件,其中包含一些建议/错误代码...但是我不知道如何使用PHP进行检索)

我尝试使用

$inbox = imap_open($hostname,$username,$password);

$emails = imap_search($inbox,'ALL');

此脚本有效,但是使用ALL会超时。

我不知道检索这些电子邮件的最佳方法,“某些问题未发送电子邮件”。

我的第一个想法是在发送邮件时在标头中设置自定义Message-ID

$messageID = "<" . md5($_SERVER['HTTP_HOST'].(idate("U")-1000000000).uniqid()).'-'.idate("U") . '@' . $_SERVER['HTTP_HOST'] . '>';
$mail->MessageID = $messageID;

,然后在我的脚本中,使用类似以下命令:

$messageID = retrieve_from_database(...);
$emails = imap_search($inbox,'HEADER ' . $messageID);

但它不存在查询HEADER

我想在我的Web应用程序中针对每一封发送的邮件显示最终退回或未送达的问题,但是我不知道如何和向“ imap_search”询问以获取相关回复的方式到原始发送的电子邮件。

我阅读了文档中的条件列表,但我认为没有任何有用的信息:https://www.php.net/manual/en/function.imap-search.php

我需要的方案示例:

  1. 我发送了一封电子邮件,其中Message-ID<test@testXYZ>my_email@mywebapp.com。服务器响应的真正原因已发送完毕。

  2. 我在数据库表email_not_existing@test.com上插入了一个新条目,其发送结果为:emails_sent

  3. gmail守护程序以未发送的电子邮件回复my_email@mywebapp.com

  4. 在我的Web应用程序中,当我进入已发送电子邮件的页面时,来自emails_sent表的foreach ID,我需要在imap上进行搜索,最终会响应错误的电子邮件。在此示例中,当我请求ID 455时,我需要搜索与我的电子邮件相关联的imap_search邮件回复,该邮件是由我分配的MessageID(或其他我不知道的方法...。)

1 个答案:

答案 0 :(得分:1)

我建议您远离共享托管并获得合适的服务器(尝试scaleway.com)。正如您所发现的,这意味着您没有足够的控制权。

我建议您不要将IMAP用作数据库-因为您发现IMAP不足以进行所需的搜索。如果您将所有退回的邮件导入到自己的数据库中,则可以随意进行分析和搜索,并且可以轻松地从IMAP中获取所有邮件。

处理退回的最有效方法是将SMTP服务器设置为pipe bounce messages directly into a script。这将为您提供完整的退回消息,以及可以告诉您更多有关交货的环境变量。当然,这需要您具有对邮件服务器或具有线索的主机提供商的配置级别的访问。

请注意,弹跳处理是一项非常不愉快的任务,并且很难做好。您可能需要查看Boogie Tools bounce studio之类的第三方弹跳处理程序,以节省一些理智!除了一些非常广泛的顶级标准外,较低级别的一致性也很小,并且反弹通常是无用的。例如,MS Exchange可以产生完全不包含退回邮件的原始目标地址的退回!解决此问题的方法是使用VERP,其中每个地址(甚至每条消息)都有其自己唯一的返回路径,即使消息内容不包含任何线索,也可以让您知道消息从何处退回。