PHP中处理发送给多个收件人的电子邮件

4
好的,这可能需要一两分钟来解释:
我正在创建一个电子邮件<>短信桥接器(类似于Teleflip)。 我有一些固定的参数要使用:
- Dreamhost Webhosting - PHP 5(不带PEAR) - Postfix - MySQL(如有需要)
现在我有一个catch-all电子邮件地址,它将发送到shell帐户的电子邮件转发。 然后,shell帐户将其转发到我的PHP脚本。
PHP脚本读取它,剥离一些电子邮件头,以确保它正确发送,然后将其转发到指定为收件人的号码。 当然,5551234567@sms.bridge.gvoms.com会发送SMS到+1(555)123-4567。
这非常有效,因为我正在解析To字段并仅获取它发送到的电子邮件地址。 但是,我意识到我没有考虑多个收件人。 例如,使用To行,CC行或任何组合发送到5551234567和1235554567的电子邮件。
当然,电子邮件的工作方式是,我会收到两封电子邮件,最终将它们分别解析,而5551234567最终会收到相同的消息两次。
处理此情况的最佳方法是什么,以便TO和CC中指定的每个号码都可以获得一份消息。
此外,虽然我怀疑可能性不大:是否有一种处理BCC的方式?
4个回答

2

如果您查看邮件的头信息,应该会找到一个Message-ID字段(根据RFC2822 - section 3.6.4)。因此,您可以通过测试是否已经向具有相同Message-ID和电话号码的邮件发送了短信,以防止向同一号码发送重复消息。


Message-ID是一直不变的,对吗?那么假设我有一个电子邮件,TO字段中有两个发件人,CC字段中有三个发件人- 我可以将该Message-ID作为MySQL中唯一的键来存储,当我收到其他四封电子邮件时,我会检查该ID是否已经在数据库中,如果是,我就可以将它们丢弃? - Navarr
根据RFC规范,它应该唯一匹配一个邮件消息,因此它应该始终保持静态,并且您确实可以丢弃具有相同Message-ID的副本。 - wimvds
我刚刚运行了一个简单的测试,似乎是这样的!谢谢。现在如果我能让BCC工作就好了,虽然我怀疑这可能永远不会发生,因为它是BCC。 - Navarr

1
为什么不使用类似 imap 的东西来检查 catch-all 邮箱,循环遍历消息,完成后再将其删除?这样你就不需要将它们转发到单独的帐户了。

这是我在类似项目中所做的。缺点是我必须使用带宽连接和滚动 IMAP,这更加繁琐,而且必须设置 cronjob 轮询 IMAP。这也会使邮件转发更加复杂(或者是我的知识不足)。现在我将其设置为直接将电子邮件推送到脚本,并可以在收到电子邮件后立即发送。 - Navarr

0
愚蠢而肮脏的解决方案:从邮件中解析出所有收件人,然后发送短信给他们,再将它们全部放入临时表中,带有消息文本的md5。并检查所有传入邮件与此表相匹配。

0
虽然wimvds在这里给出了最好的答案,但我在其他地方发现Dreamhost在我通过系统运行它时包含了“X-DH-Original-To”标头。使用这个,我可以在收到邮件后单独向每个号码发送,而不用检查它是否匹配数据库。这也应该适用于暗送副本(我不知道电子邮件的具体工作原理)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接