2012-05-11 43 views
11

Tôi đang tạo email với sự trợ giúp của mô-đun email Python.
Dưới đây là vài dòng mã, trong đó cho thấy câu hỏi của tôi:Mô-đun email Python: tiêu đề biểu mẫu "Từ" với một số tên unicode + email

msg = email.MIMEMultipart.MIMEMultipart('alternative') 

msg['From'] = "[email protected]" 

msg.as_string() 

Out[7]: 'Content-Type: multipart/alternative;\n boundary="===============9006870443159801881=="\nMIME-Version: 1.0\nFrom: [email protected]\n\n--===============9006870443159801881==\n\n--===============9006870443159801881==--' 

Như bạn thấy, mọi thứ đều ổn ở đây, Từ trường chứa email ant nó là mát mẻ. Nhưng nếu tôi muốn thêm một số tên trước khi gửi email thì sao? Đặc biệt Unicode một:

In [8]: u.get_full_name() 
Out[8]: u'\u0414\u0438\u043c\u0430 \u0426\u0443\u043a\u0430\u043d\u043e\u0432' 

In [9]: msg = email.MIMEMultipart.MIMEMultipart('alternative') 

In [10]: msg['From'] = "%s <%s>" % (u.get_full_name(), "[email protected]") 

In [11]: msg.as_string() 
Out[11]: 'Content-Type: multipart/alternative;\n boundary="===============5792069034892928634=="\nMIME-Version: 1.0\nFrom: =?utf-8?b?0JTQuNC80LAg0KbRg9C60LDQvdC+0LIgPGVtYWlsQGF0LmNvbT4=?=\n\n--===============5792069034892928634==\n\n--===============5792069034892928634==--' 

Ở đây bạn có thể thấy, rằng tất cả các chuỗi (tên, email) đã được mã hóa trong base64 (và nó thậm chí còn khá logic, làm thế nào MIMEMultipart sẽ biết chuỗi chứa unicode và phi unicode phần).
Vì vậy, câu hỏi của tôi là: làm thế nào để tôi phải nói với mô-đun email để làm cho tôi khá "Từ" tiêu đề như:
From: =?UTF-8?B?0JLQmtC+0L3RgtCw0LrRgtC1?= <[email protected]> ?

Ngoài ra, tôi đã học được một chút RFC2822 (http: //www.faqs .org/rfcs/rfc2822.html, tr.3.6.2). Nó cho biết:

Trường gốc cho biết (các) hộp thư của nguồn của thông báo . Trường "Từ:" chỉ định (các) tác giả của thư, tức là, (các) hộp thư của (những) người hoặc (các) hệ thống chịu trách nhiệm để viết thư. Trường "Người gửi:" chỉ định hộp thư của tác nhân chịu trách nhiệm về việc truyền thực tế thông báo . Ví dụ: nếu thư ký gửi thư cho một người khác, hộp thư của thư ký sẽ xuất hiện trong trường "Người gửi:" và hộp thư của tác giả thực sự sẽ xuất hiện trong trường "Từ:" . Nếu người khởi tạo của thư có thể được chỉ định bởi một hộp thư và tác giả và máy phát giống hệt nhau, trường "Người gửi:" KHÔNG được sử dụng. Nếu không, cả hai trường NÊN sẽ xuất hiện.

Có nghĩa là tôi nên kết hợp hai tiêu đề này không? (Từ và người gửi). Tôi là một chút bối rối, bởi vì tôi nhận thấy rất nhiều email trong gmail của tôi (xem qua "Hiển thị bản gốc"), nơi trong Tên trường và email được trình bày.

Cảm ơn bạn đã trợ giúp.

Trả lời

32

Bạn cần để mã hóa phần tên riêng bằng email.header.Header:

from email.MIMEMultipart import MIMEMultipart 
from email.header import Header 
from email.utils import formataddr 

author = formataddr((str(Header(u'Alał', 'utf-8')), "[email protected]")) 
msg = MIMEMultipart('alternative') 
msg['From'] = author 
print msg 

Tôi hy vọng điều này sẽ giúp.

+0

TUYỆT VỜI! Đây chính xác là những gì tôi cần, cảm ơn! –

+0

Tôi đã cố gắng tìm ra nó trong vài giờ! Cảm ơn! – Ofir

+0

cảm ơn, đối với những người khó hiểu về dấu ngoặc đơn thứ hai của formataddr, nó đại diện cho tuple. – iownthegame

Các vấn đề liên quan