通过 PhpMailer 异步发送电子邮件

2024-02-05

我正在使用 PHPMailer 发送电子邮件,效果很好。但问题是,由于它同步发送电子邮件,因此后续页面加载需要很长时间。

我正在使用 PhpMailer,如本示例所示https://github.com/PHPMailer/PHPMailer/blob/master/examples/gmail.phps https://github.com/PHPMailer/PHPMailer/blob/master/examples/gmail.phps

我想知道是否有办法使电子邮件发送异步。我对此进行了研究,发现 sendmail 有一个选项可以将 DeliveryMode 设置为“后台模式” - 来源http://php.net/manual/en/function.mail.php http://php.net/manual/en/function.mail.php

mail($to, $subject, $message, $headers, 'O DeliveryMode=b');

我想知道 PhpMailer 是否可以做类似的事情?有人在这方面取得过成功吗?

编辑:-(附加信息)看来 PhpMailer 可以配置为使用 sendmail -https://github.com/PHPMailer/PHPMailer/blob/master/class.phpmailer.php https://github.com/PHPMailer/PHPMailer/blob/master/class.phpmailer.php因此我想知道是否可以以某种方式利用它来实现后台交付。

/**
 * Which method to use to send mail.
 * Options: "mail", "sendmail", or "smtp".
 * @type string
 */
public $Mailer = 'mail';

/**
 * The path to the sendmail program.
 * @type string
 */
public $Sendmail = '/usr/sbin/sendmail';
/**
 * Whether mail() uses a fully sendmail-compatible MTA.
 * One which supports sendmail's "-oi -f" options.
 * @type boolean
 */
public $UseSendmailOptions = true;

/**
 * Send messages using $Sendmail.
 * @return void
 */
public function isSendmail()
{
    $ini_sendmail_path = ini_get('sendmail_path');
    if (!stristr($ini_sendmail_path, 'sendmail')) {
        $this->Sendmail = '/usr/sbin/sendmail';
    } else {
        $this->Sendmail = $ini_sendmail_path;
    }
    $this->Mailer = 'sendmail';
}

另外 - 显然有办法通过 php.ini 设置 sendmail 选项http://blog.oneiroi.co.uk/linux/php/php-mail-making-it-not-suck-using-sendmail/ http://blog.oneiroi.co.uk/linux/php/php-mail-making-it-not-suck-using-sendmail/

我更愿意将其作为 api 调用与 php.ini 的内联参数来执行,这样这不是全局更改。有人试过这个吗?


错误的做法。

PHPMailer 不是邮件服务器,这正是您所要求的。 SMTP 是一种冗长、繁琐的协议,容易出现延迟和吞吐量缓慢,并且绝对不适合在典型的网页提交期间以交互方式发送(这就是 BlackHatSamurai 链接到的问题可能正在做的事情)。许多人确实这么做了,但不要误以为这是一个好的解决方案,也绝对不要尝试自己实施 MTA。

您链接到的 gmail 示例使用 SMTP 发送到远程服务器,这总是比本地提交慢。如果您通过 sendmail 提交(或mail()- 这基本上是相同的事情)到本地服务器并且花费了大约 0.1 秒以上,你正在做一些非常错误的事情。即使 SMTP 到本地主机也不会花费太长时间,并且发送到附近的智能主机也不太可能太慢。

尝试使用线程进行后台处理是一大堆蠕虫,这完全不是解决此问题的方法 - 无论您以这种方式实现什么,与适当的邮件服务器相比都会很糟糕。只是不要这样做。

正确的方法是安装本地邮件服务器,并使用 PHPMailer 向其提交邮件。这种方式非常快(每秒数百条消息),而且你必须精确地做nothing让它工作,因为这就是 PHPMailer 默认的工作方式。

