40

我正在编写一个简单的脚本,其中使用 gmail 帐户向自己发送电子邮件。

我从 SwiftMailer's reference更改了脚本,但没有得到任何结果。怎么了?

编辑:经过进一步调试,我发现该语句

$result = $mailer->send($message);

导致代码失败(它下面的回声不打印)。

为什么是这样?只是因为没有发送消息程序崩溃?:/

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>

<body>
<?php
    require_once '/var/www/swift/lib/swift_required.php';
    echo 'Mail sent <br />';  

/*  //create the transport
    $transport = Swift_SmtpTransport::newInstance('smtp.gmail.com', 587);
      ->setUsername('softrain.evaluaciones@gmail.com')
      ->setPassword('softrain1234')
    ;
*/

    $transport = Swift_SmtpTransport::newInstance('smtp.gmail.com', 587)
      ->setUsername('softrain.evaluaciones@gmail.com')
      ->setPassword('password')
    ;

    echo 'line 40 <br />';
    $mailer = Swift_Mailer::newInstance($transport);
    $message = Swift_Message::newInstance('Wonderful Subject')
      ->setFrom(array('softrain.evaluaciones@gmail.com' => 'Evaluaciones'))
      ->setTo(array('softrain.evaluaciones@gmail.com'=> 'A name'))
      ->setBody('Test Message Body')
    ;
    echo 'line 52 <br />';

    $result = $mailer->send($message);
    echo $result;
    echo 'line 58 <br />';

?>
</body>
</html>

测试表格:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
    <head>
       <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
        <title>Test Mail Script</title>
    </head>
    <body>
        <form action="scriptmail.php" method="post">
            <input type="submit"/>
            </table>
        </form>
  </body>
</html>
4

6 回答 6

89

并不是要复活旧帖子,而是以防万一其他人正在寻找答案,并且因为尽管年龄已老,但在我寻找解决方案的过程中还是出现了这篇帖子。

使用 PHP SwiftMailer 连接到 Gmail 或 Google Apps 电子邮件帐户时,您需要使用以下内容

$transporter = Swift_SmtpTransport::newInstance('smtp.gmail.com', 465, 'ssl')
  ->setUsername($this->username)
  ->setPassword($this->password);

$this->mailer = Swift_Mailer::newInstance($transporter);

这对我来说很好。在原始代码中,您使用的是端口 587 而不是 465,并且您没有指定协议 (ssl)。不知道那一点是否重要,但对我来说,端口 587 失败,而 465 工作正常。

希望有帮助。

于 2011-01-14T12:44:48.427 回答
40

我在谷歌搜索中发现了这个问题,并使用了完全烘焙提供的答案中的代码。它让我可以在抛出的异常中看到 Google smtp 服务器正在响应错误代码,指示密码和用户名不被接受。经过进一步调查,我发现了以下步骤。现在它工作得很好,我可以继续充实生产代码。

不确定 Google 何时进行更改,但除了使用您的 Google 用户名、密码和端口(465/ssl 或 587/tls)配置您的代码之外,您还需要执行以下步骤才能使用 Google smtp 服务器。

要将 gmail smtp 服务器与您的 gmail 帐户一起使用,您需要:

1)在谷歌“帐户设置”中,通过将其设置为“允许”来启用“访问安全性较低的应用程序”。

2) 在“转发和 POP/IMAP”选项卡下的 gmail 设置中,检查 IMAP 状态,它需要启用。(这将允许将发送的电子邮件保存在已发送文件夹中。)

3) 如果在第 1 步和第 2 步之后您仍然抛出异常 Google 的 smtp 服务器不接受您需要打开浏览器的用户名和密码,请转到 gmail 并登录,然后在同一浏览器中打开另一个选项卡并转到此地址:
https ://accounts.google.com/DisplayUnlockCaptcha

According to Google you may have to enter a captcha.

4) 立即从您的代码发送一封电子邮件,因为这将允许它被授权使用您的 gmail 帐户。

希望这可以帮助。

于 2015-04-19T09:03:16.780 回答
5

我发现 evad 说的是真的,但我不得不为当前版本的 Swift Mailer 稍微改变他的工作。现在它是:

$transporter = Swift_SmtpTransport::newInstance('smtp.gmail.com', 465, 'ssl')
  ->setUsername('username@gmail.com')
  ->setPassword('password');

$mailer = Swift_Mailer::newInstance($transporter);

应该可以正常工作。

于 2012-02-15T11:22:55.303 回答
4

鉴于 SSL 和端口,GMail SMTP 系统存在问题。我发现很难让它很好地与 PHP 一起工作。

我发现的最好的东西是phpGMailer。您也许可以筛选该代码以查看它们是如何使其工作的,但这对我来说总是完美无缺。

我知道这不能解决 SwiftMail 问题,只是想我会指出 :)

于 2010-08-13T16:47:18.183 回答
3

465 是 ssl 的端口,587 用于 tls 加密(查看http://swiftmailer.org/docs/sending.html#encrypted-smtp

于 2012-09-23T12:07:20.023 回答
1

经过几个小时的研究,我也来到了这里。我终于找到了真正的答案。我想通过 smtp 身份验证从谷歌邮件服务器而不是从我的主机发送电子邮件。

您可以在 gmail 中跟踪带有完整标题的电子邮件,请遵循本指南。

https://support.google.com/mail/answer/29436?hl=en

@fullybaked 有通过 smtp 验证您的电子邮件的正确答案,但您仍将通过您的主机发送。

$transporter = Swift_SmtpTransport::newInstance('smtp.gmail.com', 465, 'ssl')
->setUsername($this->username)
->setPassword($this->password);

$this->mailer = Swift_Mailer::newInstance($transporter);

@ducin 对于不同的端口和加密类型是正确的。

$transporter = Swift_SmtpTransport::newInstance('smtp.gmail.com', 465, 'ssl')

或者更现代、更安全的使用;

$transporter = Swift_SmtpTransport::newInstance('smtp.gmail.com', 587, 'tls')

如果要直接从 gmail 服务器发送,则需要设置授权模式。普通是默认的。

$transporter = Swift_SmtpTransport::newInstance('smtp.gmail.com', 587, 'tls')
->setAuthMode('login')
->setUsername('username@gmail.com')
->setPassword('password');

$mailer = Swift_Mailer::newInstance($transporter);

@gene 也是正确的,您必须对您的应用程序进行身份验证,因此请按照他的说明进行操作。

为了进一步防止您的电子邮件进入垃圾邮件文件夹,您还必须使用 DKIM(域密钥)添加 dns 文本记录

https://support.google.com/a/answer/174124?hl=en

SPF 记录

https://support.google.com/a/answer/33786?hl=en

和 DMARC

https://support.google.com/a/answer/2466580?hl=en

于 2017-12-08T00:57:49.843 回答