2010-03-30 48 views
4

好吧,这可能需要一个或两个瞬间来解释:处理传入邮件到多个收件人在PHP

我正在创建一个电子邮件<>短信大桥(如TeleFlip系统)。我有几组参数的工作:

  • Dreamhost的虚拟主机
  • PHP 5中(不含PEAR)
  • 后缀
  • MySQL的(如果需要)

我有什么权利现在,是一个全面的电子邮件地址,用于转发发送到shell帐户的电子邮件。 shell帐户反过来将其转发给我的PHP脚本。

PHP脚本读取它,剥去几个电子邮件标题以确保它正确发送,然后将其转发给指定为收件人的号码。 [email protected]当然会发送短信至+1(555)123-4567。

这很有效,因为我正在解析收件人字段并只抓取发送给它的电子邮件地址。但是,我意识到我没有考虑的是多个收件人。例如,发送给5551234567和1235554567的电子邮件(使用“收件人”行,“抄送”行或其任意组合)。

当然,电子邮件的工作方式是我收到两封收到的邮件,最后分别解析每封邮件,最后5551234567最终得到相同的邮件两次。

什么是处理这种情况的最佳方法,以便在TO和CC中指定的每个数字都可以获得消息的一个副本。

另外,虽然我怀疑它是否可能:有没有办法以相同的方式处理BCC?

回答

0

虽然wimvds在这里有最好的答案,但我在其他地方发现,Dreamhost在我通过系统运行它的方式中包含一个“X-DH-Original-To”头文件。使用此功能,我可以在收到电子邮件时单独发送给每个号码,而无需在数据库中进行检查。这也应该与Blind Carbon Copy一起工作(我不知道电子邮件的工作原理足以告诉你这是如何工作的)。

0

愚蠢的肮脏的解决方案:解析邮件中的所有收件人,然后发送他们的短信,然后将他们全部放入临时表与消息文本的MD5。并检查所有传入的邮件对这张桌子。

1

为什么不使用诸如imap之类的东西来检查catch-all邮箱,循环查看邮件,然后在完成后删除它们?这样你就不需要转发他们到一个单独的帐户。

+0

这是我用类似的项目所做的。这里的缺点是我必须使用带宽连接和滚动IMAP,这是一个很脏,以及有一个cronjob设置为通过IMAP轮询。它也使转发电子邮件脏(或我缺乏知识)。现在我已经设置了它的方式,它将电子邮件直接推送到脚本,并且可以在收到邮件后立即发送。 – Navarr 2010-03-30 19:16:48

2

如果您检查邮件的标题,您应该找到一个消息ID字段(根据RFC2822 - section 3.6.4)。因此,您可以测试您是否已经为具有相同消息ID &电话号码的邮件发送短信,以防止将同一邮件发送给同一号码两次。

+0

消息ID始终是静态的权利? 所以我们可以说我在TO领域有两个发件人,在CC领域有三个 - 我可以将该消息ID作为MySQL中的唯一密钥存储,然后当我收到其他四封电子邮件时,我会查看如果该ID已经在数据库中,并且如果它是我可以丢弃它们? – Navarr 2010-03-30 19:18:12

+0

根据RFC它应该唯一匹配一个邮件消息,因此它应该是一致的静态,你可以放弃具有相同的消息ID的副本。 – wimvds 2010-03-30 19:58:34

+0

我只是跑了一个简单的测试,它似乎是这种情况!谢谢。 现在,如果只有我可以让密件抄送工作,但我怀疑可能会发生,因为,它的密件抄送。 – Navarr 2010-03-30 20:04:18