Django – Gửi Email

4.3/5 - (21 votes)

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_emailrecipient_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ỗi smtplib.SMTPException nếu mail không gửi được, mặc định False.
  • auth_user: địa chỉ mail dùng để gửi, không cần đưa vào nếu đã thiết lập trong file settings.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 file settings.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ụ 587
  • EMAIL_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_TLSEMAIL_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()send_mass_mail()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 đề mail
  • body: nội dung mail
  • from_email: địa chỉ mail gửi đi
  • to: danh sách các mail gửi tới
  • bcc: danh sách các địa chỉ được dùng trong Bcc
  • connection: đố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 định
  • attachment: danh sách các file đính kèm, chúng ta có thể dùng lớp email.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ượng django.core.mail.SafeMIMEText hoặc django.core.mail.Safe.MIMEMultipart, đây là các lớp kế thừa từ lớp email.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ượng EmailMessage, bất kể là to, bcc, hay cc...
  • attach(): gửi file đính kèm, chúng ta có thể truyền vào một đối tượng email.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') 
5 1 vote
Article Rating
Subscribe
Thông báo cho tôi qua email khi
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

0 Comments
Inline Feedbacks
View all comments