2011-08-02 20 views
14

Tôi đang sử dụng Python mô-đun MimeWriter để xây dựng một thông điệp và smtplib để gửi một tin nhắn qua thư xây dựng là:Encoding email chủ đề (SMTP) trong Python với các ký tự ASCII

file msg.txt: 
----------------------- 
Content-Type: multipart/mixed; 
from: me<[email protected]> 
to: [email protected] 
subject: 主題 

Content-Type: text/plain;charset=utf-8 

主題 

tôi sử dụng mã dưới đây để gửi một mail:

import smtplib 
s=smtplib.SMTP('smtp.abc.com') 
toList = ['[email protected]'] 
f=open('msg.txt') #above msg in msg.txt file 
msg=f.read() 
f.close() 
s.sendmail('[email protected]',toList,msg) 

tôi nhận được cơ thể email một cách chính xác nhưng vấn đề là không thích hợp,

subject: some junk characters 

主題   <- body is correct. 

hãy s uggest? Có cách nào để chỉ định cách giải mã cũng được sử dụng cho chủ thể, như được chỉ định cho phần thân. Làm cách nào để tôi có thể giải mã chủ đề một cách chính xác?

+1

oh charaters Trung Quốc bị cắt xén ở đây sau khi đăng câu hỏi – Rakesh

+0

liên quan: [Làm thế nào tôi có thể gửi email bằng cách sử dụng Python?] (http://stackoverflow.com/q/9272257/4279) – jfs

Trả lời

23

Từ http://docs.python.org/library/email.header.html

from email.message import Message 
from email.header import Header 
msg = Message() 
msg['Subject'] = Header('主題', 'utf-8') 
print msg.as_string() 

Subject: = utf-8 b 5Li76aGM =

hơn đơn giản:???????

from email.header import Header 
print Header('主題', 'utf-8').encode() 

= utf-8 b 5Li76aGM =

+1

Đây phải là câu trả lời được chấp nhận. –

6

Chủ đề được truyền dưới dạng tiêu đề SMTP và chúng bắt buộc phải là ASCII. Để hỗ trợ mã hóa trong đối tượng, bạn cần thêm tiền tố chủ đề với bất kỳ mã hóa nào bạn muốn sử dụng. Trong trường hợp của bạn, tôi sẽ đề xuất tiền tố chủ đề với? UTF-8? B? có nghĩa là UTF-8, Base64 được mã hóa.

Nói cách khác, tôi tin rằng tiêu đề chủ đề của bạn nên ít nhiều cái nhìn như thế này:

Subject: =?UTF-8?B?JiMyMDAyNzsmIzM4OTg4Ow=?= 

Trong PHP bạn có thể đi về nó như thế này:

// Convert subject to base64 
$subject_base64 = base64_encode($subject); 
fwrite($smtp, "Subject: =?UTF-8?B?{$subject_base64}?=\r\n"); 

Trong Python:

import base64 
subject_base64 = base64.encodestring(subject).strip() 
subject_line = "Subject: =?UTF-8?B?%s?=" % subject_base64 
+1

tôi sẽ cố gắng này, chờ đợi là có bất kỳ api python để chuyển đổi sang định dạng trên. nghĩa là tự động nối thêm các ký tự dựa trên mã hóa bắt buộc – Rakesh

+1

Tôi không chắc chắn - tôi chỉ nhớ phần đó từ khi tôi đang rối tung xung quanh vấn đề này một thời gian trước đây. [Câu trả lời này] (http://stackoverflow.com/questions/5910104/python-how-to-send-utf-8-e-mail#answer-5910530) dường như gợi ý rằng nó được thực hiện ngay nếu bạn sử dụng MIMEMultipart lớp thay vì MimeWriter. – AHM

+2

bạn nên tra cứu ở đây [cách tạo tiêu đề được quốc tế hóa] (http://docs.python.org/library/email.header.html) – mata

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