【问题标题】:Using php's swiftmailer with gmail使用 php 的 swiftmailer 和 gmail
【发布时间】:2011-03-29 13:53:48
【问题描述】:

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

我从 SwiftMailer 的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>

【问题讨论】:

标签: php gmail swiftmailer


【解决方案1】:

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

您可以在 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

【讨论】:

    【解决方案2】:

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

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

    要通过您的 gmail 帐户使用 gmail smtp 服务器,您需要:

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

    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 帐户。

    希望这会有所帮助。

    【讨论】:

    • @Gene Dear 我已经尝试了所有这些。一切都在我的本地主机上工作,但不在实时服务器上。我正面临这个错误,直到经过 4 小时的搜索和尝试一切都没有成功。 “无法使用 2 个可能的身份验证器在用户名“user@gmail.com”的 SMTP 服务器上进行身份验证”
    • 第3步我没太注意,但确实解决了问题
    • 第 3 步是我所缺少的
    【解决方案3】:

    并不是要复活一个旧帖子,而是以防万一其他人正在寻找答案,并且因为这个帖子是在我寻找解决方案的过程中出现的。

    使用 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 工作正常。

    希望对您有所帮助。

    【讨论】:

    • 对于在Goole启用两步验证的人,您必须使用您生成的密码。
    • 好吧,我声明了一个运输工具,但没有声明邮寄工具。对我的小脑袋来说太多抽象了:-)+1
    • 谢谢,这很好用。我正在发疯发送/测试 rom localhost 并试图摆脱垃圾邮件箱。
    • 端口 465 已弃用,您应该改用端口 587。
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

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

      应该可以正常工作。

      【讨论】:

      • Hos 它与完全烘焙的解决方案有什么不同?
      • 这个和上面的一样
      • 如果有人使用您自己的注册域(例如 me@myowndomain.org)使用 Google Apps 帐户发送电子邮件:stackoverflow.com/questions/17970096/…
      【解决方案6】:

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

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

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

      【讨论】:

      • 谢谢,我去查一下。不过,我想解决这个问题。
      猜你喜欢
      • 1970-01-01
      • 2014-12-12
      • 2012-12-17
      • 2013-08-10
      • 1970-01-01
      • 2012-01-28
      • 2011-06-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多