2015-09-19 1 views
3

Я пытаюсь отправить по электронной почте ж/CakePHP хотя Mandrill, но это только вращается, то получим:Тайм-аут при попытке отправить по электронной почте через Mandrill в CakePHP 3,1

Error: Connection timed out

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 Error: [Cake\Network\Exception\SocketException] Connection timed out Request 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\Email))

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

#4 [internal function]: App\Controller\Portal\UsersController->add()

#5 /home/user/public_html/user/mysitefolder/vendor/cakephp/cakephp/src/Controller/Controller.php(416): call_user_func_array(Array, 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\UsersController))

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

#9 {main}

Отправка электронной почты в контроллере:

use Cake\Mailer\Email; 

// ... 

$email = new Email('default'); 
$email->template('welcome', 'portal') 
    ->from('[email protected]') 
    ->to('[email protected]') 
    ->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' => ['[email protected]' => 'My Name'], 
     'replyTo' => ['[email protected]' => 'My Name'], 
     'charset' => 'utf-8', 
     'headerCharset' => 'utf-8', 
     'log' => false, 
     'emailFormat' => 'html' 
    ], 
], 

Если я пытаюсь просто стандартный PHP почты это работает:

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

Резюме: Я проверил w/Mandrill, и они говорят, что они не блокируют какие-либо порты или что-то в этом роде. Я проверил w/my host (HostMonster), и они говорят, что порт открыт, и они ничего не блокируют.

Я в затруднении. Даже если невозможно получить окончательный ответ, я буду признателен за любую помощь, указывающую на меня в правильном направлении или какую-то идею, как я мог бы отладить эту проблему.

+0

Можете ли вы подключиться с помощью SSL (host '=>' ssl: //smtp.mandrillapp.com 'и' port '=> 465)? Может также помочь включить больше протоколирования ('log' => true), как описано здесь: http://book.cakephp.org/3.0/en/core-libraries/email.html#configuration-profiles, чтобы разоблачить фактический SMTP ошибки разговора между вашим сервером и Mandrill's. – terrorbox

+0

@terrorbox - Я пробовал, но такой же вопрос. Включил журнал регистрации ошибок и разместил журнал выше. – Dave

+0

@Dave Вы нашли решение? Я также получаю ту же ошибку –

ответ

2

Надеюсь, вы говорите о CakePHP 3.x/Linux (Ubuntu)/Mandrill. Вам не нужно менять почтовый транспорт и электронную почту по умолчанию в Config/app.php, а не , вы можете использовать этот метод, если хотите,, чтобы отправить письмо с транзакцией.

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-мандрил

В "требуют" часть файла добавить следующее,

"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: Обновление Config/app.php

'Email' => [ 
//  'default' => [ 
//   'transport' => 'default', 
//   'from' => '[email protected]lhost', 
//   //'charset' => 'utf-8', 
//   //'headerCharset' => 'utf-8', 
//  ], 
     'Mandrill'=> [ 
      'template' => 'default', 
      'transport' => 'Mandrill', 
      'emailFormat' => 'both', 
      'from' => ['[email protected]' => 'Prasi'], 
      'sender' => ['[email protected]' => '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: Отправить e-mail

В контроллере добавить

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('[email protected]', 'Receiver Name'); 

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

Если мы печатаем и увидеть результат будет выглядеть так,

Array 
(
    [0] => Array 
     (
      [email] => [email protected] 
      [status] => sent 
      [_id] => 42d1468565be448ea357cad95304bd83 
      [reject_reason] => 
     ) 

    [status] => sent 
) 

Надеется, что это помогает вашу потребности. Поделитесь мной, если он сработает для вас.

+0

Я не уверен, что понимаю. Вы говорите: «Вам не нужно менять почтовый транспорт и электронную почту по умолчанию в Config/app.php», тогда шаг 4 делает именно это. Это звучит как более сложный способ просто отправлять SMTP-сообщения. Мне не нужен плагин - мне нужно будет только изменить данные электронной почты в файле приложения. Что мне не хватает? – Dave

+0

Вы можете обнаружить, что я включил обе настройки по умолчанию и mandrill и прокомментировал значение по умолчанию. У вас могут быть оба и вызывать это через -> profile ('Default/Mandrill'). Он решает, какой транспорт должен следовать. Что это значит. @Dave –

+0

Так что, если я не ошибаюсь, ваш ответ дает мне тот же код, который я уже реализовал и детализировал в вопросе. Кроме использования дополнительного (казалось бы, не подключенного) плагина. – Dave

Смежные вопросы