CodeIgnitor: Lớp Email

Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực

Gửi email là một thao tác thường gặp khi xây dựng một ứng dụng web. Bản thân PHP có hỗ trợ hàm mail() để thực hiện gửi email. Nhưng để thực hiện những chức năng cao cấp hơn, ta có thể sử dụng thư viện Email của CodeIgniter. Thư viện Email hỗ trợ những chức năng sau:

  • Gửi email bằng nhiều giao thức: Mail, Sendmail và SMTP
  • Mã hóa TLS và SSL cho SMTP
  • Có thể gửi cho nhiều người cùng lúc
  • CC (carbon copy) và BCC (blind carbon copy)
  • Gửi email dưới dạng HTML hoặc thuần văn bản
  • Đính kèm tập tin
  • Thiết lập độ ưu tiên
  • Hỗ trợ wordwrap
  • BCC Batch Mode, cho phép chia những danh sách email lớn thành những danh sách nhỏ hơn.
  • Hỗ trợ công cụ tìm lỗi

1. Load thư viện Email

Cũng giống sử dụng các thư viện khác của CodeIgniter, để sử dụng thư viện Email, ta sử dụng phương thức load() như sau:

$this->load->library('email');

2. Thiết lập các tùy chọn

Để sử dụng thư viện Email, ta cần thiết lập các tùy chọn gửi email, chẳng hạn như giao thức, thông số của máy chủ SMTP. Các thiết lập này được lưu vào một mảng, và truyền vào phương thức initialize() để tiến hành khởi tạo. Chẳng hạn:

$config['protocol'] = 'sendmail';

$config['mailpath'] = '/usr/sbin/sendmail';

$config['charset'] = 'utf-8';

$config['wordwrap'] = TRUE;

$this->email->initialize($config);

Ngoài ra, ta cũng có thể lưu các thiết lập vào mảng $config trong tập tin application/config/email.php. Khi đó các thiết lập này sẽ được gọi một cách tự động khi thư viện Email được khai báo sử dụng, ta không cần thiết phải gọi hàm initialize().

Danh sách các tùy chọn:

The following is a list of all the preferences that can be set when sending email.

Thiết lập Giá trị mặc định Tùy chọn Mô tả
useragent CodeIgniter Không có Đại lý người dùng.
protocol mail mail, sendmail hoặc smtp Giao thức dùng để gửi email.
mailpath /usr/sbin/sendmail Không có Đường dẫn đến thư mục Sendmail trên máy chủ (server).
smtp_host Không mặc định Không có Địa chỉ của máy chủ SMTP.
smtp_user Không mặc định Không có Tên tài khoản sử dụng máy chủ SMTP.
smtp_pass Không mặc định Không có Mật khẩu tài khoản SMTP.
smtp_port 25 Không có Cổng truy cập máy chủ SMTP.
smtp_timeout 5 Không có Thời gian trễ tạm ngưng khi truy cập máy chủ SMTP (tính bằng giây).
smtp_keepalive FALSE TRUE hoặc FALSE (boolean) Cho phép kết nối SMTP lâu dài hay không.
smtp_crypto Không mặc định tls hoặc ssl Mã hóa SMTP
wordwrap TRUE TRUE hoặc FALSE (boolean) Cho phép sử dụng wordwrap hay không.
wrapchars 76   Số ký tự trên một dòng khi sử dụng wordwrap.
mailtype text text hoặc html Kiểu của email. Nếu bạn gửi email HTML bạn phải gửi nó dưới dạng một trang web hoàn chỉnh. Cần đảm bảo rằng bạn không có bất kỳ liên kết hoặc đường dẫn ảnh tương đối nào vì chúng sẽ không làm việc.
charset $config['charset']   Tập ký tự (utf-8, iso-8859-1, ...).
validate FALSE TRUE hoặc FALSE (boolean) Có kiểm tra tính hợp lệ của địa chỉ email không.
priority 3 1, 2, 3, 4, 5 Độ ưu tiên của email với 1 là cao nhất, 3 là bình thường và 5 là thấp nhất.
crlf \n "\r\n" hoặc "\n" hoặc "\r" Ký tự xuống dòng (sử dụng \r\n theo RFC 822).
newline \n "\r\n" hoặc "\n" hoặc "\r" Ký tự xuống dòng (sử dụng \r\n theo RFC 822).
bcc_batch_mode FALSE TRUE hoặc FALSE (boolean) Có sử dụng BCC Batch Mode hay không.
bcc_batch_size 200 None Số địa chỉ email mỗi nhóm khi sử dụng BCC Batch Mode.
dsn FALSE TRUE hoặc FALSE (boolean) Có cho phép thông báo nhắc nhở từ server hay không

