Python 3 smtplib는 유니코드 문자로 전송합니다.
-
07-07-2019 - |
문제
Python 3에서 smtplib를 사용하여 유니코드 문자를 이메일로 보내는 데 문제가 있습니다.3.1.1에서는 실패하지만 2.5.4에서는 작동합니다.
import smtplib
from email.mime.text import MIMEText
sender = to = 'ABC@DEF.com'
server = 'smtp.DEF.com'
msg = MIMEText('€10')
msg['Subject'] = 'Hello'
msg['From'] = sender
msg['To'] = to
s = smtplib.SMTP(server)
s.sendmail(sender, [to], msg.as_string())
s.quit()
문서에서 예제를 시도했지만 실패했습니다. http://docs.python.org/3.1/library/email-examples.html, 디렉터리의 내용을 MIME 메시지로 보내기 예제
어떤 제안이 있으십니까?
해결책
열쇠는 문서:
class email.mime.text.MIMEText(_text, _subtype='plain', _charset='us-ascii')
MIMENonMultipart의 서브클래스인 MIMEText 클래스는 MIME을 만드는 데 사용됩니다. 주 형식 text의 개체입니다._text는 페이로드에 대한 문자열입니다._하위 는 부 유형이며 기본값은 평야._charset는 문자 집합입니다. 텍스트의 MIMENonMultipart에 대한 매개 변수 생성자;기본값은 us-ascii입니다.추측이나 인코딩이 수행되지 않습니다. 텍스트 데이터에.
그래서 당신에게 필요한 것은 분명합니다. ~ 아니다 msg = MIMEText('€10')
, 오히려 :
msg = MIMEText('€10'.encode('utf-8'), _charset='utf-8')
모든 내용이 명확하게 문서화되어 있지는 않지만, 메일을 보내다 유니코드 문자열이 아닌 바이트 문자열이 필요합니다(이것이 바로 SMTP 프로토콜이 지정하는 것입니다).무엇을 봐 msg.as_string()
두 가지 구축 방법 각각에 대해 다음과 같습니다. "추측이나 인코딩 없음"이 주어지면 귀하의 방식에는 여전히 유로 문자가 있습니다(그리고 sendmail이 이를 바이트 문자열로 변환할 수 있는 방법이 없습니다). utf-8은 전체적으로 명확하게 지정되어 있습니다.
다른 팁
_charset
매개 변수 MIMEText
기본값 us-ascii
에 따르면 문서. 부터 €
US-ASCII 세트에서 나온 것이 아닙니다. 작동하지 않습니다.
명확하게 시도한 문서의 예 :
이 예에서 텍스트 파일에 ASCII 문자 만 포함되어 있다고 가정합니다.
당신은 사용할 수 있습니다 .get_charset
숯을 조사하기위한 메시지의 메소드는 우연히 .set_charset
또한.
거스 뮬러는 비슷한 문제가있었습니다. http://bugs.python.org/issue4403