2014-10-01 77 views
23

我想使用laravel發送確認電子郵件。 laravel Mail :: send()函數似乎只接受系統上文件的路徑。 問題是我的郵件模板存儲在數據庫中,而不是系統中的文件。Laravel郵件:傳遞字符串而不是視圖

如何將簡單內容傳遞給電子郵件?

實施例:

$content = "Hi,welcome user!"; 

Mail::send($content,$data,function(){}); 

回答

10

的Mailer類傳遞一個字符串到addContent其經由各種其他方法調用views->make()。因此,直接傳遞一串內容不會起作用,因爲它會嘗試以該名稱加載視圖。

什麼你需要做的就是創建一個視圖它只是回聲$content

// mail-template.php 
<?php echo $content; ?> 

然後插入您的字符串轉換成這種觀點在運行時。

$content = "Hi,welcome user!"; 

$data = [ 
    'content' => $content 
]; 

Mail::send('mail-template', $data, function() { }); 
+6

不是非常優雅,我更喜歡Jarek Tkaczyk的方式:) – Ifnot 2015-08-21 09:52:23

50

更新:在Laravel 5您可以使用raw代替:

Mail::raw('Hi, welcome user!', function ($message) { 
    $message->to(..) 
    ->subject(..); 
}); 

這是你如何做到這一點:

Mail::send([], [], function ($message) { 
    $message->to(..) 
    ->subject(..) 
    // here comes what you want 
    ->setBody('Hi, welcome user!'); // assuming text/plain 
    // or: 
    ->setBody('<h1>Hi, welcome user!</h1>', 'text/html'); // for HTML rich messages 
}); 
+0

對於** html **電子郵件(需要額外的參數)請參閱@ sajjad-ashraf的答案。合併可能會很好嗎? – Bryan 2017-01-06 08:36:05

+1

是真的,加入@ Sajjad的回答 – 2017-01-09 00:44:57

+0

是否可以在這種情況下使用onConnection? – Hlorofos 2017-02-02 08:31:06

30

對HTML電子郵件

Mail::send(array(), array(), function ($message) use ($html) { 
    $message->to(..) 
    ->subject(..) 
    ->from(..) 
    ->setBody($html, 'text/html'); 
}); 
+0

假設你可以設置不同內容類型的多個主體,所以多部分電子郵件同時具有「text/html」和「text/plain」部分? – Jason 2015-09-30 17:04:23

+0

它適用於我 – 2016-03-15 04:25:57

+1

@Jason函數(https://github.com/laravel/framework/blob/master/src/Illuminate/Mail/Mailer.php#L320)使用'addPart()'代替普通部分當設置HTML部分時,'setBody()'的設置 – Philip 2016-04-21 23:50:55

0

它不直接相關的問題,但是對於搜索設置電子郵件的純文本格式,同時保持自定義HTML版本的,你可以用這個例子:

Mail::raw([], function($message) { 
    $message->from('[email protected]', 'Company name'); 
    $message->to('[email protected]'); 
    $message->subject('5% off all our website'); 
    $message->setBody('<html><h1>5% off its awesome</h1><p>Go get it now !</p></html>', 'text/html'); 
    $message->addPart("5% off its awesome\n\nGo get it now!", 'text/plain'); 
}); 

如果您會問「但爲什麼不把第一個參數設置爲純文本?」,我做了一個測試,它只取html部分,忽略原始部分。

如果您需要使用額外的變量,匿名函數都需要你使用use()聲明如下:

Mail::raw([], function($message) use($html, $plain, $to, $subject, $formEmail, $formName){ 
    $message->from($fromEmail, $fromName); 
    $message->to($to); 
    $message->subject($subject); 
    $message->setBody($html, 'text/html'); // dont miss the '<html></html>' if the email dont contains it to decrease your spam score !! 
    $message->addPart($plain, 'text/plain'); 
}); 

希望它可以幫助你的鄉親。

+0

你說得對,這與問題無關。 – nexana 2017-10-10 14:59:11

0

如果您使用郵件。你可以做這樣的事情在構建方法:

public function build() 
{ 

    return $this->view('email') 
     ->with(['html'=>'This is the message']); 
} 

你先走一步,建立在資源文件夾中的刀片觀點email.blade.php

然後在刀片,你可以使用laravel刀片語法

<html> 
    <body> 
     {{$html}} 
    </body> 
    </html> 

<html> 
      <body> 
       {!!$html!!} 
      </body> 
      </html> 

引用您的字符串,如果您原始文本包含HTML標記 我希望這個作品爲那些誰擁有模板存儲在數據庫中,並希望利用Laravel中的Mailables類。

0

要發送原始的HTML,使用Laravel Mailables可以

覆蓋Mailable->發送()在你的可郵寄,並在那裏文字等,使用的方法在以前的答覆:

send([], [], function($message){ $message->setBody() }) 

無需在你的構建函數中調用$ this-> view()。

相關問題