将 php 的 swiftmailer 与 gmail 结合使用

2022-08-30 12:07:18

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

我从 SwiftMailer 的引用中更改了脚本,但我没有得到任何结果。怎么了?

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

$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>

答案 1

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

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

希望有所帮助。


答案 2

我发现这个问题在谷歌搜索,并使用了fullbaked提供的答案中的代码。它让我达到了这样的程度,即我可以在抛出的异常中看到Google smtp服务器正在使用错误代码进行响应,指示密码和用户名未被接受。经过进一步调查,我发现了以下步骤。现在它运行良好,我可以继续充实用于生产的代码。

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

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

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

希望这有帮助。


推荐