2014-10-01 17 views
23

Tôi muốn gửi thư xác nhận bằng cách sử dụng laravel. Hàm laravel Mail :: send() dường như chỉ chấp nhận đường dẫn đến tệp trên hệ thống. Vấn đề là các mẫu thư của tôi được lưu trữ trong cơ sở dữ liệu và không nằm trong một tệp trên hệ thống.Thư Laravel: chuyển chuỗi thay vì xem

Tôi làm cách nào để chuyển nội dung đơn giản tới email?

Ví dụ:

$content = "Hi,welcome user!"; 

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

Trả lời

10

Các Mailer lớp đi một chuỗi để addContent mà qua các phương pháp khác nhau gọi views->make(). Kết quả là truyền một chuỗi nội dung trực tiếp sẽ không hoạt động vì nó sẽ thử và tải chế độ xem theo tên đó.

Những gì bạn sẽ cần phải làm là tạo một cái nhìn mà chỉ đơn giản echos $content

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

Và sau đó chèn chuỗi của bạn vào đó xem khi chạy.

$content = "Hi,welcome user!"; 

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

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

Không rất elgant, tôi thích cách Jarek Tkaczyk :) – Ifnot

50

update: Trong Laravel 5 bạn có thể sử dụng raw thay vì:

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

Đây là cách bạn làm điều đó:

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

Đối với email ** html ** (cần thêm đối số) xem câu trả lời của @ sajjad-ashraf. Có thể tốt để hợp nhất? – Bryan

+1

đúng, được thêm vào trong câu trả lời của @ Sajjad –

+0

là nó có thể sử dụng onConnection trong trường hợp đó? – Hlorofos

30

Đối với email Html

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

Có lẽ bạn có thể đặt nhiều nội dung với các loại nội dung khác nhau và do đó, hãy tạo nhiều email với cả phần 'text/html' và' text/plain' cho nó? – Jason

+0

Nó hoạt động với tôi –

+1

@Jason Chức năng (https://github.com/laravel/framework/blob/master/src/Illuminate/Mail/Mailer.php#L320) sử dụng 'addPart()' cho phần thuần túy thay thế của 'setBody()' khi một phần HTML được thiết lập là tốt – Philip

0

Nó không liên quan trực tiếp đến câu hỏi, nhưng đối với những người mà tìm kiếm thiết lập các phiên bản văn bản đơn giản của email của bạn trong khi vẫn giữ phiên bản HTML tùy chỉnh, bạn có thể sử dụng ví dụ này:

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'); 
}); 

Nếu bạn sẽ hỏi "nhưng tại sao không đặt đối số đầu tiên là văn bản thuần túy?", tôi đã thực hiện một thử nghiệm và nó chỉ mất phần html, bỏ qua phần thô.

Nếu bạn cần phải sử dụng biến bổ sung, chức năng ẩn danh sẽ cần bạn sử dụng use() tuyên bố như sau:

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'); 
}); 

Hy vọng nó giúp bạn folks.

+0

Bạn đã đúng, điều này không liên quan gì đến câu hỏi. – nexana

0

Nếu bạn đang sử dụng thư. Bạn có thể làm một cái gì đó như thế này trong phương pháp xây dựng:

public function build() 
{ 

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

Và bạn chỉ cần tiếp tục và tạo chế độ xem lưỡi email.blade.php trong thư mục tài nguyên của bạn.

Sau đó, trong lưỡi bạn có thể tham khảo chuỗi bằng cách sử dụng cú pháp laravel lưỡi

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

hoặc

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

Nếu văn bản thô của bạn có chứa dấu html lên Tôi hy vọng công trình này dành cho những ai có mẫu được lưu trữ trong cơ sở dữ liệu và muốn tận dụng lợi thế của lớp Mailables trong Laravel.

0

Để gửi html liệu, văn bản vv sử dụng Laravel Mailables bạn có thể

override Mailable-> send() trong thể gửi thư của bạn và trong đó, sử dụng phương pháp này trong phản ứng trước:

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

Không cần để gọi $ this-> view() tại hàm xây dựng của bạn.

Các vấn đề liên quan