然后,邮件服务器将执行其应该执行的操作 - 对您的邮件进行排队、处理连接问题、延迟投递、退回邮件以及您未考虑到的所有其他操作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过 PhpMailer 异步发送电子邮件 的相关文章

  • AWS S3从本地主机批量上传php错误

    我在尝试着批次 散装从本地主机 xampp 上传到我的S3 bucket 它似乎适用于大约 6 个项目 然后我收到一条错误消息 cURL 错误说Failed sending network data from http curl haxx
  • SetInterval 函数不适用于 PHP 文件

    我有这样的index html
  • 内连接 3 个表

    我正在使用 PHP 和 PDO 我需要重新收集连接 3 个表的信息 photos albums 相册照片 该表具有以下结构 photos photo id int path varchar nick varchar date timesta
  • Codeigniter PHP - 在锚点加载视图

    我在一个长页面的底部有一个表单 如果用户填写了表单但它不验证页面是否以典型的 codeigniter 方式重新加载 this gt load gt view template data 然而 由于表单位于页面底部 我需要将页面加载到那里 就
  • CakePHP Auth 组件使用 $this->Auth->login() 时未登录;

    我是 cakePHP 的新手 我已经阅读了他们的文档 并且正在遵循他们的简单身份验证示例 我还广泛搜索 包括本网站上的答案 来寻找我的问题的答案 我正在使用 cakePHP 2 0 我的 UsersController 的登录功能如下所示
  • PHP 删除字符最后一个实例之前的所有内容

    有没有办法删除某个字符之前的所有内容 包括最后一个实例 我有多个字符串 其中包含 gt e g the gt cat gt sat gt on gt the gt mat welcome gt home 我需要对字符串进行格式化 以便它们变
  • 将 PHP 中的 openssl AES 转换为 Python AES

    我有一个 php 文件 如下所示 encryption encoded key c7e1wJFz PBwQix80D1MbIwwOmOceZOzFGoidzDkF5g function my encrypt data key encrypt
  • 使用 PHP 更新 XML 节点

    我有一个 XML 文件 test xml
  • Symfony 生成器形式、原则和 M:N 关系

    我有一个基本的 M N 设置 包含三个表 candidate position 和 Candidate position 这是 MySQL Workbench 的 ERD 屏幕截图 现在 我们继续讨论表单 在 symfony 生成器的默认世
  • 查明具有特定 ID 的会话是否已过期

    我正在创建一个上传功能 将用户上传的文件存储在服务器上 并以用户的会话 ID 作为名称 现在 我只想将此文件保留在服务器上 直到该会话处于活动状态 所以 我的问题是 如何根据会话 ID 确定会话是活动的还是过期的 以便在后一种情况下我可以安
  • 从检查元素隐藏 ''

    我有这个 HTML 和 PHP 联系表
  • 2 使用我的代码在数组中查询

    我使用滑块来显示我的 WordPress 精选文章 它选择一个自定义类别并返回一定数量的帖子 如何将显示的第一篇帖子设为自定义帖子 我可以直接在滑块代码中添加特定帖子的 ID吗使该帖子首先出现 然后是原始查询返回的其他内容 例如 在页面上
  • PHP-如何根据条件配对数组中的项目

    如何将数组中的项目配对 假设我有一个数组Fighters 我想根据他们的情况将他们配对Weights 体重最接近的拳手应作为配对最佳匹配 但如果他们是在同一个团队中 他们不应该配对 团队 1 战斗机A体重为60 战斗机B体重为65 2队 战
  • 创建单个随机 Magento 优惠券

    我遇到了一些麻烦 我想要做的是每次有人订阅我们的时事通讯时 在 Magento 中自动生成一个随机优惠券代码 这张优惠券可减 10 美元 并且有exp 订阅后两周的日期 因此 我正在尝试编写一个简单的脚本 当提交 订阅我们的时事通讯 表单时
  • sqlite3和pdo_sqlite有什么区别

    我正在将我的 Web 应用程序从 MySQL 迁移到 SQLite 数据库 我发现有两个 PHP 扩展用于与 sqlite 通信 php sqlite3 dll and php pdo sqlite dll 什么扩展比较好 或者另一个问题
  • PHP 中根据相似值对数组进行分组

    我有一个具有以下结构的数组
  • 我如何向 Windows Server IIS 7 中的文件夹授予权限

    我是 PHP 和 Windows Server 新手 在查看我在 PHP 中创建的表单时遇到以下错误 Error in exception handler The stream or file C inetpub wwwroot wrp a
  • 使用 Webmin 设置 cron 作业

    我正在尝试使用 Webmin 设置一个 Cron 作业每 5 分钟运行一次 它需要定位 php 文件并运行该文件中的 php 脚本 当我在 命令 字段中输入文件路径时 它不起作用 我只是想知道我做错了什么 以及我需要 Cron 作业运行的文
  • Mysql加密/存储敏感数据,

    我的 PHP 网站有以下内容 启用 SSL 饼干 session set cookie params cookieParams lifetime cookieParams path cookieParams domain secure ht
  • 如何统计订单总价?

    我有这些表 Orders id status user id address id 1 await 1 1 products id name price quantity 1 test1 100 5 2 test2 50 5 order p

随机推荐