Gần đây mình đã tìm hiểu về Python 3 để xem làm thế nào để có thể bắn ra một loạt email. Có thể có nhiều phương pháp đơn giản hơn để làm điều này, nhưng những cách dưới đây mình thấy hiệu quả ít nhất là đối với mình.
Và đây là kịch bản: Bạn có tên và địa chỉ email của một loạt các địa chỉ liên lạc. Và bạn muốn gửi một tin nhắn đến từng người trong số những người liên hệ đó, trong khi thêm một người thân yêu “Dear [name]” tên ở đầu tin nhắn.
Để đơn giản, bạn có thể lưu trữ các chi tiết liên lạc trong một tệp chứ không phải là cơ sở dữ liệu. Bạn cũng có thể lưu trữ mẫu của tin nhắn bạn muốn gửi trong một tệp.
Các smtplib mô-đun của Python về cơ bản tất cả các bạn cần khii email đơn giản, mà không cần bất kỳ dòng tiêu đề hoặc thông tin bổ sung như vậy. Nhưng đối với email thực , bạn cần một dòng chủ đề và nhiều thông tin – thậm chí có thể là hình ảnh và tệp đính kèm.
Đây là nơi gói email của Python xuất hiện. Hãy nhớ rằng không thể gửi thư email chỉ bằng emailgói. Bạn cần một sự kết hợp của cả hai emailvà smtplib.
Dưới đây là bốn bước cơ bản để gửi email bằng Python:
1.Thiết lập máy chủ SMTP và đăng nhập vào tài khoản của bạn.
2.Tạo MIMEMultipartđối tượng tin nhắn và tải nó với tiêu đề phù hợp với From, Tovà Subjectcác lĩnh vực
3.Thêm cơ thể tin nhắn của bạn.
4.Gửi tin nhắn bằng cách sử dụng đối tượng máy chủ SMTP.
Bây giờ hãy để mình hướng dẫn các bạn toàn bộ quá trình
Giả sử bạn có một tệp liên hệ mycontacts.txt
như sau:
1 2 3 4 | <a href="/cdn-cgi/l/email-protection" class="__cf_email__">[email protected]</a> ~ $ cat mycontacts.txt john <a href="/cdn-cgi/l/email-protection" class="__cf_email__">[email protected]</a> katie <a href="/cdn-cgi/l/email-protection" class="__cf_email__">[email protected]</a> |
Mỗi dòng đại diện cho một liên hệ duy nhất. Chúng ta có tên theo sau là địa chỉ email. Mình đang lưu trữ mọi thứ bằng chữ thường. Mình sẽ để nó theo logic lập trình để chuyển đổi bất kỳ trường nào sang chữ hoa hoặc chữ thường nếu cần. Tất cả điều đó là khá dễ dàng trong Python.
Tiếp theo, chúng ta có tệp tin mẫu message.txt.
1 2 3 4 5 6 7 8 9 | <a href="/cdn-cgi/l/email-protection" class="__cf_email__">[email protected]</a> <span class="token operator">~</span> $ cat message<span class="token punctuation">.</span>txt Dear $<span class="token punctuation">{</span><span class="token constant">PERSON_NAME</span><span class="token punctuation">}</span><span class="token punctuation">,</span> This is a test message<span class="token punctuation">.</span> Have a great weekend<span class="token operator">!</span> Yours Truly |
Có chú ý chữ ${PERSON_NAME}?
Đó là một chuỗi mẫu trong Python. Chuỗi mẫu có thể dễ dàng được thay thế bằng các chuỗi khác; trong ví dụ này, ${PERSON_NAME}
sẽ được thay thế bằng tên thật của người đó, như bạn sẽ thấy ngay sau đây.
Bây giờ hãy bắt đầu với code Python, chúng ta cần đọc các liên hệ từ mycontacts.txt
tập tin. Chúng ta cũng có thể khái quát bit này vào chức năng riêng của nó.
1 2 3 4 5 6 7 8 9 10 11 | <span class="token comment"># Function to read the contacts from a given contact file and return a</span> <span class="token comment"># list of names and email addresses</span> <span class="token keyword">def</span> <span class="token function">get_contacts</span><span class="token punctuation">(</span>filename<span class="token punctuation">)</span><span class="token punctuation">:</span> names <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span> emails <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token keyword">with</span> <span class="token builtin">open</span><span class="token punctuation">(</span>filename<span class="token punctuation">,</span> mode<span class="token operator">=</span><span class="token string">'r'</span><span class="token punctuation">,</span> encoding<span class="token operator">=</span><span class="token string">'utf-8'</span><span class="token punctuation">)</span> <span class="token keyword">as</span> contacts_file<span class="token punctuation">:</span> <span class="token keyword">for</span> a_contact <span class="token keyword">in</span> contacts_file<span class="token punctuation">:</span> names<span class="token punctuation">.</span>append<span class="token punctuation">(</span>a_contact<span class="token punctuation">.</span>split<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span> emails<span class="token punctuation">.</span>append<span class="token punctuation">(</span>a_contact<span class="token punctuation">.</span>split<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token keyword">return</span> names<span class="token punctuation">,</span> emails |
Hàm get_contacts()
ấy tên tệp làm đối số của nó. Nó sẽ mở tệp, đọc từng dòng (nghĩa là từng liên hệ), chia nó thành tên và email, sau đó nối chúng vào hai danh sách riêng biệt. Cuối cùng, hai danh sách được trả về từ hàm.
Chúng ta cũng cần một hàm để đọc trong tệp mẫu (như message.txt
) và trả về mộtTemplate
đối tượng được tạo từ nội dung của nó.
1 2 3 4 5 6 7 | <span class="token keyword">from</span> string <span class="token keyword">import</span> Template <span class="token keyword">def</span> <span class="token function">read_template</span><span class="token punctuation">(</span>filename<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword">with</span> <span class="token builtin">open</span><span class="token punctuation">(</span>filename<span class="token punctuation">,</span> <span class="token string">'r'</span><span class="token punctuation">,</span> encoding<span class="token operator">=</span><span class="token string">'utf-8'</span><span class="token punctuation">)</span> <span class="token keyword">as</span> template_file<span class="token punctuation">:</span> template_file_content <span class="token operator">=</span> template_file<span class="token punctuation">.</span>read<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">return</span> Template<span class="token punctuation">(</span>template_file_content<span class="token punctuation">)</span> |
Cũng giống như hàm trước, hàm này lấy tên tệp làm đối số của nó.
Để gửi email, bạn cần sử dụng SMTP (Giao thức chuyển thư đơn giản) . Như đã đề cập trước đó, Python cung cấp các thư viện để xử lý tác vụ này.
1 2 3 4 5 6 7 | <span class="token comment"># import the smtplib module. It should be included in Python by default</span> <span class="token keyword">import</span> smtplib <span class="token comment"># set up the SMTP server</span> s <span class="token operator">=</span> smtplib<span class="token punctuation">.</span>SMTP<span class="token punctuation">(</span>host<span class="token operator">=</span><span class="token string">'your_host_address_here'</span><span class="token punctuation">,</span> port<span class="token operator">=</span>your_port_here<span class="token punctuation">)</span> s<span class="token punctuation">.</span>starttls<span class="token punctuation">(</span><span class="token punctuation">)</span> s<span class="token punctuation">.</span>login<span class="token punctuation">(</span>MY_ADDRESS<span class="token punctuation">,</span> PASSWORD<span class="token punctuation">)</span> |
Trong đoạn mã trên, bạn đang nhập smtplib và sau đó tạo một phiên bản SMTP đóng gói kết nối SMTP. Nó lấy tham số là địa chỉ máy chủ và số cổng, cả hai đều phụ thuộc hoàn toàn vào cài đặt SMPT của nhà cung cấp dịch vụ email cụ thể của bạn. Chẳng hạn, trong trường hợp của Outlook, dòng 4 ở trên sẽ là:
1 2 | s <span class="token operator">=</span> smtplib<span class="token punctuation">.</span>SMTP<span class="token punctuation">(</span>host<span class="token operator">=</span><span class="token string">'smtp-mail.outlook.com'</span><span class="token punctuation">,</span> port<span class="token operator">=</span><span class="token number">587</span><span class="token punctuation">)</span> |
Bạn nên sử dụng địa chỉ máy chủ và số cổng của nhà cung cấp dịch vụ email cụ thể của mình để toàn bộ hoạt động.
MY_ADDRESS
và PASSWORD
ở trên là hai biến chứa địa chỉ email và mật khẩu đầy đủ của tài khoản bạn sẽ sử dụng.
Bây giờ sẽ là thời điểm tốt để lấy thông tin liên lạc và các mẫu tin nhắn bằng cách sử dụng các chức năng chúng tôi đã xác định ở trên.
1 2 3 | names<span class="token punctuation">,</span> emails <span class="token operator">=</span> get_contacts<span class="token punctuation">(</span><span class="token string">'mycontacts.txt'</span><span class="token punctuation">)</span> <span class="token comment"># read contacts</span> message_template <span class="token operator">=</span> read_template<span class="token punctuation">(</span><span class="token string">'message.txt'</span><span class="token punctuation">)</span> |
Bây giờ, đối với mỗi liên hệ đó, hãy gửi thư riêng.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <span class="token comment"># import necessary packages</span> <span class="token keyword">from</span> email<span class="token punctuation">.</span>mime<span class="token punctuation">.</span>multipart <span class="token keyword">import</span> MIMEMultipart <span class="token keyword">from</span> email<span class="token punctuation">.</span>mime<span class="token punctuation">.</span>text <span class="token keyword">import</span> MIMEText <span class="token comment"># For each contact, send the email:</span> <span class="token keyword">for</span> name<span class="token punctuation">,</span> email <span class="token keyword">in</span> <span class="token builtin">zip</span><span class="token punctuation">(</span>names<span class="token punctuation">,</span> emails<span class="token punctuation">)</span><span class="token punctuation">:</span> msg <span class="token operator">=</span> MIMEMultipart<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment"># create a message</span> <span class="token comment"># add in the actual person name to the message template</span> message <span class="token operator">=</span> message_template<span class="token punctuation">.</span>substitute<span class="token punctuation">(</span>PERSON_NAME<span class="token operator">=</span>name<span class="token punctuation">.</span>title<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment"># setup the parameters of the message</span> msg<span class="token punctuation">[</span><span class="token string">'From'</span><span class="token punctuation">]</span><span class="token operator">=</span>MY_ADDRESS msg<span class="token punctuation">[</span><span class="token string">'To'</span><span class="token punctuation">]</span><span class="token operator">=</span>email msg<span class="token punctuation">[</span><span class="token string">'Subject'</span><span class="token punctuation">]</span><span class="token operator">=</span><span class="token string">"This is TEST"</span> <span class="token comment"># add in the message body</span> msg<span class="token punctuation">.</span>attach<span class="token punctuation">(</span>MIMEText<span class="token punctuation">(</span>message<span class="token punctuation">,</span> <span class="token string">'plain'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment"># send the message via the server set up earlier.</span> s<span class="token punctuation">.</span>send_message<span class="token punctuation">(</span>msg<span class="token punctuation">)</span> <span class="token keyword">del</span> msg |
Đối với mỗi name
vàemai
l(từ tập tin danh bạ), bạn đang tạo một MIMEMultipar
t đối tượng, lập From
, To
, Subjectcontent-type
tiêu đề như một cuốn từ điển từ khóa, và sau đó gắn các nội dung thư choMIMEMultipart
đối tượng dưới dạng văn bản đơn giản. Bạn có thể muốn đọc tài liệu để tìm hiểu thêm về các loạiMIME
khác mà bạn có thể thử nghiệm.
Cũng lưu ý rằng trên dòng 10 ở trên, mình sẽ thay thế ${PERSON_NAME}
bằng tên thực được trích xuất từ tệp danh bạ bằng cơ chế tạo khuôn mẫu trong Python .
Trong ví dụ cụ thể này, mình sẽ xóa MIMEMultipart
đối tượng và tạo lại nó mỗi khi bạn lặp qua vòng lặp.
Khi đã xong, bạn có thể gửi tin nhắn bằng hàm send_message ()
tiện dụng của đối tượng SMTP
mà bạn đã tạo trước đó.
Đây là code đầy đủ:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | <span class="token keyword">import</span> smtplib <span class="token keyword">from</span> string <span class="token keyword">import</span> Template <span class="token keyword">from</span> email<span class="token punctuation">.</span>mime<span class="token punctuation">.</span>multipart <span class="token keyword">import</span> MIMEMultipart <span class="token keyword">from</span> email<span class="token punctuation">.</span>mime<span class="token punctuation">.</span>text <span class="token keyword">import</span> MIMEText MY_ADDRESS <span class="token operator">=</span> <span class="token string">'<a href="/cdn-cgi/l/email-protection" class="__cf_email__">[email protected]</a>'</span> PASSWORD <span class="token operator">=</span> <span class="token string">'mypassword'</span> <span class="token keyword">def</span> <span class="token function">get_contacts</span><span class="token punctuation">(</span>filename<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token triple-quoted-string string">""" Return two lists names, emails containing names and email addresses read from a file specified by filename. """</span> names <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span> emails <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token keyword">with</span> <span class="token builtin">open</span><span class="token punctuation">(</span>filename<span class="token punctuation">,</span> mode<span class="token operator">=</span><span class="token string">'r'</span><span class="token punctuation">,</span> encoding<span class="token operator">=</span><span class="token string">'utf-8'</span><span class="token punctuation">)</span> <span class="token keyword">as</span> contacts_file<span class="token punctuation">:</span> <span class="token keyword">for</span> a_contact <span class="token keyword">in</span> contacts_file<span class="token punctuation">:</span> names<span class="token punctuation">.</span>append<span class="token punctuation">(</span>a_contact<span class="token punctuation">.</span>split<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span> emails<span class="token punctuation">.</span>append<span class="token punctuation">(</span>a_contact<span class="token punctuation">.</span>split<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token keyword">return</span> names<span class="token punctuation">,</span> emails <span class="token keyword">def</span> <span class="token function">read_template</span><span class="token punctuation">(</span>filename<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token triple-quoted-string string">""" Returns a Template object comprising the contents of the file specified by filename. """</span> <span class="token keyword">with</span> <span class="token builtin">open</span><span class="token punctuation">(</span>filename<span class="token punctuation">,</span> <span class="token string">'r'</span><span class="token punctuation">,</span> encoding<span class="token operator">=</span><span class="token string">'utf-8'</span><span class="token punctuation">)</span> <span class="token keyword">as</span> template_file<span class="token punctuation">:</span> template_file_content <span class="token operator">=</span> template_file<span class="token punctuation">.</span>read<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">return</span> Template<span class="token punctuation">(</span>template_file_content<span class="token punctuation">)</span> <span class="token keyword">def</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span> names<span class="token punctuation">,</span> emails <span class="token operator">=</span> get_contacts<span class="token punctuation">(</span><span class="token string">'mycontacts.txt'</span><span class="token punctuation">)</span> <span class="token comment"># read contacts</span> message_template <span class="token operator">=</span> read_template<span class="token punctuation">(</span><span class="token string">'message.txt'</span><span class="token punctuation">)</span> <span class="token comment"># set up the SMTP server</span> s <span class="token operator">=</span> smtplib<span class="token punctuation">.</span>SMTP<span class="token punctuation">(</span>host<span class="token operator">=</span><span class="token string">'your_host_address_here'</span><span class="token punctuation">,</span> port<span class="token operator">=</span>your_port_here<span class="token punctuation">)</span> s<span class="token punctuation">.</span>starttls<span class="token punctuation">(</span><span class="token punctuation">)</span> s<span class="token punctuation">.</span>login<span class="token punctuation">(</span>MY_ADDRESS<span class="token punctuation">,</span> PASSWORD<span class="token punctuation">)</span> <span class="token comment"># For each contact, send the email:</span> <span class="token keyword">for</span> name<span class="token punctuation">,</span> email <span class="token keyword">in</span> <span class="token builtin">zip</span><span class="token punctuation">(</span>names<span class="token punctuation">,</span> emails<span class="token punctuation">)</span><span class="token punctuation">:</span> msg <span class="token operator">=</span> MIMEMultipart<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment"># create a message</span> <span class="token comment"># add in the actual person name to the message template</span> message <span class="token operator">=</span> message_template<span class="token punctuation">.</span>substitute<span class="token punctuation">(</span>PERSON_NAME<span class="token operator">=</span>name<span class="token punctuation">.</span>title<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment"># Prints out the message body for our sake</span> <span class="token keyword">print</span><span class="token punctuation">(</span>message<span class="token punctuation">)</span> <span class="token comment"># setup the parameters of the message</span> msg<span class="token punctuation">[</span><span class="token string">'From'</span><span class="token punctuation">]</span><span class="token operator">=</span>MY_ADDRESS msg<span class="token punctuation">[</span><span class="token string">'To'</span><span class="token punctuation">]</span><span class="token operator">=</span>email msg<span class="token punctuation">[</span><span class="token string">'Subject'</span><span class="token punctuation">]</span><span class="token operator">=</span><span class="token string">"This is TEST"</span> <span class="token comment"># add in the message body</span> msg<span class="token punctuation">.</span>attach<span class="token punctuation">(</span>MIMEText<span class="token punctuation">(</span>message<span class="token punctuation">,</span> <span class="token string">'plain'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment"># send the message via the server set up earlier.</span> s<span class="token punctuation">.</span>send_message<span class="token punctuation">(</span>msg<span class="token punctuation">)</span> <span class="token keyword">del</span> msg <span class="token comment"># Terminate the SMTP session and close the connection</span> s<span class="token punctuation">.</span>quit<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">if</span> __name__ <span class="token operator">==</span> <span class="token string">'__main__'</span><span class="token punctuation">:</span> main<span class="token punctuation">(</span><span class="token punctuation">)</span> |
Mình tin rằng sau bài hướng dẫn này việc gửi mail bằng pyhon đã trở nên dễ dàng hơn nhiều so với trước kia.
Hãy sử dụng và cấu hình sao cho phù hợp nhất cho việc sử dụng của bạn nhé
Ngoài các tài liệu Python chính thức, mình có tham khảo thêm các nguồn tài liệu khác ở đây http://naelshiab.com/tutorial-send-email-python/