2011-11-17 36 views
13

Đây là một phần của mã của tôi mà gửi một email:MIMEText UTF-8 mã hóa vấn đề khi gửi email

servidor = smtplib.SMTP() 
servidor.connect(HOST, PORT) 
servidor.login(user, usenha) 
assunto = str(self.lineEdit.text()) 
para = str(globe_email)    
texto = self.textEdit.toPlainText() 
textos = str(texto) 
corpo = MIMEText(textos.encode('utf-8'), _charset='utf-8') 
corpo['From'] = user 
corpo['To'] = para 
corpo['Subject'] = assunto 
servidor.sendmail(user, [para], corpo.as_string()) 

Mọi thứ đều ok trừ một phần của đề. Khi tôi cố gắng để gửi một chuỗi với ký tự đặc biệt (ví dụ "ação") nó làm tăng lỗi này:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-2: ordinal not in range(128) 

Làm thế nào tôi có thể gửi email với các nhân vật đặc biệt trong Chủ đề của MIMEText?

Trả lời

29

Dường như, trong python3, một đối tượng Header là cần thiết để mã hóa một Subject là "utf-8":

>>> from email.mime.text import MIMEText 
>>> from email.header import Header 
>>> s = 'ação' 
>>> m = MIMEText(s.encode('utf-8'), 'plain', 'utf-8') 
>>> m['Subject'] = Header(s, 'utf-8') 
>>> m.as_string() 
'Content-Type: text/plain; charset="utf-8"\nMIME-Version: 1.0\nContent-Transfer-Encoding: base64\nSubject: =?utf-8?b?YcOnw6Nv?=\n\nYcOnw6Nv\n' 

Vì vậy, kịch bản gốc sẽ trở thành:

servidor = smtplib.SMTP() 
servidor.connect(HOST, PORT) 
servidor.login(user, usenha) 
assunto = str(self.lineEdit.text()) 
para = str(globe_email)    
texto = str(self.textEdit.toPlainText()) 
corpo = MIMEText(texto.encode('utf-8'), 'plain', 'utf-8') 
corpo['From'] = user 
corpo['To'] = para 
corpo['Subject'] = Header(assunto, 'utf-8') 
servidor.sendmail(user, [para], corpo.as_string()) 
+1

Nó làm việc! Tôi đã gần như bỏ cuộc ... Tôi đã tìm thấy một cái gì đó về các tùy chọn Header trước khi tôi thực hiện câu hỏi này, nhưng cách tôi đã thử nó đã không làm việc, nhưng bây giờ hoạt động đẹp. Chân thanh cảm ơn bạn! –

+0

Giải pháp này làm việc hoàn hảo hình thành tôi. – alfredocambera

+1

Theo tài liệu, '.encode ('utf-8')' là không cần thiết trong cuộc gọi của bạn tới MIMEText. Miễn là bạn chỉ định mã hóa utf-8, nó sẽ tự động mã hóa unicode: "... Nếu _text là unicode, nó được mã hóa bằng output_charset của _charset, nếu không nó sẽ được sử dụng như là." Thử nghiệm và dường như làm việc cho tôi. – patricksurry

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