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àTruethì Django sẽ giải phóng lỗismtplib.SMTPExceptionnế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.comEMAIL_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.comEMAIL_HOST_PASSWORD:mật khẩu đăng nhập email dùng để gởi đi.EMAIL_USE_TLSvà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 EmailMessagemà 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.MIMEBasehoặ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_silentlysẽ 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.SafeMIMETexthoặcdjango.core.mail.Safe.MIMEMultipart,đây là các lớp kế thừa từ lớpemail.MIMEText.MIMETexttrong 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.MIMEBasehoặ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')