Gửi email trong Zend Framework

Thư viện thành phần sử dụng là zend-mail, tải về tại zend-mail hoặc tự động tích hợp vào dự án của bạn với composer:

 composer require zendframework/zend-mail

Để gửi Email thật đơn giản với hai việc:

  1. Tạo một nội dung Email thông qua sử dụng Mail\Message
  2. Dùng một Transport của Zend để gửi mail đó đi

Tìm hiểu về Transport

Transport là cơ chế của ZF để chuyển email đi. ZF cung cấp sẵn cho bạn các loại Transport mà tùy mục đích bạn thích sử dụng cái nào thì chọn:

  • Sendmail (Zend\Mail\Transport\Sendmail): Transport này sử dụng hàm mail() của PHP để gửi mail
  • Smtp (Zend\Mail\Transport\Smtp): gửi mail với giao thức Smtp
  • File (Zend\Mail\Transport\File): email sẽ được lưu thành file trong đĩa

Ngoài ra còn có InMemory mục đích để lập trình viên kiểm tra email.

Vậy để gửi được mail, trước tiên cần tạo ra một Transport phù hợp, dưới đây là một vài trường hợp tạo Transport, bạn chọn loại nào phù hợp với mình để sử dụng

Ví dụ Transport với SendMail

use Zend\Mail\Message;
use Zend\Mail\Transport\Sendmail;

//Tạo nội dung Email
$message = new Message();
$message->addTo('emailnhan@example.com');
$message->addFrom('emailgui@example.org');
$message->setSubject('Tiêu đề Email!');
$message->setBody("Nội dung Email ở đây ...!");

//Tạo Transport
$transport = new Sendmail();
$transport->send($message);

Tạo Transport bằng Smtp

Ví dụ sử dụng Gmail để gửi email đi, bạn tạo Transport Smtp như sau:

use Zend\Mail\Transport\Smtp;
use Zend\Mail\Transport\SmtpOptions;

//Tạo và cấu hình Transport SMTP
$transport = new Smtp();
$options = new SmtpOptions(
    array(
        'name' => 'YourName',
        'host' => 'smtp.gmail.com',
        'port' => 587,
        'connection_class' => 'plain',
        'connection_config' =>
            array(
                'username' => 'yourgmail@gmail.com',
                'password' => 'pass',
                'ssl' => 'tls', ),
        )
);
$transport->setOptions($options);

//Tạo nội dung Email
$message = new Message();
$message->addTo('emailnhan@example.com');
$message->addFrom('emailgui@example.org');
$message->setSubject('Tiêu đề Email!');
$message->setBody("Nội dung Email ở đây ...!");

//Gửi mail đi
$transport->send($mail);

Tạo Transport bằng File

Trong trường hợp bạn muốn lưu email trên đĩa với định dạng có thể xem được bằng các trình đọc email thì sử dụng File

use Zend\Mail\Message;
use Zend\Mail\Transport\File;
use Zend\Mail\Transport\FileOptions;

// Setup File transport
$transport = new File();
$options   = new FileOptions([
    'path'     => 'data/mail/', //Thư mục lưu trữ email
    'callback' => function (File $transport) {
        //phát sinh tên file lưu trữ
        return sprintf(
            'Message_%f_%s.txt',
            microtime(true),
            time()
        );
    },
]);
$transport->setOptions($options);


//Tạo nội dung Email
$message = new Message();
$message->addTo('emailnhan@example.com');
$message->addFrom('emailgui@example.org');
$message->setSubject('Tiêu đề Email!');
$message->setBody("Nội dung Email ở đây ...!");

//Gửi mail đi
$transport->send($mail);

Soạn thảo Mail với Message

Zend\Mail\Message là lớp đối tượng hóa các email, nó có thể là một email đơn giản hoặc dạng multi-part (nhiều phần). Tùy thuộc vào loại Transport mà Message cần thêm một số option. Tạo Message đơn giản tham khảo ở trên, ở ví dụ sau tạo một Message cho đính kèm:

Lưu ý: Zend\Mail\MessageZend\Mime\Message

use Zend\Mail\Message;


$textContent = 'Đây là văn bản email';

$htmlMarkup  = '<h1>Đây là HTML</h1>
                <p>Nội dung HTML</p>';

$pathToImage = '/home/website/dinhkem.png';

//Tạo thành phần chứa văn bản
$text = new Message($textContent);
$text->type = "text/plain";

//Tạo thành phần chứa HTML
$html = new Message($htmlMarkup);
$html->type = "text/html";

//Tạo thành phần đính kèm
$image = new Message(fopen($pathToImage, 'r'));
$image->type = "image/jpeg";

//Toàn bộ các thành phần trên tích hợp vào một Message
$body = new Zend\Mime\Message();
$body->setParts(array($text, $html, $image));

$message = new Message();
$message->addTo('emailnhan@example.com');
$message->addFrom('emailgui@example.org');
$message->setSubject('Tiêu đề Email!');
$message->setBody($body);

Sau khi có được $message bạn gửi đi bằng cách sử dụng một trong các Transport ở trê.

Ví dụ đơn giản gửi HTML trong Mail

use Zend\Mail\Message;
use Zend\Mail\Transport\Sendmail;



$htmlMarkup  = '<h1>Gửi Email</h1>
                <p>Chèn thêm các nội dung HTML ...</p> ...';



//Tạo thành phần chứa HTML
$html = new Message($htmlMarkup);
$html->type = "text/html";


$body = new Zend\Mime\Message();
$body->setParts(array($html));


$message = new Message();
$message->addTo('emailnhan@example.com');
$message->addFrom('emailgui@example.org');
$message->setSubject('Tiêu đề Email!');
$message->setBody($body);

//Tiến hành gửi Email
$transport = new Sendmail();
$transport->send($message);