3. Thao tác gửi email

Sau khi khai báo sử dụng thư viện Email và thiết lập các tùy chọn cần thiết, ta có thể thực hiện gửi email như trong đoạn mã sau:

$this->load->library('email');

$this->email->from('your@example.com', 'Your Name');

$this->email->to('someone@example.com');

$this->email->cc('another@another-example.com');

$this->email->bcc('them@their-example.com');

$this->email->subject('Email Test');

$this->email->message('Testing the email class.');

$this->email->send();

echo $this->email->print_debugger();

4. Wordwrap

Chế độ wordwrap cho phép hiển thị văn bản trong một "khung" nhất định, giúp cho văn bản không tràn ra khỏi khung màn hình và thuận tiện cho người đọc. Theo RFC 822, chế độ wordwrap nên được kích hoạt. Thư viện Email cho phép thực hiện wordwrap trong nội dung email. Sau n ký tự (mặc định là 76, có thể được thiết lập bằng giá trị wrapchars), văn bản sẽ được đưa sang một hàng mới. Tuy nhiên, đối với những liên kết quá dài, khi thực hiện wordwrap sẽ làm cho chúng bị ngắt quãng, không thể click được. Để tránh điều này, thư viện Email sử dụng hai tag {unwrap} {/unwrap} để thông báo cho chương trình biết đoạn văn bản nào sẽ không được thực hiện wordwrap. Ví dụ:

Phần văn bản của email của bạn
sẽ được đẩy xuống dòng.

{unwrap}http://example.com/một_link_dài_nhưng_bạn_không_muốn_bị_xuống_dòng.html{/unwrap}

Các đoạn văn bản email khác
cũng có hiệu ứng tương tự.

Lưu ý: Bạn hãy đặt phần mà bạn không muốn bị hiệu ứng wordwrap giữa {unwrap} và {/unwrap}.

5. Tham chiếu lớp

class CI_Email

from()

Cú pháp:

$this->email->from(string $email, string $name)

Phương thức from() cho phép thiết lập địa chỉ email và tên của người gửi. Ví dụ:

$this->email->from('support@v1study.com', 'V1Study')

reply_to()

Cú pháp:

$this->email->reply_to(string $email, string $name)

Phương thức reply_to() cho phép thiết lập địa chỉ email sẽ nhận trả lời. Nếu phương thức này không được sử dụng, hệ thống sẽ tự nhận địa chỉ email trong phương thức from() làm địa chỉ nhận trả lời.

to()

Cú pháp:

$this->email->to(string/array $emailAddresses)

Phương thức to() cho phép thiết lập những địa chỉ email sẽ được gửi. Các địa chỉ này được cách nhau bởi dấu phẩy (,) hoặc được lưu trong một mảng. Ví dụ:

$this->email->to('one@example.com, two@example.com, three@example.com');

$list = array('one@example.com', 'two@example.com', 'three@example.com');

$this->email->to($list);

cc()

Cú pháp:

$this->email->cc(string/array $emailAddresses)

Phương thức cc() cho phép thiết lập những địa chỉ email sẽ được nhận bản sao khi gửi email (carbon copy). Người nhận sẽ thấy những địa chỉ được thiết lập bằng phương thức cc(). Cũng giống như phương thức to(), ta có thể truyền vào danh sách các địa chỉ email hoặc một mảng.

bcc()

Cú pháp:

