асинхронный параметр с использованием API Mandrill с laravel

Это мой код:

 $email = "[email protected]";
 $data = array(
     'email' => $email,
     'async' => false,
 );

 Mail::queue('user.mails.welcome', $data, function($message) use ($email) {
     $message
         ->to($email, $email)
         ->subject('Welcome to the Laravel 4 Auth App!');
 });

И это то, что показано в журнале API моей учетной записи Mandrill:

 Full Request {
     "key": "x",
     "raw_message": "y",
     "async": "1" 
 }
 Full Response {
     "email": "xy",
     "status": "queued",
     "_id": "z" 
 }

Как видите, электронные письма по умолчанию ставятся в очередь. Почему? И как я могу это изменить?


person wolfrevokcats    schedule 01.07.2014    source источник


Ответы (4)


Согласно документам Mandrill:

Асинхронный: включите фоновый режим отправки, оптимизированный для массовой рассылки. В асинхронном режиме messages/send немедленно возвращает статус «в очереди» для каждого получателя. Чтобы обрабатывать отклонения при отправке в асинхронном режиме, настройте веб-перехватчик для события «отклонить». По умолчанию false для сообщений с не более чем 10 получателями; сообщения с более чем 10 получателями всегда отправляются асинхронно, независимо от значения async.

По сути, это то, что Mandrill делает со своей стороны, и это не связано с тем, используете ли вы Mail::send или Mail::queue в Laravel.

Все электронные письма, отправляемые через Mandrill, ставятся в очередь и отправляются в соответствии с параметрами, заданными для вашей учетной записи. Другими словами: они решают, когда ваши электронные письма в конечном итоге будут отправлены.

Изменить: почтовый транспорт Laravel Mandrill всегда будет отправлять с включенным асинхронным режимом. Невозможно настроить это без редактирования класса: MandrillTransport

person saverio    schedule 04.07.2014

Я не уверен, что понимаю. Ваши письма поставлены в очередь, потому что вы используете метод queue():

Mail::queue('user.mails.welcome', $data, function($message) use ($email) {

Если вы не хотите стоять в очереди, используйте метод send():

Mail::send('user.mails.welcome', $data, function($message) use ($email) {
person Phil Sturgeon    schedule 02.07.2014

Мне пришлось установить адрес электронной почты "от", чтобы эта работа работала.

person wolfrevokcats    schedule 07.07.2014

Параметр async API-интерфейса mandrill не подвергается закрытию почты Laravel. Я только что расширил класс MandrillTransport и передал в него Swift_Mime_Message, чтобы я мог захватить ответ, он будет «отправлен» или «отклонен» (и reject_reason будет заполнен чем-то вроде «жесткий/мягкий отказ»), который я могу сохранить в моем приложении:

class Mandrill extends MandrillTransport
 {
  public function send(\Swift_Mime_Message $message, &$failedRecipients = null)
  {
     $client = $this->getHttpClient();

     $response = $client->post('https://mandrillapp.com/api/1.0/messages/send-raw.json', [
         'body' => [
             'key' => $this->key,
             'raw_message' => (string)$message,
             'async' => false,
         ],
     ]);
     return $response->json();
  }
}
person Christopher Pecoraro    schedule 10.07.2014