个性化阅读
专注于IT技术分析

无法与主机smtp.gmail.com(173.194.205.108)建立SwiftMailer连接[#0]

本文概述

当你将SwiftMailer与Gmail帐户一起使用来发送电子邮件时(即使你使用Laravel, Symfony CakePHP之类的框架), 此问题也不是很常见, 并且会发生。一些开发人员也遇到了同样的问题, 该代码在你的开发计算机中本地运行, 但在部署服务器上未按预期工作。

许多开发人员在使用Swift Mailer和Gmail发送电子邮件时都遇到了这个问题, 可惜每种可能的解决方案可能并不适用于所有人。在本文中, 我们将分享一些可能的解决方案, 它们可能有助于解决你项目中的这个问题。

1. gethostbyname也许是你的敌人还是盟友

PHP的gethostbyname函数获取与给定Internet主机名相对应的IPv4地址。在某些情况下, 此功能有助于使代码正常工作, 但对于另一些将smtp地址作为字符串提供的方法则可以解决问题(我们建议你同时测试一下, 看看会发生什么情况):

<?php 

// For some users works using the gethostbyname function 
$smtp_host_ip = gethostbyname('smtp.gmail.com');
// But for others only the smtp address 
$smtp_host_ip = 'smtp.gmail.com';

$transport = \Swift_SmtpTransport::newInstance($smtp_host_ip, 465, 'ssl')->setUsername('qweqwe@qweqweqew.com')->setPassword('qweqwe+');
$mailer = \Swift_Mailer::newInstance($transport);

$message = \Swift_Message::newInstance()
    ->setFrom(array("john@doe.com" => 'John Doe'))
    ->setTo(array("john@doe.com" => 'John Doe'));
$message->setBody('<h3>Contact message</h3>', 'text/html');

$mailer->send($message);

2.更改Gmail的SMTP

你可以使用SMTP, SSL / TLS连接到Gmail邮件服务器。要使用Swift Mailer做到这一点, 你需要在端口465上连接到smtp.gmail.com, 但是, 如果你在尝试发送电子邮件时收到上述异常, 请更改gmail的smtp地址, 而不要使用smtp.gmail.com以下任何IP或地址:

  • 173.194.65.108
  • 173.194.205.108
  • 74.125.133.108
  • gmail-smtp-msa.l.google.com

建议你使用服务器中的终端对smtp.gmail.com地址进行ping操作, 该地址应打印可用于发送电子邮件的SMTP的IP地址:

SMTP Gmail Ping

如前所述, 这在某些情况下可能有效。

3.如果你使用Symfony

如果你在symfony项目中工作, 使用SwiftMailer发送电子邮件的代码可能类似于:

public function indexAction($name)
{
    $message = \Swift_Message::newInstance()
        ->setSubject('Hello Email')
        ->setFrom('send@example.com')
        ->setTo('recipient@example.com')
        ->setBody(
            $this->renderView(
                // app/Resources/views/Emails/registration.html.twig
                'Emails/registration.html.twig', array('name' => $name)
            ), 'text/html'
        )
        /*
         * If you also want to include a plaintext version of the message
        ->addPart(
            $this->renderView(
                'Emails/registration.txt.twig', array('name' => $name)
            ), 'text/plain'
        )
        */
    ;
    $this->get('mailer')->send($message);

    return $this->render(...);
}

无论通过哪种方式, 你的代码都无法直接处理凭据, 因为它们是通过parameters.yml文件或config.yml检索的, 这可能会帮助你解决问题。首先修改你的parameter.yml(或根据你的工作流配置config.yml)中的传输选项:

# Swiftmailer Configuration
swiftmailer:
    transport: mail

然后将假脱机类型设置为内存:

# app/config/config.yml
swiftmailer:
    # ...
    spool: { type: memory }

或在parameters.yml中(根据你的工作流程):

# app/config/parameters.yml
parameters:
    spool: { type: memory }

当你使用SwiftmailerBundle从Symfony应用程序发送电子邮件时, 默认情况下将立即发送电子邮件。但是, 你可能希望避免Swift Mailer和电子邮件传输之间的通信性能下降, 这可能导致用户在发送电子邮件时等待下一页加载。通过选择”假脱机”电子邮件而不是直接发送电子邮件, 可以避免这种情况。这意味着Swift Mailer不会尝试发送电子邮件, 而是将消息保存到文件等位置。然后可以从后台处理程序中读取另一个进程, 并负责在后台处理程序中发送电子邮件。目前, Swift Mailer仅支持后台处理到文件或内存。

愿力量与你同在, 祝你编程愉快!

赞(0)
未经允许不得转载:srcmini » 无法与主机smtp.gmail.com(173.194.205.108)建立SwiftMailer连接[#0]

评论 抢沙发

评论前必须登录!