2014-11-18 31 views
5

Tôi đang làm việc để thiết lập tập lệnh chuyển tiếp thư đến tới danh sách người nhận.Mã hóa nội dung email Python 3

Dưới đây là những gì tôi có bây giờ:

tôi đọc email từ stdin (đó là cách postfix qua nó):

email_in = sys.stdin.read() 

incoming = Parser().parse(email_in) 

sender = incoming['from'] 
this_address = incoming['to'] 

tôi thử nghiệm cho nhiều phần dữ liệu:

if incoming.is_multipart(): 
    for payload in incoming.get_payload(): 
     # if payload.is_multipart(): ... 
     body = payload.get_payload() 
else: 
    body = incoming.get_payload(decode=True)` 

tôi thiết lập thông báo gửi đi:

msg = MIMEMultipart() 
msg['Subject'] = incoming['subject'] 
msg['From'] = this_address 
msg['reply-to'] = sender 
msg['To'] = "[email protected]" 
msg.attach(MIMEText(body.encode('utf-8'), 'html', _charset='UTF-8')) 

s = smtplib.SMTP('localhost') 
s.send_message(msg) 
s.quit() 

Điều này hoạt động khá tốt với các ký tự ASCII (văn bản tiếng Anh), chuyển tiếp nó và tất cả.

Khi tôi gửi các ký tự không ascii tuy nhiên, nó mang lại cho trở lại vô nghia (tùy thuộc vào byte ứng dụng email hoặc cơ quan đại diện ascii của utf-8 ký tự)

gì có thể là vấn đề? Nó ở bên vào hay bên đi?

+0

Bạn không cần phải mã hóa tải trọng cho phần 'MIMEText'; nó sẽ mã hóa cho bạn, hãy chọn một ký tự phù hợp. Không phải là điều này thay đổi đầu ra. –

Trả lời

3

Vấn đề là nhiều ứng dụng email (kể cả Gmail) gửi email không phải ascii trong base64. Mặt khác, stdin chuyển mọi thứ vào một chuỗi. Nếu bạn phân tích cú pháp đó với Parser.parse(), nó sẽ trả về một loại chuỗi với base64 bên trong.

Thay vào đó, đối số decode tùy chọn sẽ được sử dụng theo phương pháp get_payload(). Khi được thiết lập, phương thức trả về một kiểu byte. Sau đó bạn có thể sử dụng được xây dựng trong decode() phương pháp để có được utf-8 chuỗi như vậy:

body = payload.get_payload(decode=True) 
body = body.decode('utf-8') 

Có cái nhìn sâu sắc tuyệt vời vào utf-8 và trăn trong Ned Batchelder's talk.

mã cuối cùng tôi làm việc khác một chút, bạn cũng có thể kiểm tra điều đó, quá here.

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