【问题标题】:Timeout when attempting to send an email through Mandrill in CakePHP 3.1尝试在 CakePHP 3.1 中通过 Mandrill 发送电子邮件时超时
【发布时间】:2015-12-16 07:00:37
【问题描述】:

我正在尝试通过 Mandrill 发送一封带有 CakePHP 的电子邮件,但它只是旋转然后给出:

错误:连接超时

Cake\Network\Exception\SocketException

根据页面错误/堆栈跟踪,错误发生在:vendor/cakephp/cakephp/src/Mailer/Transport/SmtpTransport.php line 206:

if (!$this->_socket->connect()) {

来自 /tmp/error.log:

2015-09-21 13:48:04 错误:[Cake\Network\Exception\SocketException] 连接超时请求 URL:/portal/users/add Stack Trace:

#0 /home/user/public_html/user/mysitefolder/vendor/cakephp/cakephp/src/Mailer/Transport/SmtpTransport.php(206): Cake\Network\Socket->connect()

#1 /home/user/public_html/user/mysitefolder/vendor/cakephp/cakephp/src/Mailer/Transport/SmtpTransport.php(161): Cake\Mailer\Transport\SmtpTransport->_connect()

#2 /home/user/public_html/user/mysitefolder/vendor/cakephp/cakephp/src/Mailer/Email.php(1304): Cake\Mailer\Transport\SmtpTransport->send(Object(Cake\Mailer\电子邮件))

#3 /home/user/public_html/user/mysitefolder/src/Controller/Portal/UsersController.php(92): Cake\Mailer\Email->send()

#4【内部函数】:App\Controller\Portal\UsersController->add()

#5 /home/user/public_html/user/mysitefolder/vendor/cakephp/cakephp/src/Controller/Controller.php(416): call_user_func_array(数组, 数组)

#6 /home/user/public_html/user/mysitefolder/vendor/cakephp/cakephp/src/Routing/Dispatcher.php(114): Cake\Controller\Controller->invokeAction()

#7 /home/user/public_html/user/mysitefolder/vendor/cakephp/cakephp/src/Routing/Dispatcher.php(87): Cake\Routing\Dispatcher->_invoke(Object(App\Controller\Portal\用户控制器))

#8 /home/user/public_html/user/mysitefolder/webroot/index.php(37): Cake\Routing\Dispatcher->dispatch(Object(Cake\Network\Request), Object(Cake\Network\Response ))

#9 {主}

在控制器中发送电子邮件:

use Cake\Mailer\Email;

// ...

$email = new Email('default');
$email->template('welcome', 'portal')
    ->from('myemail@gmail.com')
    ->to('myemail@gmail.com')
    ->send();

在我的 app.php 中:

'EmailTransport' => [
    'default' => [
        'className' => 'Smtp',
        'host' => 'smtp.mandrillapp.com',
        'port' => 587,
        'timeout' => 30,
        'username' => 'myusername',
        'password' => 'mymandrillapikey', // Key
        'client' => null,
        'tls' => true, // have also tried false
    ],
],
'Email' => [
    'default' => [
        'transport' => 'default',
        'from' => ['myemail@gmail.com' => 'My Name'],
        'replyTo' => ['myemail@gmail.com' => 'My Name'],
        'charset' => 'utf-8',
        'headerCharset' => 'utf-8',
        'log' => false,
        'emailFormat' => 'html'
    ],
],

如果我只尝试标准的 PHP 邮件,它可以工作:

'EmailTransport' => [
    'default' => [
        'className' => 'Mail'
    ]

回顾: 我已经检查过 Mandrill,他们说他们不会阻止任何端口或类似的东西。我已经与我的主机 (HostMonster) 进行了验证,他们说端口是开放的,他们没有阻止任何东西。

我很茫然。即使无法得到明确的答案,我也很感激任何帮助指出我正确的方向或一些想法我什至可以调试这个问题。

【问题讨论】:

  • 您可以使用 SSL 连接(主机' => 'ssl://smtp.mandrillapp.com' 和 '端口' => 465)吗?也可能有助于打开更多日志记录('log' => true),如下所述:book.cakephp.org/3.0/en/core-libraries/… 以公开您的服务器和 Mandrill 之间的实际 SMTP 对话错误。
  • @terrorbox - 我试过了,但同样的问题。开启错误日志,并在上面贴出日志。
  • @Dave 你找到解决方案了吗?我也遇到同样的错误

标签: email cakephp timeout mandrill cakephp-3.1


【解决方案1】:

我希望您谈论的是 CakePHP 3.x/Linux (Ubuntu)/Mandrill。您无需更改 Config/app.php 中的默认 Email Transport 和 Email,如果您愿意,可以使用此方法发送交易邮件。

1:获取 Composer.phar

在终端中运行以下命令,获取 composer.phar,

cd /var/www/html/your-project-name/

php -r "readfile('https://getcomposer.org/installer');" | php

以上将在您的项目文件夹中安装composer.phar。

2:更新 Composer.json 以安装此插件

Lennaert/cakephp3-mandrill

在文件的“require”部分添加以下内容,

"lennaert/cakephp3-mandrill": "*"

在最后,如下所示。

"require": {
    "php": ">=5.4.16",
    "cakephp/cakephp": "~3.0",
    "mobiledetect/mobiledetectlib": "2.*",
    "cakephp/migrations": "~1.0",
    "cakephp/plugin-installer": "*",
    "lennaert/cakephp3-mandrill": "*"
},

(或)

php composer.phar require lennaert/cakephp3-mandrill:*

3:运行 Composer.json

在终端中运行以下命令

php composer.phar update

这将使用插件文件夹更新供应商文件,再次运行以获取权限,(Ubuntu)

chmod 777 -R /var/www/html/your-project-name/vendor/lennaert

4:更新配置/app.php

    'Email' => [
//        'default' => [
//            'transport' => 'default',
//            'from' => 'you@localhost',
//            //'charset' => 'utf-8',
//            //'headerCharset' => 'utf-8',
//        ],
        'Mandrill'=> [
            'template' => 'default',
            'transport' => 'Mandrill',
            'emailFormat' => 'both',
            'from' => ['xxx@xxx.com' => 'Prasi'],
            'sender' => ['xxx@xxx.com' => 'Prasi'],
            'Mandrill' => [] // Don't ask, the plugin needs/wants this empty array
        ],
    ],

    'EmailTransport' => [
//        'default' => [
//            'className' => 'Mail',
//            // The following keys are used in SMTP transports
//            'host' => 'localhost',
//            'port' => 25,
//            'timeout' => 30,
//            'username' => 'user',
//            'password' => 'secret',
//            'client' => null,
//            'tls' => null,
//        ],
        'Mandrill' => [
            'className' => 'MandrillEmail\Network\Email\MandrillTransport',
            'host' => 'smtp.mandrillapp.com',
            'key' => 'your-secret-key'
        ],
    ],

5:发送电子邮件

在控制器中添加

use MandrillEmail\Network\Email\MandrillTransport;
use Cake\Network\Email\Email;

在你的函数中,

public function send_mail()
    {       
        if(!empty($this->request->data)){
            if($this->request->is('post')){

                $emailObject=new Email('Mandrill');
                $emailObject->subject('Mandrill sends emails')
                            ->profile('Mandrill') // This is the profile you set above, in your config file
                            ->to('sendto@email.com', 'Receiver Name');

                $result=$emailObject->send();
                pr($result);
            }
        }
    }

如果我们打印并查看结果,它将如下所示,

Array
(
    [0] => Array
        (
            [email] => sendto@email.com
            [status] => sent
            [_id] => 42d1468565be448ea357cad95304bd83
            [reject_reason] => 
        )

    [status] => sent
)

希望这对您的需求有所帮助。如果它对你有用,请分享给我。

【讨论】:

  • 我不确定我是否理解。您说“您无需更改 Config/app.php 中的默认电子邮件传输和电子邮件”,那么第 4 步就是这样做的。这听起来像是一种更复杂的发送 SMTP 消息的方式。我不需要插件——我只需要更改应用程序文件中的电子邮件数据。我错过了什么?
  • 你可以发现,我把default和mandrill这两个东西都包括了,并且注释了default。您可以同时拥有并通过 ->profile('Default/Mandrill') 调用它。它决定了它必须遵循的传输方式。那是什么意思。 @戴夫
  • 因此,除非我弄错了,否则您的回答为我提供了与我已经实现并在问题中详细说明的代码相同的代码。除了它使用了一个额外的(看似不需要的)插件。
猜你喜欢
  • 2016-07-04
  • 2017-04-03
  • 2015-10-27
  • 1970-01-01
  • 2015-09-07
  • 1970-01-01
  • 2015-01-11
  • 2020-02-24
  • 1970-01-01
相关资源
最近更新 更多