使用php的swiftmailer和gmail

时间:2010-08-13 16:33:50

标签: php gmail swiftmailer

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

6 个答案:

答案 0 :(得分:86)

不要故意复活旧帖子,但以防其他人正在寻找答案,并且因为这篇文章是在我寻找解决方案时出现的,尽管年龄很大。

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

希望有所帮助。

答案 1 :(得分:35)

我发现这个问题正在进行谷歌搜索并使用完全烘焙提供的答案中的代码。它让我能够看到在例外情况下,谷歌smtp服务器正在响应一个错误代码,表明密码和用户名不被接受。经过进一步调查,我发现了以下步骤。现在它运行良好,我可以继续充实生产代码。

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

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

1)在Google&#34;帐户设置&#34;启用&#34;访问安全性较低的应用程序&#34;将其设置为&#34;允许&#34;。

2)在&#34;转发和POP / IMAP&#34;下的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帐户。

希望这有帮助。

答案 2 :(得分:6)

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

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

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

应该可以正常工作。

答案 3 :(得分:3)

GMail SMTP系统有SSL和端口的问题。我觉得很难让它很好地与PHP一起使用。

我发现的最好的事情是phpGMailer。您可以筛选出代码以了解它们是如何使用它的,但这对我来说总是完美无缺。

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

答案 4 :(得分:3)

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

答案 5 :(得分: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