2015-05-07 2 views
1

Я отправляю электронные письма через Mail::queue на Laravel 4.2; все работает нормально. Я использую шаблоны, и письма, которые я получаю, именно то, что я хочу. В какой-то момент процесса я хотел бы вернуть тело, чтобы добавить его в конкретную таблицу для целей журналов; ничего не работает.getBody empty in Laravel 4.2 Mail :: queue

// We will queue the email (we could add a protection here) 
    Mail::queue($template, $template_data, function($message) use ($email, $subject, $user, $profile, $additional_mailgun_variables) 
{ 

    // We prepare the email trace 
    $email_trace = new EmailTrace; 
    $email_trace->recipient = $email; 
    $email_trace->subject = $subject; 
    $email_trace->user_id = $user->id; 
    $email_trace->user_profile_id = $profile->id; 
    $email_trace->prepared_at = date('Y-m-d H:i:s'); 

    // We prepare the MailGun variables 
    $mailgun_variables = [ 

    'user_id' => (int) $user->id, 
    'profile_id' => (int) $profile->id, 
    'email_trace_id' => (int) $email_trace->id, 

    ]; 

    // Is there any additional variable ? 
    if ($additional_mailgun_variables !== NULL) $mailgun_variables += $additional_mailgun_variables; 

    // We encode it 
    $encoded_mailgun_variables = json_encode($mailgun_variables); 

    // We finally send the email with all the correct headers 
    $message->to($email)->subject($subject); 
    $message->getHeaders()->addTextHeader('X-Mailgun-Variables', $encoded_mailgun_variables); 

    // We get the body of the message 
    $email_trace->content = $message->getBody(); 
    $email_trace->save(); 

}); 

Единственная проблема здесь является message->getBody(), которая возвращает null; никто не опубликовал эту проблему раньше, поэтому я задаюсь вопросом, не могу ли я быть единственным, кто не сможет получить body самого письма, когда он был обработан ...

Прошел мимо вас весь процесс Mail::queue что-то я ошибаюсь.

Спасибо вам, ребята;)

ПРИМЕЧАНИЕ: Я использую MailGun отправить электронную почту, я не думаю, что это изменит что-нибудь к проблеме Тхо ...

ответ

1

Я обратил внимание на проблему Wouldn» отображаться с Mail::send и пытался понять, что происходит с этим Mail::queue ...

Похожи телом ($message->getBody()) не обрабатываются/доступно до самого конца процесса очереди, так что невозможно было получить.

Я пытался найти способы, чтобы получить эту body, но это звучит технически невозможно иметь чистое решение с этой queue системы. (Примечание: очень плохое впечатление гибкости Laravel здесь)

мне удалось эмулировать первый раз что Laravel делает для обработки этого шаблона и отправляет его через Swift Message. Я просто представляю его как представление и помещаю его в переменную $body.

// We resolve the body for the email trace logs 
$body_preparation = View::make($template, $template_data); 
$body = $body_preparation->render(); 

// We will queue the email (we could add a protection here) 
Mail::queue($template, $template_data, function($message) use ($email, $subject, $body, $user, $profile, $additional_mailgun_variables) 
{ 

    // We prepare the email trace 
    $email_trace = new EmailTrace; 
    $email_trace->recipient = $email; 
    $email_trace->subject = $subject; 

    if ($user !== NULL) $email_trace->user_id = $user->id; 
    if ($profile !== NULL) $email_trace->user_profile_id = $profile->id; 

    $email_trace->prepared_at = date('Y-m-d H:i:s'); 

    if ($profile !== NULL) $profile_id = $profile->id; else $profile_id = NULL; 
    if ($user !== NULL) $user_id = $user->id; else $profile_id = NULL; 

    $email_trace->content = $body; 
    $email_trace->save(); 

    // We prepare the MailGun variables 
    $mailgun_variables = [ 

     'user_id' => (int) $user_id, 
     'profile_id' => (int) $profile_id, 
     'email_trace_id' => (int) $email_trace->id, 

    ]; 

    // Is there any additional variable ? 
    if ($additional_mailgun_variables !== NULL) $mailgun_variables += $additional_mailgun_variables; 

    // We encode it 
    $encoded_mailgun_variables = json_encode($mailgun_variables); 

    // We finally send the email with all the correct headers 
    $message->to($email)->subject($subject); 
    $message->getHeaders()->addTextHeader('X-Mailgun-Variables', $encoded_mailgun_variables); 

}); 

Если кто-то есть такая же проблема, я думаю, что это хорошее решение :)

+0

Этот метод должен быть повторен на всех местах почты :: очереди вызывается. Посмотрите на этот метод, который я обнаружил http://stackoverflow.com/a/34188486/366962 –

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