2015-08-17 1 views
3

Я пытался получить список получателей, которые не получали электронную почту, используя функцию laravel Mail::send(). Я пытаюсь сделать следующий код. for цикл используется как потому, что каждый пользователь получает настроенное сообщение.Как работает функция laravel Mail :: failures()?

// First recipient is actual, the second is dummy. 
$mail_to_users = ["[email protected]","dummy_acc[email protected]"]; 
$failures = []; 

foreach($mail_to_users as $mail_to_user) { 
    Mail::send('email', [], function($msg) use ($mail_to_user){ 
    $msg->to($mail_to_user); 
    $msg->subject("Document Shared"); 
    }); 

    if(count(Mail::failures()) > 0) { 
     $failures[] = Mail::failures()[0]; 
    } 
} 

print_r($failures); 

Я пробовал все возможные варианты. Я изменил правильную конфигурацию почты в config/mail.php на неправильный. Но если я это сделаю, тогда laravel показывает страницу ошибок, но переменная $failure всегда возвращает пустой.

+2

Это ничего не стоит, что только очень специфических виды отказов перенастроены из Swiftmailer: в значительной степени только неудачи в том смысле, что метод используемый для почты, отклонил адрес/адрес электронной почты. С 'SMTP' это вообще нормально, так как SMTP-сервер немедленно возвращает сбой, но что-то вроде использования sendmail редко (если вообще когда-либо) возвращает сбой, так как письма просто принимаются независимо, а затем отправляются позже. Таким образом, если вы используете 'sendmail' (или, возможно, даже' mail') в своей почтовой конфигурации, вам, вероятно, придется использовать другой способ отслеживания сбоев доставки. – alexrussell

+0

См. Http://swiftmailer.org/docs/sending.html для документации о том, когда вы это делаете, и не получите возвращенные неудачи. – alexrussell

ответ

0

Я думаю, что нет способа проверить, что письмо действительно отправлено получателю или нет. До тех пор, пока сообщение электронной почты является действительным (даже если это фиктивный код), оно вернет true. Тем не менее, вместо почты :: неудач(), вы можете использовать поймать блок TRY следующим образом:

foreach ($mail_to_users as $mail_to_user) { 
      try { 
       Mail::send('email', [], function($msg) use ($mail_to_user) { 
        $msg->to($mail_to_user); 
        $msg->subject("Document Shared"); 
       }); 
      } catch (Exception $e) { 

       if (count(Mail::failures()) > 0) { 
        $failures[] = $mail_to_user; 
       } 
      } 
     } 
+0

Я пробовал то же самое, но это не помогло мне :-( –

+0

Было бы полезно, если бы вы могли рассказать читателям, какое исключение может быть вызвано вызовом метода :) – AshMenhennett