使用PHP的SwiftMailer与Gmail发送邮件

41

我正在编写一个简单的脚本,其中使用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>

这可能会有用:https://dev59.com/7XRB5IYBdhLWcg3wH0SW#12317831 - shasi kanth
对我很有帮助:Symfony - 如何使用Gmail发送电子邮件 - Peyman Mohamadpour
请参考以下链接:https://stackoverflow.com/a/46864725/4680523 - manish1706
6个回答

90

不想复活一个老帖子,但如果其他人正在寻找答案,而且尽管年代久远,但这篇帖子出现在我的搜索结果中,我还是想提供一下答案。

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


7
如果在Google启用了两步验证,您必须使用生成的密码。 - Radek Benkel
好的,我声明了一个传输器但没有邮件发送器。对于我的小脑袋来说抽象化太多了 :-) 不过还是点个赞。 - Alain Tiemblo
1
谢谢,这个很好用。我已经疯了,在本地发送/测试和试图摆脱垃圾邮件框中。 - kyle
6
端口465已被弃用,你应该使用端口587。 - Justin Bull

40

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

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

要使用gmail帐户的gmail smtp服务器,您需要执行以下操作:

1)在Google“帐户设置”中启用“允许不安全的应用程序访问”,方法是将其设置为“允许”。

2)在gmail设置下的“转发和POP / IMAP”选项卡下,检查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亲爱的,我已经尝试了所有方法。它们都在我的本地主机上工作,但在实际服务器上却无法正常运行。我一直面对这个错误,尝试了将近4个小时还没有成功。错误信息为:“使用2个可能的认证器验证SMTP服务器上的用户名'user@gmail.com'失败”。 - Abdul Rehman
我没有太关注第三步,但它实际上解决了问题。 - Vitalii Zurian
1
第三步是我所缺少的。 - devsmt

5
我发现evad所说的是正确的,但我需要对Swift Mailer的当前版本进行一些修改。 现在它是这样的:
$transporter = Swift_SmtpTransport::newInstance('smtp.gmail.com', 465, 'ssl')
  ->setUsername('username@gmail.com')
  ->setPassword('password');

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

应该可以正常工作。


7
与全熟解决方案相比,它有何不同? - Salvador Dali
1
这是相同的。 - Julio Marins
如果有人使用自己注册的域名,例如me@myowndomain.org,拥有Google应用帐户的电子邮件,请参考以下链接:https://dev59.com/53XYa4cB1Zd3GeqP2h6I - Ryan Mortensen

4

GMail SMTP系统存在SSL和端口问题。我发现很难使其与PHP良好地配合工作。

我发现最好的解决方案是phpGMailer。您可能能够查看该代码,以了解它们如何使其正常工作,但对我来说,它始终无缺陷地工作。

我知道这并没有解决SwiftMail的问题,只是想指出这一点 :)


谢谢,我会查一下的。不过,我还是想要解决这个问题。 - andandandand

3

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


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