문제

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top