Zend \ Mail因Gmail失败,但SwiftMailer缺少用于开发/测试的文件传输。该怎么办?

时间:2015-12-24 04:41:41

标签: php swiftmailer zend-mail

我已成功使用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()以简单地将消息写入磁盘,并查询$环境以决定是否实例化真实事物或不真正发送的子类。

但我很想听听其他一些想法和建议。

2 个答案:

答案 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上制作公关,以造福所有众生。