Laravel 5 SwiftMailer Отправить: как получить код ошибки

Добрый день, ребята,

Отправляю сообщение, подобное этому: Laravel 5: Отправка электронной почты. Вот как я это делаю:

$mail_status = Mail::send( 'emails.followup', $data, function( $message ) use ($data) {
             $message->to( $data['email'] )
            ->from( $data['email_from'], $data['email_name'] )
            ->subject( $data['subject'] );
        });

if($mail_status) {
    $ret_status = 'sent';
}
else
    $ret_status = 'sent_failed';

Теперь, если $ret_status "sent_failed", я хочу знать, что произошло. Как мне это сделать? Как я могу увидеть сообщение с почтового сервера?

Вот мой файл .env:

MAIL_DRIVER=smtp
MAIL_HOST=mail.mydomain.com
MAIL_PORT=465
[email protected]
MAIL_PASSWORD=thepassword
MAIL_ENCRYPTION=ssl

UPDATE:

Похоже, что подход выше Laravel 4. Если вы знаете, как получить код ошибки с помощью Laravel 5+, я могу считать его правильным ответом.

Ответ 1

Вы можете использовать try catch для этого, также вы ошибаетесь, что используете $email, $email_from, $email_name, $subject, не переходя в область функций.

try{
    $mail_status = Mail::send( 'emails.followup', $data, function( $message ) use ($data, $email, $email_from, $email_name, $subject) {
                        $message->to( $email )
                        ->from( $email_from, $email_name )
                        ->subject( $subject );
                    });
    //If error from Mail::send
    if($mail_status->failures() > 0){
        //Fail for which email address...
        foreach(Mail::failures as $address) {
            print $address . ', ';
        }
        exit;
    }  
}
catch(\Exception $e){
    // Get error here
    print $e->getMessage();
    exit;
}

Добавлена ​​печать с ошибками для адреса электронной почты, чтобы проверить, не поступил ли адрес электронной почты.

Ответ 2

Проверка Mail::failures() сразу после Mail::send() приведет к возврату массива неудачных адресов электронной почты, на которые вы пытались отправить электронное письмо.

Однако, насколько я знаю, вы не можете получить точную ошибку при сбое, используя фасад Mail. Для этого вам нужно установить отладку true на .env и проверить журнал Laravel.

Ответ 3

  • Чтобы получить dev-версию ошибок (на экране), установите в ваш .env файл APP_DEBUG=true
  • Чтобы получить точное сообщение, сделайте попытку catch, но поймите Swift_TransportException fooobar.com/info/505445/...
  • Вы также можете, при необходимости, получить экземпляр почтовой программы через app('mailer') и провести там некоторые исследования.

вот рабочий пример:

try{
    $mail_status = Mail::send( 'emails.followup', $data, function( $message ) use ($data) {
        $message->to( $data['email'] )
        ->from( $data['email_from'], $data['email_name'] )
        ->subject( $data['subject'] );
    });
}catch(\Swift_TransportException $e){
    dd($e, app('mailer'));
}

и результат dd():

Swift_TransportException {#237 ▼
  #message: """
    Expected response code 250 but got code "530", with message "530 5.7.1 Authentication required\r\n
    "
    """
  #code: 530
  #file: ...