SwiftMailer为什么无法发送邮件?

8

SwiftMail无法发送我的电子邮件,而mail()可以工作。与这里相同。

我添加了EchoLogger但它没有打印任何内容。

$message = Swift_Message::newInstance();
$message->setSubject('Test');
$message->setTo( $email );
$message->setFrom(ABSENDER);
$message->setBody($nl_text);

$transport = Swift_MailTransport::newInstance();
$mailer = Swift_Mailer::newInstance($transport);

$logger = new Swift_Plugins_Loggers_EchoLogger();
$mailer->registerPlugin(new Swift_Plugins_LoggerPlugin($logger));

$result = $mailer->send($message, $failures);
var_dump($failures);

邮件被退回,原因在于$failures,但是为什么呢?

更新

Swift_Transport_SimpleMailInvoker::mail中,我转储了参数并得到了这个结果:

  $headers =>
  string(208) "Message-ID: <1337173064.4fb3a4480b8dd@domain.de>
Date: Wed, 16 May 2012 14:57:44 +0200
From: news@domain.de
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
"
  $extraParams =>
  string(15) "-fnews@domain.de"

$to, $subject, $body与我在mail()中使用的相同。仍然不知道问题出在哪里。

更新 #2

对我来说,这个方法很有效:

mail($email, 'Test', $nl_text, "From: " . ABSENDER);

免责声明:这不是一个解决方案,而是我使用的变通方法,因为我没有时间调试框架并找到真正的解决方案。请随意使用上面提供的信息来自行调试,并在此处发布您的解决方案。我将乐意接受并点赞。


你能解决这个问题吗? - KutePHP
我的解决方案是将其替换为简单的 mail($email, 'Anmeldung', $nl_text, "From: " . ABSENDER);,但这并没有解决问题,所以我被投了反对票,最后删除了我的答案。该问题需要进行一些调试,但我没有时间去做。 - PiTheNumber
不错,你应该把它发布为答案。 - PiTheNumber
7个回答

8

我建议您使用调试器并逐步查看send()后面的代码。

如果您无法使用调试器,您应该查看lib/classes/Swift/Transport/SimpleMailInvoker.php中的mail函数。在内部邮件函数中有一个带有关闭运算符(´@´)的调用。也许删除此运算符可以向您显示错误消息。您还可以使用var_dump()来转储传递的参数。


7

我曾经遇到过同样的问题。

根据swiftmailer.org文档,Swift_MailTransport::newInstance()默认使用参数-f%s,这就是为什么你得到了"-fnews@domain.de",为了解决这个问题,在-f %s之间加上空格。

现在你的代码看起来应该像这样:$message = Swift_Message::newInstance('-f %s');

我通过向__construct()传递null来解决了这个问题。所以我的工作代码看起来像这样:

$message = Swift_Message::newInstance(null);

希望对某些人有所帮助。

P.S. 我使用Postfix发送电子邮件。


6

我成功解决了这个问题,原因是我的发件人头部中使用的是 noReply@mydomain.com 而这个邮箱账户并不存在。我创建了 noReply@mydomain.com ,邮件系统开始正常工作。希望我的经历能够帮助到其他人。


1
有趣的是,这对我起作用了。发件人字段中不存在的电子邮件地址将无法投递。 - kakoma
1
是的 - (我是长期使用Swift的用户)如果没有有效的“回复”会非常恼人,它会无错误地失败。 - anoldermark

2
看起来您正在使用默认的传输机制,根据SwiftMailer文档,默认情况下使用mail()。使用此传输时会有以下严重缺点:
  • 不可预测的消息标题
  • 缺乏有关交付失败的反馈
  • 不支持需要实时交付反馈的几个插件

来源

如果我在调试此问题,我将查找SwiftMailer的mail()函数实现,并转储它传递的参数并将其与您自己工作的版本的mail()进行比较。虽然我没有使用过SwiftMailer,但这似乎是一种快速的解决方案。

我已经做了那个(请参见更新)。尽管如此,我认为我会直接使用邮件。感谢你的努力! - PiTheNumber
1
你已经排除了罪犯可能在$to、$subject或$body的可能性。使用SwiftMailer生成的完全相同的标头(您不应该收到电子邮件)。然后,逐个删除每个标头并重新测试,直到找到导致失败的标头或标头。如有必要,请重复使用$extraParams。从那里,您将知道具体问题是什么,并有能力寻找比mail()更好的解决方案 :) - Mike B

1
我在Symfony中发现,如果我只是用"exit()"退出函数,Swiftmailer不会发送邮件,但如果我以

return new Response();结束,它就能成功发送。所以我不确定。


据我所记,邮件被排队,只有在内核终止时才会发送。所以这是正常的。 - Pierre-Olivier Vares

1
问题出在Swift_Transport_MailTransport类的private $_extraParams = '-f%s'属性上。
标志'-f'(请参见您的代码:string(15) "-fnews@domain.de")在某些情况下会失败。Code Igniter也有同样的“bug”。

谢谢,你能添加更多信息吗?它是什么时候失败的?链接到Code Igniter bug,...现在它并没有解释问题是什么以及如何修复它。 - PiTheNumber

-2

这可能是很老的问题,我遇到了同样的问题,当我使用一个更短的发件人电子邮件时,我解决了它。看起来@符号后的最大长度为10。这是我目前测试过的。

例如:

$sname = 'noreply@system.com';
->setFrom(array($sname => 'Some Header Title here'));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接