如何在 PHP 中向用户发送每日电子邮件通知?

Posted

技术标签:

【中文标题】如何在 PHP 中向用户发送每日电子邮件通知?【英文标题】:How can I send a daily email notification to users in PHP? 【发布时间】:2011-08-27 09:56:57 【问题描述】:

我有一个简单的用户注册表单,带有一个复选框,如果他们的任何项目有活动,用户可以每天收到电子邮件通知......就像 Stack Overflow 有一个“每天通知 xxx@example.com 任何新的答案”。

我目前在 LAMP 环境中实现此功能的想法如下:

    如果用户希望每天收到一封电子邮件,请在用户数据库中设置一个布尔值。

    如果有任何项目活动,项目将使用当前时间戳进行更新。

    每天晚上(午夜),都会执行一个 php 文件(可能通过 cron 作业),该文件会扫描项目数据库以识别当天哪些项目有活动。对于有活动的项目,选择项目所有者名称并扫描用户表以检查用户是否希望接收每日电子邮件通知。如果是,添加到收件人列表;否则,忽略。

在我开始实施之前,我希望得到一些指导的问题/疑虑:

    我在共享主机环境中。我需要采取哪些预防措施以免被托管公司或接收邮件服务器误识别为垃圾邮件?

    我是否需要“分块”出收件人列表(一次 50 封电子邮件)并向每个组发送电子邮件?这就像放一个 sleep(30) 一样简单吗?在每次调用 mail() 之间?

    我正在使用 CodeIgniter 框架,并将让 cron 作业在控制器中调用适当的函数以在午夜运行它。如何限制仅来自 cron 作业的调用,以防止某些未经授权的用户从浏览器调用此函数?

谢谢。

【问题讨论】:

【参考方案1】:

    如果您确实更改了 php 中的“发件人”标头,请确保将其更改为该服务器上托管的域。当 b.com 的服务器发送邮件 @a.com 时,它看起来很可疑。

    我会单独发送电子邮件foreach ($Users as $User)...,因为这允许您个性化电子邮件内容。即使您现在不需要对电子邮件进行个性化设置,您也可能需要稍后再进行,并且在您需要时已经提供了对它的支持。

    首先,我会将脚本存储在 Web 根目录之外。我不确定 CodeIgniter 是否会让你这样做,但脚本不需要由 Apache 提供。 Cron 不关心脚本的存储位置。此外,我检查了脚本执行的时间。如果不是午夜,那就不要发邮件了。此外,您可以保留日志,并在发送前检查以确保当天尚未发送电子邮件。

【讨论】:

回复。 #3:我假设如果我在 webroot 上保留一个 PHP 文件,CodeIgniter 真的不应该关心。我也可以让 cron 位于 webroot 之上,并调用 PHP 脚本来扫描数据库,构建收件人列表,然后在午夜向每个用户发送电子邮件。没有? Cron 作为 linux 程序运行,因此它可以访问它运行的用户可以访问的每个文件。【参考方案2】:

1) 如果可以的话,从 SPF 记录和 DKIM 开始,让邮件服务器知道期待来自您的服务器的电子邮件

2) 首先,您需要将收件人放在密件抄送字段中,这样就不是每个用户都拥有您系统上其他 49 个用户的电子邮件地址。更进一步的是分别处理每封电子邮件,仅将收件人放在 TO 字段中。这种方法还允许您为用户定制每封电子邮件(也许输入“Hi [First name]”。

3) 让 cron 工作像这样 wget @987654321@

然后在您的脚本中,检查$_SERVER 并确保您只允许来自 127.0.0.1 的请求

【讨论】:

【参考方案3】:

关于第三个问题:您可以使用 .htaccess 文件来阻止访问该特定页面,也可以使用命令行参数在 cron 中调用脚本并在 $argv 中检查该变量。

【讨论】:

【参考方案4】:

1) SPF 记录是最重要的。使用来自域 sowhatever@whatever.com 的电子邮件,其中whatever.com 的 SPF 记录设置正确。

2) 限制电子邮件总是好的,尤其是刚开始时。您应该检查您的共享服务器策略,通常是 200-500/小时。计算多少秒。例如 300/hour 是每 12 秒 1 次。在发送好邮件几周后,您应该可以发送更多的邮件了。

3) 您可以将 cron 文件放在 webroot 之外,或者通过 .htaccess 或其他方法限制访问。

【讨论】:

回复。 #1:我在一个共享主机帐户上,并在其上托管了一些我自己的域(我相信无数其他人也驻留在同一台机器上)。如果我在 DNS 中为 mydomain.com 设置 SPF 记录,这就足够了吗? SPF 记录是接收邮件服务器检查以确定电子邮件是否为垃圾邮件的一项内容吗? 最好获得一个专用 IP,通常每月几块钱或有时免费,具体取决于套餐,但如果您不想要,通常只需设置 SPF 即可正确记录。 SPF 是垃圾邮件设置中的一个重要因素。您仍然需要确保您的内容是合法的,并且您没有使用过多的垃圾邮件关键字/短语,但确保 SPF 记录与服务器发送相匹配是告诉接收邮件服务器该邮件是合法的重要部分。

以上是关于如何在 PHP 中向用户发送每日电子邮件通知?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Jenkins 中向开发人员发送构建失败的电子邮件通知

在 PHP 中向特定用户推送通知

在 Laravel 5.4 中向多个抄送收件人发送电子邮件

Excel VBA:如何在 Outlook 中向组发送电子邮件?

如何在spring mvc中向特定的电子邮件ID发送电子邮件

提交数据库php后如何处理电子邮件发送失败