本文概述
当你将SwiftMailer与Gmail帐户一起使用来发送电子邮件时(即使你使用Laravel, Symfony CakePHP之类的框架), 此问题也不是很常见, 并且会发生。一些开发人员也遇到了同样的问题, 该代码在你的开发计算机中本地运行, 但在部署服务器上未按预期工作。
许多开发人员在使用Swift Mailer和Gmail发送电子邮件时都遇到了这个问题, 可惜每种可能的解决方案可能并不适用于所有人。在本文中, 我们将分享一些可能的解决方案, 它们可能有助于解决你项目中的这个问题。
1. gethostbyname也许是你的敌人还是盟友
PHP的gethostbyname函数获取与给定Internet主机名相对应的IPv4地址。在某些情况下, 此功能有助于使代码正常工作, 但对于另一些将smtp地址作为字符串提供的方法则可以解决问题(我们建议你同时测试一下, 看看会发生什么情况):
<?php
// For some users works using the gethostbyname function
$smtp_host_ip = gethostbyname('smtp.gmail.com');
// But for others only the smtp address
$smtp_host_ip = 'smtp.gmail.com';
$transport = \Swift_SmtpTransport::newInstance($smtp_host_ip, 465, 'ssl')->setUsername('qweqwe@qweqweqew.com')->setPassword('qweqwe+');
$mailer = \Swift_Mailer::newInstance($transport);
$message = \Swift_Message::newInstance()
->setFrom(array("john@doe.com" => 'John Doe'))
->setTo(array("john@doe.com" => 'John Doe'));
$message->setBody('<h3>Contact message</h3>', 'text/html');
$mailer->send($message);
2.更改Gmail的SMTP
你可以使用SMTP, SSL / TLS连接到Gmail邮件服务器。要使用Swift Mailer做到这一点, 你需要在端口465上连接到smtp.gmail.com, 但是, 如果你在尝试发送电子邮件时收到上述异常, 请更改gmail的smtp地址, 而不要使用smtp.gmail.com以下任何IP或地址:
- 173.194.65.108
- 173.194.205.108
- 74.125.133.108
- gmail-smtp-msa.l.google.com
建议你使用服务器中的终端对smtp.gmail.com地址进行ping操作, 该地址应打印可用于发送电子邮件的SMTP的IP地址:
如前所述, 这在某些情况下可能有效。
3.如果你使用Symfony
如果你在symfony项目中工作, 使用SwiftMailer发送电子邮件的代码可能类似于:
public function indexAction($name)
{
$message = \Swift_Message::newInstance()
->setSubject('Hello Email')
->setFrom('send@example.com')
->setTo('recipient@example.com')
->setBody(
$this->renderView(
// app/Resources/views/Emails/registration.html.twig
'Emails/registration.html.twig', array('name' => $name)
), 'text/html'
)
/*
* If you also want to include a plaintext version of the message
->addPart(
$this->renderView(
'Emails/registration.txt.twig', array('name' => $name)
), 'text/plain'
)
*/
;
$this->get('mailer')->send($message);
return $this->render(...);
}
无论通过哪种方式, 你的代码都无法直接处理凭据, 因为它们是通过parameters.yml文件或config.yml检索的, 这可能会帮助你解决问题。首先修改你的parameter.yml(或根据你的工作流配置config.yml)中的传输选项:
# Swiftmailer Configuration
swiftmailer:
transport: mail
然后将假脱机类型设置为内存:
# app/config/config.yml
swiftmailer:
# ...
spool: { type: memory }
或在parameters.yml中(根据你的工作流程):
# app/config/parameters.yml
parameters:
spool: { type: memory }
当你使用SwiftmailerBundle从Symfony应用程序发送电子邮件时, 默认情况下将立即发送电子邮件。但是, 你可能希望避免Swift Mailer和电子邮件传输之间的通信性能下降, 这可能导致用户在发送电子邮件时等待下一页加载。通过选择”假脱机”电子邮件而不是直接发送电子邮件, 可以避免这种情况。这意味着Swift Mailer不会尝试发送电子邮件, 而是将消息保存到文件等位置。然后可以从后台处理程序中读取另一个进程, 并负责在后台处理程序中发送电子邮件。目前, Swift Mailer仅支持后台处理到文件或内存。
愿力量与你同在, 祝你编程愉快!
评论前必须登录!
注册