2013-08-30 8 views
27

ustawić 'pretend' => true, w mail.php, stworzył ten new.php widok:laravel poczty udawane drukuje nic

<body> 
    <div> 
     E-mail: {{ $user->email }}<br> 
     User: {{ $user->username }}<br> 
     Pass: {{ $user->password }}<br> 
    </div> 
</body> 

Wtedy w moim kontroler używam tego kodu na „wyślij” pocztę:

$data['user'] = $user; 
Mail::send('emails.new', $data, function($message) use ($user) 
{ 
    $message->to('[email protected]', $user->username)->subject('Account'); 
}); 

dane wyjściowe w pliku dziennika to tylko:

[2013-08-30 11:27:56] log.INFO: Udawanie mai l wiadomość do: [email protected] [] []

Próbowałem z pełnym widokiem HTML, także z innym widokiem, który zawiera tylko ciągi, bez zmiennych, ale dane wyjściowe są takie same.

Czy tak powinno działać? Czy nie powinien wydrukować całej wiadomości, tytułu itp.? Czy jest jakiś problem z kodem lub jest to poprawne wyjście?

Odpowiedz

63

Jeśli ustawisz 'pretend' => true w app/config/mail.php następnie bez mail jest kiedykolwiek wysłany, można dostać tylko komunikat w dzienniku, na przykład:

[2014-07-17 14:15:07] production.INFO: 
    Pretending to mail message to: [email protected] [] [] 

Jednakże, jeśli zostawisz 'pretend' => false i zamiast używać log sterownik ('driver' => 'log', dostępny od Laravel 4.2), zamiast wysyłać pocztę, otrzymasz całą zawartość wiadomości zapisaną w dzienniku:

[2014-07-17 14:15:14] production.DEBUG: 
    Message-ID: <[email protected]> 

Date: Thu, 17 Jul 2014 14:15:15 +0000 

Subject: Welcome! 
From: Ahmad <[email protected]> 
To: John Smith <[email protected]> 
MIME-Version: 1.0 
Content-Type: text/html; charset=utf-8 
Content-Transfer-Encoding: quoted-printable 


    Order confirmed! 

[] [] 
+0

Zrobiłem ten wpis w' config/local/mail .php' i left 'pretend => false'. Uważam, że rzeczywiste wyniki są bardziej przydatne. –

+12

To jest doskonała odpowiedź - powinna znajdować się w adnotacjach w 'config/mail.php' – harryg

+0

należy pamiętać, że sterownik dziennika jest obsługiwany jak w wersji 4.2. –

8

To jest normalne zachowanie udawać w systemie Laravel Mailer. Nie wyśle ​​twojej wiadomości nigdzie, nawet w logu, po prostu zarejestruje, że wiadomość została wysłana. Spójrz na związanym kodzie źródłowym:

/** 
* Send a Swift Message instance. 
* 
* @param Swift_Message $message 
* @return void 
*/ 
protected function sendSwiftMessage($message) 
{ 
    if (! $this->pretending) 
    { 
     return $this->swift->send($message); 
    } 
    elseif (isset($this->logger)) 
    { 
     $this->logMessage($message); 
    } 
} 

/** 
* Log that a message was sent. 
* 
* @param Swift_Message $message 
* @return void 
*/ 
protected function logMessage($message) 
{ 
    $emails = implode(', ', array_keys($message->getTo())); 

    $this->logger->info("Pretending to mail message to: {$emails}"); 
} 
+0

Link do kodu: https://github.com/laravel/framework/blob/master/src/Illuminate/Mail/Mailer.php –

10

Jeśli rzeczywiście chcesz zobaczyć zawartość wiadomości (na przykład podczas testowania weryfikacji konta użytkownika lub hasło zresetować maile) w dzienniku/Przechowywanie/dzienników; Możesz modyfikować swoją lokalną kopię sprzedawca/laravel/Framework/src/Illuminate/Mail/Mailer.php i w logMessages funkcjonować go zmodyfikować, aby wyglądać

protected function logMessage($message) 
{ 
    $emails = implode(', ', array_keys((array) $message->getTo())); 
    $body = $message->getBody(); 
    $this->logger->info("Pretending to mail message to: {$emails} :-: {$body}"); 
} 

Następnie pojawi się treść wiadomości w logi.

+1

Możesz otrzymać temat wiadomości e-mail, dodając $ subject = $ message-> getSubject(); – Duli

+0

nie, nie rób tego, to zmienia rdzeń, asnwer poniżej (@virtilink) jest poprawny – Juan

+1

Wystarczy zaktualizować odpowiedź, ale nie rób żadnej z tych rzeczy. Zamiast tego uruchom lokalny serwer SMTP zbudowany specjalnie na potrzeby lokalnego rozwoju: http://mailcatcher.me/ – sirtimbly

6

I to w moim wysyłania wywołania zwrotne:

Mail::send(array('emails.html','emails.text'),$data,function($message) use($data) 
{ 
    //Set $message data 
    if(Config::get('mail.pretend')) Log::info(View::make('emails.html',$data)->render()); 
} 

Alternatywnie, można przekazać widoki czynią do innego widoku, aby zobaczyć kod HTML renderowany w przeglądarce.

+0

Idealny dla Laravel 4.0.x gdzie nie ma sterownika 'log' – damd