Mặc định thì Python có sẵn một module hỗ trợ gửi email là smtplib
nhưng Django cũng có module riêng giúp chúng ta gửi mail một cách dễ dàng và nhanh chóng là django.core.mail.
Hàm send_mail()
Cú pháp:
send_mail(subject,
message, from_email, recipient_list, fail_silently=False, auth_user=None, auth_password=None, connection=None, html_message=None)
Trong đó subject, message, from_email
và recipient_list
là bắt buộc phải có.
subject:
tiêu đề mail.message:
nội dung mail gửi đi.from_email:
địa chỉ mail dùng để gửi.recipient_list:
danh sách địa chỉ mail gửi tới.fail_silently:
nếu làTrue
thì Django sẽ giải phóng lỗismtplib.SMTPException
nếu mail không gửi được, mặc địnhFalse.
auth_user:
địa chỉ mail dùng để gửi, không cần đưa vào nếu đã thiết lập trong filesettings.py.
auth_password:
mật khẩu của địa chỉ mail dùng để gửi, không cần đưa vào nếu đã thiết lập trong filesettings.py.
connection:
tên đối tượng mail backend xử lý việc gửi mail, nếu không truyền vào thì Django sẽ tự động tạo một đối tượng mặc định, thường chúng ta cũng không quan tâm đến tham số này.html_message:
nội dung mail gửi đi dưới dạng HTML.
Hàm này sẽ trả về 1 nếu mail gửi thành công và 0 nếu thất bại.
Ví dụ:
from django.core.mail import send_mail send_mail('Subject', 'Message', 'from@example.com', ['to@example.com'], fail_silently=False)
Các thiết lập của mail được lưu trong file settings.py,
trong file này chúng ta khai báo các biến sau:
EMAIL_HOST:
tên máy chủ mail, ví dụsmtp.google.com
EMAIL_PORT:
số port của máy chủ mail, ví dụ 587EMAIL_HOST_USER:
địa chỉ email dùng để gởi đi, ví dụfrom@example.com
EMAIL_HOST_PASSWORD:
mật khẩu đăng nhập email dùng để gởi đi.EMAIL_USE_TLS
vàEMAIL_USE_SSL:
True nếu muốn dùng các giao thức bảo mật SSL/TLS
Hàm send_mass_mail()
Hàm send_mass_mail()
đơn giản là dùng để gửi một lúc nhiều mail.
Cú pháp:
send_mass_mail(datatuple, fail_silently=False, auth_user=None, auth_password=None, connection=None)
Các tham số cũng giống như trong hàm send_mail()
ngoại trừ tham số datatuple,
tham số này nhận một đối tượng tuple, mỗi phần tử lại là một tuple khác lưu những thông tin về mail được gửi đi có dạng như sau:
(subject, message, from_email, recipient_list)
Ví dụ:
message1 = ('Subject 1', 'Message 1', 'from@example.com', ['first@example.com', 'other@example.com']) message2 = ('Subject 2', 'Message 2', 'from@example.com', ['second@test.com']) send_mass_mail((message1, message2), fail_silently=False)
Hàm send_mass_mail()
cũng trả về 0 hoặc 1 tương ứng với thành công hoặc thất bại.
Sự khác nhau giữa send_mail()
và send_mass_mail()
là send_mail()
khi gửi mail nào thì phải mở và đóng kết nối tới server SMTP, trong khi send_mass_mail()
chỉ cần mở một kết nối rồi gửi tất cả luôn, do đó send_mass_mail()
hiệu quả hơn send_mail()
.
Hàm mail_admins()
Hàm này có tác dụng gửi mail cho ban quản trị website, mail của quản trị website (admin) được liệt kê trong biến ADMINS
trong file settings.py
dưới dạng:
... ADMINS = [('John', 'john@example.com'), ('Mary', 'mary@example.com')] ...
Cú pháp:
mail_admins(subject, message, fail_silently=False, connection=None, html_message=None)
Lưu ý: đoạn chuỗi được lưu trong biến EMAIL_SUBJECT_PREFIX
trong file settings.py
sẽ được chèn vào trước tham số subject,
mặc định biến này có giá trị ” [Django] “.
Các thông tin khác như server, port, mail người gửi sẽ được dùng trong file settings.py.
Hàm mail_managers()
Hàm này có công dụng giống như hàm mail_admins(),
chỉ khác là gửi cho danh sách mail trong biến MANAGERS
trong file settings.py.
Cú pháp:
mail_managers(subject, message, fail_silently=False, connection=None, html_message=None)
Lớp EmailMessage
Các hàm send_mail()
hay send_mass_mail()
chỉ là các hàm cấp cao hỗ trợ chúng ta gửi mail cho dễ dàng, thực chất việc gửi mail được thực hiện qua lớp EmailMessage.
Cũng chính vì thế mà có nhiều tính năng có trong lớp EmailMessage
mà chúng ta không sử dụng được với 2 hàm trên chẳng hạn như BCC, gửi file đính kèm, gửi nội dung đa phương tiện…
Bản chất thì lớp EmailMessage
chỉ làm công việc là tạo nội dung email sẽ được gửi đi, còn phần gửi được thực hiện bởi email-backend phía dưới nữa. Lớp EmailMessage
cũng chỉ hỗ trợ gửi từng mail đơn lẻ với phương thức send().
Để gửi nhiều mail cùng một lúc thì chúng ta phải can thiệp vào backend.
Lớp EmailMessage
có các thuộc tính và cũng là tham số trong hàm khởi tạo như sau:
subject:
tiêu đề mailbody:
nội dung mailfrom_email:
địa chỉ mail gửi đito:
danh sách các mail gửi tớibcc:
danh sách các địa chỉ được dùng trong Bccconnection:
đối tượng backend, nếu chúng ta không khai báo thì Django sẽ tự tạo một đối tượng mặc địnhattachment:
danh sách các file đính kèm, chúng ta có thể dùng lớpemail.MIMEBase.MIMEBase
hoặc khai báo theo dạng(filename, content, mimetype)
.headers:
một đối tượng dictionary dùng cho header của mail.cc:
list hoặc tuple các địa chỉ mail dùng cho Carbon Copy (Cc).reply_to:
list hoặc tuple địa chỉ mail dùng khi trả lời mail.
Ví dụ:
from django.core.mail import EmailMessage email = EmailMessage('Hello', 'Body', 'from@example.com', ['to1@example.com', 'to2@example.com'], ['bcc@example.com'], reply_to=['another@example.com'], headers={'Message-ID': 'foo'})
Lớp EmailMessage
có các phương thức sau đây:
send(fail_silently=False)
sẽ gửi mail đi. Tham sốfail_silently
sẽ giải phóng lỗi exception nếu là True, ngược lại (và mặc định) là False.message()
khởi tạo một đối tượngdjango.core.mail.SafeMIMEText
hoặcdjango.core.mail.Safe.MIMEMultipart,
đây là các lớp kế thừa từ lớpemail.MIMEText.MIMEText
trong Python, có nhiệm vụ lưu thông tin về nội dung mail được gửi đi.recipients()
trả về các danh sách địa chỉ mail có trong đối tượngEmailMessage,
bất kể làto, bcc,
haycc...
attach():
gửi file đính kèm, chúng ta có thể truyền vào một đối tượngemail.MIMEBase.MIMEBase
hoặc một tuple có dạng(filename, content, mimetype).
Ví dụ:
message.attach('design.png', img_data, 'image/png')
attach_file()
cũng gửi file đính kèm với tham số là đường dẫn đến file trong máy. Ví dụ:
message.attach_file('images/weather_map.png')