$this->email->bcc(string/array $emailAddresses)

Phương thức bcc() cho phép thiết lập những địa chỉ email sẽ được nhận bản sao khi gửi email, tuy nhiên người nhận sẽ không thấy những email được thiết lập trong phương thức to(), cc() và bcc() (blind carbon copy). Cũng giống như phương thức to(), ta có thể truyền vào danh sách các địa chỉ email hoặc một mảng.

subject()

Cú pháp:

$this->email->subject(string $subject)

Phương thức subject() cho phép thiết lập tiêu đề của email.

message()

Cú pháp:

$this->email->message(string $message)

Phương thức message() cho phép thiết lập nội dung của email.

set_alt_message()

Cú pháp:

$this->email->set_alt_message(string $message)

Phương thức set_alt_message() cho phép thiết lập nội dung thay thế của email. Nếu email được gửi có dạng HTML nhưng người nhận không muốn hiển thị HTML vì lý do bảo mật, nội dung thay thế này sẽ được hiển thị. Nếu phương thức này không được sử dụng, CodeIgniter sẽ tự động tách bỏ các tag HTML trong phần nội dung email làm nội dung thay thế.

set_header($header, $value)

Cú pháp:

$this->email->set_header($header, $value);

Hàm này có tác dụng thiết lập các tiêu đề (header) cho e-mail. Ví dụ:

$this->email->set_header('Tiêu_đề1', 'Giá_trị1');
$this->email->set_header('Tiêu_đề2', 'Giá_trị2');

clear()

Cú pháp:

$this->email->clear([boolean $clearAttachment])

Phương thức clear() sẽ xóa tất cả giá trị đ~ được thiết lập bởi các phương thức from(), reply_to(), to(), cc(), bcc(), subject(), message(). Phương thức này thường được sử dụng bên trong vòng lặp, giúp khởi động lại các giá trị sau mỗi lần lặp. Ví dụ:

foreach ($list as $name => $address) {

    $this->email->clear();

    $this->email->to($address);

    $this->email->from('your@example.com');

    $this->email->subject('Here is your info '.$name);

    $this->email->message('Hi '.$name.' Here is the info you requested.');

    $this->email->send();

}

Nếu biến tùy chọn $clearAttachment có giá trị TRUE, tất cả tập tin đính kèm cũng bị xóa.

send()

Cú pháp:

$this->email->send()

Phương thức send() sẽ thực hiện việc gửi email. Phương thức này trả về TRUE nếu gửi email thành công, ngược lại trả về FALSE.

attach()

Cú pháp:

$this->email->attach(string $filePath)

Phương thức attach() sẽ đính kèm tập tin vào email. Phương thức này nhận đường dẫn tương đối đến tập tin trên máy chủ làm đối số thứ nhất. Nếu muốn đính kèm nhiều tập tin, ta gọi phương thức này nhiều lần.

attachment_cid()

Cú pháp:

$this->email->attachment_cid($filename);

Thiết lập và trả về một Content-ID của tệp tin đính kèm, điều này cho phép bạn có thể nhúng một tệp tin (một ảnh chẳng hạn) vào phần HTML. Lưu ý là tham số của hàm phải là một tệp tin đã được đính kèm. Ví dụ:

$filename = '/img/photo1.jpg';
$this->email->attach($filename);
foreach ($list as $address)
{
    $this->email->to($address);
    $cid = $this->email->attachment_cid($filename);
    $this->email->message('<img src='cid:". $cid ."' alt="photo1" />');
    $this->email->send();
}

Lưu ý là Content-ID (CID) cho mỗi email phải được tạo lại để nó trở thành duy nhất.

print_debugger()

Cú pháp:

$this->email->print_debugger()

Phương thức print_debugger() sẽ hiển thị những thông tin trả về từ phía server, email header cũng như nội dung email. Thường được sử dụng cho việc gỡ lỗi. Ví dụ:

if ( $this->email->send() == FALSE ) {

    $this->email->print_debugger();

}

» Tiếp: Thư viện Encryption
« Trước: Form Validation
Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực
Copied !!!