我已成功使用ZF1中的Zend_Mail连接到使用SMTP的GMail帐户,但无法使其与Zend \ Mail一起使用。以下产生了“连接超时”异常:
use Zend\Mail\Message;
use Zend\Mail\Transport\Smtp as SmtpTransport;
use Zend\Mail\Transport\SmtpOptions;
$transport = new SmtpTransport();
$options = new SmtpOptions([
'host' => 'smtp.gmail.com',
'connection_class' => 'login',
'connection_config' => [
'username' => 'my_username@gmail.com',
'password' => 'redacted',
'port' => 587,
'ssl' => 'tls',
],
]);
$transport->setOptions($options);
$message = new Message();
$message->addTo('recipient@example.org')
->setFrom('me@example.org')
->setSubject('hello, fool!')
->setBody("testing one two three! time is now ".date('r'));
$transport->send($message);
然而!当我使用PHP Swiftmailer,以及Python和旧的Zend_Mail执行上述操作时,相同的连接参数工作正常。所有这一切当然都在相同的环境中(我的Ubuntu 14.04盒子)。所以,我认为Zend \ Mail肯定存在问题 - 或者更确切地说是Zend \ Mail \ Transport \ Smtp。
不幸的是,我没有足够的英雄(而且缺乏技能)深入了解Zend \ Mail \ Transport \ Smtp并修复它,所以我接下来转向Swiftmailer(http://swiftmailer.org/)。而且效果很好,
$transport = Swift_SmtpTransport::newInstance('smtp.gmail.com', 587, 'tls');
$transport->setUsername('my_username@gmail.com')
->setPassword('redacted');
$mailer = Swift_Mailer::newInstance($transport);
$message = Swift_Message::newInstance();
$message->setSubject("testing from Swiftmailer")
->setFrom("me@example.org")
->setTo('recipient@example.org')
->setBody("yadda yadda blah blah blah!");
$result = $mailer->send($message); // nice and easy!
但缺少一个不错的功能:Zend \ Mail有一个文件传输,它只是将你的消息转储到一个文件,非常便于开发和测试,当你真的不想向任何人发送电子邮件时。
怎么办?我熟悉将“环境”环境变量设置为“开发”,“生产”等的配置技巧,并使我的代码决定如何相应地配置自身。但到目前为止,在我的思想实验中,这有点尴尬。
一个想法:子类Swift_Mailer并覆盖send()
以简单地将消息写入磁盘,并查询$环境以决定是否实例化真实事物或不真正发送的子类。
但我很想听听其他一些想法和建议。
答案 0 :(得分:1)
对于swiftmailer,您可以将SpoolTransport与FileSpool一起使用,以将消息存储到文件系统。 Example(Norio Suzuki):
/**
* 270-transport-spool-file.php
*/
require_once '../vendor/autoload.php';
require_once './config.php';
// POINT of this sample
$path = FILE_SPOOL_PATH;
$spool = new Swift_FileSpool($path);
$transport = Swift_SpoolTransport::newInstance($spool);
$mailer = Swift_Mailer::newInstance($transport);
$message = Swift_Message::newInstance();
$message
->setFrom(MAIL_FROM)
->setTo(MAIL_TO)
->setSubject('SpoolTransport (file) sample')
->setBody('This is a mail.')
;
// Serialized Swift_Message objects were spooled to $path
$result = $mailer->send($message);
答案 1 :(得分:0)
好的,这是一个由两部分组成的答案,您可以选择。
回答#1:不要担心写入文件,只需使用Swiftmailer的无证Swift_NullTransport
,如下所示:
$transport = new Swift_NullTransport::newInstance();
/* and so forth */
Swift_Transport_NullTransport的send()
方法(Swift_NullTransport的父方法)什么都不做,只是表现得好像,在我的情况下就像转储到文件一样好。
答案#2:以某种方式滚动自己,例如,(a)通过扩展其中一个传输类并覆盖send()
,或(b)编写另一个send()
写入文件的传输然后在Github上制作公关,以造福所有众生。