【问题标题】:send email in background process in php在php的后台进程中发送电子邮件
【发布时间】:2014-01-01 10:45:01
【问题描述】:

当用户在我的应用中注册时,我想发送一封欢迎电子邮件。 当用户注册时,他会被重定向到他的个人资料页面。 我尝试在创建用户时发送电子邮件,但 email() 需要 7 秒来发送电子邮件,页面一直等到那时,然后在 7 秒后将用户重定向到配置文件。

这是不希望的。我想在用户注册后立即重定向用户,并在此过程中发送一封电子邮件。需要7秒不知道为什么。我在 godaddy 和 hostgator 帐户以及我的本地主机上在线尝试过。

顺便说一句:我正在使用 PHPMailer 发送电子邮件。

我怎样才能创建一个独立进程,在调用时使用电子邮件 $_POST[] 参数 {to、subject、body} 调用我的 sendMail.php。

虽然 ajax 调用可以解决问题,但是一旦我的页面从注册重定向到配置文件,电子邮件脚本就会停止。 我试过这段代码:

<script language="JavaScript">
    $.post( "sendMail.php", { to: "$to", subject: "$subject", htmlBody: "$htmlBody", altBody: "$altBody" } );
location.href=profile.html
</script>

请帮忙,我搜索了很多,但他们在我不是的 shell 上工作,其他解决方案是基于 unix/linux 的。我想让它在 xampp 和 godaddy linux 共享主机上工作,没有 ssh 访问。

【问题讨论】:

  • 最好的办法是设置一个作业服务器并将这些东西异步传递出去。
  • 将重定向放在你的ajax调用的成功函数中。比如:$.post("sendMail.php", { to: "$to", subject: "$subject", htmlBody: "$htmlBody", altBody: "$altBody" }, function(){location.href= profile.html;});
  • 查看php.net/ignore_user_abort,让您的 PHP 脚本在您的浏览器断开连接时运行
  • 根据 PHP 服务器配置(即:flush() 是否有效),您可以终止与浏览器的连接并继续执行您的脚本。见this question
  • @FC 你的解决方案没问题,但它不能解决我的问题。重定向将在 7 秒后发生。

标签: php email xampp shared-hosting worker-process


【解决方案1】:

您可以使用Mail_Queue,这是一个专门用于发送电子邮件的作业队列,或者使用 Zend_Queue [ZF1ZF2] 编写自定义的内容以使用 PHPMailer。你甚至可以考虑使用Gearman

【讨论】:

  • 我可以使用 REST api 进行异步调用以像使用 nusoap 库一样发送邮件吗?至少 gearman 文档对我来说不是很友好,其他教程也没有太大帮助,它需要一个工作服务器一直运行,这不是我想使用的我不了解 mail_queue 示例。它包含 require_once "Mail/Queue.php";在示例代码中,并没有提及他们从哪里获得这些文件以及其中包含什么。
  • 对于 Mail_Queue 或 Zend_Queue,您需要设置某种形式的 cronjob;或者你可以尝试使用 nusoap、phpmailer 或其他什么的 RESTful API。您需要通过 PEAR 安装程序安装 Mail_Queue 包或从pear.php.net/package/Mail_Queue/download下载文件
【解决方案2】:

您可以尝试将 javascript 放在您的个人资料页面中,以便在他们点击个人资料页面而不是表单提交时运行。只需检查您的 sendMail.php 脚本中是否已经发送了欢迎电子邮件。

但是使用此脚本发送电子邮件可能不是一个好主意,因为它可能使恶意用户能够向他们想要的任何人发送包含他们想要的任何内容的电子邮件,如果它被标记为垃圾邮件,那么它将是你的被阻止的服务器。这是“垃圾邮件发送者”使用的一种非常常见的技术。

在发送电子邮件之前,您必须非常小心处理电子邮件的方式,以免违反您与托管公司的协议。

【讨论】:

  • 你提到的非常好,我没有想到安全漏洞。谢谢你。我还认为从客户端调用发送电子邮件不合适。但如果我从个人资料页面发送电子邮件,我不希望脚本在任何内容上都存在。用户可能会重定向到其他页面或关闭浏览器,因此与我目前遇到的问题相同。
  • 然后你可以在他们点击“保存”后将他们重定向到一个空白页面,该页面包含发送欢迎电子邮件的脚本,还可以使用 include 或 require,添加你想要的任何页面,以便他们得到显示给他们的东西,然后当他们下次登录时,他们只需转到正常的个人资料页面或其他什么。
【解决方案3】:

php 是单线程语言。这意味着您不能在前一个工作执行(并完成)之前开始工作......

您可以更改任务顺序。我的意思是你可以在欢迎页面完全呈现后发送电子邮件。

试试这个顺序;

1) 注册用户

2) 显示欢迎页面,

3) 发送欢迎电子邮件....

使用此命令,您的新用户将无需等待 7 秒即可看到欢迎页面。

【讨论】:

  • 感谢您的输入,但问题是我不希望电子邮件系统成为被告。用户可以重定向到任何其他页面或关闭浏览器。因此脚本不会完成。用户必须在欢迎页面上等待 7 秒才能完成电子邮件处理
  • 是的,但即使您使用 ajax 发送也可能发生这种情况。如果用户关闭或重定向另一个页面,那么您如何发送电子邮件并不重要。任务将被终止...也许您尝试使用 php 注册一个 cronjob 以发送电子邮件(注册一个 cronjob 需要不到一秒钟),然后呈现欢迎页面。 (并在发送电子邮件后,删除 cronjob)
  • 是的 cron 工作似乎是个好主意,我只是不知道如何在 php 中制作一个,现在将谷歌它。谢谢。如果我根据我的问题得到了专门的答案,那将为我的任务提供许多解决方案,我可以在购买完成后使用相同的系统并发送电子邮件。当某个事件发生时,我也可能使用系统来完成一些任务。这个独立的流程系统非常有用,我仍在寻找这样的实现。但是 kguest 为我当前的问题提供了一个很好的来源。试试看。
猜你喜欢
  • 2013-10-01
  • 1970-01-01
  • 2017-10-23
  • 1970-01-01
  • 2011-09-13
  • 2013-10-07
  • 2015-08-07
  • 1970-01-01
  • 2015-03-08
相关资源
最近更新 更多