首页 > 解决方案 > SwiftMailer 的 SMTP 超时设置与什么有关?

问题描述

使用 SwiftMailer 时Swift_SmtpTransport有一个timeout设置。

https://symfony.com/doc/current/reference/configuration/swiftmailer.html#timeout

这是指什么?它只是用于登录服务器的超时时间,还是用于登录和发送消息的完整操作?

我遇到了这个问题,因为我注意到如果您使用无效的 SMTP 凭据,脚本将需要 30 秒才能继续执行——这对于公共网站来说太长了。在无效凭据(例如,它们被更改)或服务器关闭的情况下,使用setTimeout(5)似乎更容易接受。

如果这只是登录到 SMTP 服务器,我认为 5 秒绰绰有余。如果这也是发送消息,我仍然认为这对于发送少量电子邮件来说是可以的。我已经做了一些测试电子邮件,到目前为止看起来还不错,但想在使用它之前检查一下。

标签: phpswiftmailer

解决方案


在 PHP 中使用流套接字时,有两个超时:

  1. 连接超时,(查看超时参数
  2. 在套接字上写入或读取数据时的超时(使用fread或 fwrite)

fread 文档说:

数据包可用或发生套接字超时(对于网络流)

似乎这个超时参数用于 Swiftmailer 中的三个任务:

  1. 连接到 smtp 服务器超时。
  2. 写邮件超时。(这里是设置写入数据超时的代码示例)
  3. 第三个,用于取决于邮件大小的整个过程(如RFC2821中所述)

但是,如果您不想在向用户发送响应之前等待邮件发送完毕,您应该查看messenger 组件。您将拥有两个异步进程,而不是只有一个进程。您的控制器将不再等待邮件发送,它只会向信使组件发送一条消息(“请向此新用户发送注册邮件”)。信使组件将启动一些操作来发送此邮件。状态字段通常用于了解邮件是否成功发送。Fabien Patencier 写了一本书“Symfony the Fast Track”,其中包含一个有用且完整的示例。


推荐阅读