2011-11-17 1 views
13

을 보내는 이메일을 보내는 내 코드의 일부이다. 나는 특수 문자 (예를 들어, "ação")는이 오류가 발생하여 문자열을 보내려고하면 :MimeText는 UTF-8 인코딩 문제 다음은 이메일

UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-2: ordinal not in range(128) 
내가 MimeText는의 제목에 특수 문자와 이메일을 보낼 수있는 방법

?

답변

29

은 python3에서하는 Header 객체가 "UTF-8"로 Subject을 인코딩하는 데 필요한 것으로 보인다

>>> 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' 

그래서 원래 스크립트가 될 것입니다 :

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

그것은했다! 나는 거의 포기하고 있었다. 나는이 질문을하기 전에 Header 옵션에 대해 뭔가를 발견했다. 그러나 내가 시도한 방식은 효과가 없었지만 지금은 아름답게 작동한다. 정말 고마워! –

+0

이 솔루션은 완벽하게 작동합니다. – alfredocambera

+1

문서에 따르면 MIMEText 호출시'.encode ('utf-8')'은 불필요합니다. utf-8 인코딩을 지정하면 유니 코드를 자동으로 인코딩합니다. "... _text가 유니 코드이면 _charset의 output_charset을 사용하여 인코딩되고, 그렇지 않으면 그대로 사용됩니다." 시험되고 나를 위해 일하는 것 같습니다. – patricksurry