在gmail中使用php的swiftmailer

btqmn9zl  于 2022-12-25  发布在  PHP
关注(0)|答案(6)|浏览(169)

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

bpzcxfmw1#

我不想复活一个老帖子,但以防万一其他人正在寻找答案,因为这篇帖子是在我寻找解决方案的过程中出现的,尽管年代久远。
使用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工作正常。

jv2fixgn

jv2fixgn2#

我在谷歌搜索时发现了这个问题,并使用了fullybaked提供的答案中的代码。它让我看到了抛出的异常,即谷歌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帐户。
希望这个有用。

gab6jxml

gab6jxml3#

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

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

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

应该没问题。

sgtfey8w

sgtfey8w4#

GMail SMTP系统在SSL和端口方面存在一些问题。我发现很难让它很好地与PHP一起工作。
我发现的最好的东西是phpGMailer,你可以通过筛选代码来看看他们是如何让它工作的,但对我来说,它总是完美地工作。
我知道这并不能解决SwiftMail的问题,只是想我会指出这一点:)

ercv8c1e

ercv8c1e5#

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

8wigbo56

8wigbo566#

我也是经过几个小时的研究才来到这里的。我终于找到了真正的答案。我想从谷歌邮件服务器发送电子邮件,而不是从我的主机与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服务器发送邮件,你需要设置授权模式。默认为Plain。

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

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

@gene也是正确的,你确实要对你的应用进行认证,所以按照他的指示去做。
进一步防止您的电子邮件登陆垃圾邮件文件夹,您还将不得不添加dns文本记录与DKIM(域键)
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

相关问题