2011-05-06 3 views
29

어떻게 utf8 이메일을 보내주십시오?Python - utf-8 전자 메일을 보내는 방법?

import sys 
import smtplib 
import email 
import re 

from email.mime.multipart import MIMEMultipart 
from email.mime.text import MIMEText 

def sendmail(firm, fromEmail, to, template, subject, date): 
    with open(template, encoding="utf-8") as template_file: 
     message = template_file.read() 

    message = re.sub(r"{{\s*firm\s*}}", firm, message) 
    message = re.sub(r"{{\s*date\s*}}", date, message) 
    message = re.sub(r"{{\s*from\s*}}", fromEmail, message) 
    message = re.sub(r"{{\s*to\s*}}", to, message) 
    message = re.sub(r"{{\s*subject\s*}}", subject, message) 

    msg = MIMEMultipart("alternative") 
    msg.set_charset("utf-8") 

    msg["Subject"] = subject 
    msg["From"] = fromEmail 
    msg["To"] = to 

    #Read from template 
    html = message[message.find("html:") + len("html:"):message.find("text:")].strip() 
    text = message[message.find("text:") + len("text:"):].strip() 

    part1 = MIMEText(html, "html") 
    part2 = MIMEText(text, "plain") 

    msg.attach(part1)  
    msg.attach(part2) 

    try: 
     server = smtplib.SMTP("10.0.0.5") 
     server.sendmail(fromEmail, [to], msg.as_string()) 
     return 0 
    except Exception as ex: 
     #log error 
     #return -1 
     #debug 
     raise ex 
    finally: 
     server.quit() 

if __name__ == "__main__": 
    #debug 
    sys.argv.append("Moje") 
    sys.argv.append("[email protected]") 
    sys.argv.append("[email protected]") 
    sys.argv.append("may2011.template") 
    sys.argv.append("This is subject") 
    sys.argv.append("This is date") 


    if len(sys.argv) != 7: 
     exit(-2) 

    firm = sys.argv[1] 
    fromEmail = sys.argv[2] 
    to = sys.argv[3] 
    template = sys.argv[4] 
    subject = sys.argv[5] 
    date = sys.argv[6] 

    exit(sendmail(firm, fromEmail, to, template, subject, date)) 

출력

> Traceback (most recent call last): 
> File "C:\Documents and Settings\Administrator\Plocha\Newsletter-build-desktop\sendmail.py", 
> line 69, in <module> 
>  exit(sendmail(firm, fromEmail, to, template, subject, date)) 
> 
> File "C:\Documents and Settings\Administrator\Plocha\Newsletter-build-desktop\sendmail.py", 
> line 45, in sendmail 
>  raise ex 
> 
> File "C:\Documents and Settings\Administrator\Plocha\Newsletter-build-desktop\sendmail.py", 
> line 39, in sendmail 
>  server.sendmail(fromEmail, [to], msg.as_string()) 
> 
> File "C:\Python32\lib\smtplib.py", 
> line 716, in sendmail 
>  msg = _fix_eols(msg).encode('ascii') UnicodeEncodeError: 'ascii' codec 
> 
> can't encode character '\u011b' in 
> position 385: ordinal not in 
> range(128) 
+1

우리가 누락 된 줄 번호는 그래서 우리는 오류의 정확한 라인을 찾을 수 있습니다. – orlp

+0

오류는 아마도'message.as_string()'에있을 것입니다. 더 많이 제공해야합니다. 그렇지 않으면 도움을 드릴 수 없습니다. – blubb

+0

완전한 추적을 부탁합니다 –

답변

63

당신은 당신의 MIMEText 전화 (이것은 기본적으로 'us-ascii' 가정)에 'utf-8' 인수를 추가해야합니다. 예를 들어

:

# -*- encoding: utf-8 -*- 

from email.mime.multipart import MIMEMultipart 
from email.mime.text import MIMEText 

msg = MIMEMultipart("alternative") 
msg["Subject"] = u'テストメール' 
part1 = MIMEText(u'\u3053\u3093\u306b\u3061\u306f\u3001\u4e16\u754c\uff01\n', 
       "plain", "utf-8") 
msg.attach(part1) 

print msg.as_string().encode('ascii') 
+0

이 오래된 게시물 인 것에 대해 미안합니다. 아래에 새로운 질문을 씁니다.하지만 저는 ... 인간은 '\ 3035 \ u3093 ????? 일본 단어가 맞습니까? 이 코드들에 대해 어떻게 생각하세요? 튜토리얼에서 읽은 적이 있는데 항상이 숫자를 봅니다. (글자의 코드는 이해하지만 나는이 코드 나 비슷한 코드를 입력하는 방법을 얻지 않습니다 ...) – hephestos

+2

이 코드는 그림보기 용입니다 목적. 파이썬 소스 입력 인코딩을 utf-8로 설정하고 유니 코드 상수를 직접 입력 할 수 있습니다. '\ u ... '코드를 일부 문자로 가져와야하는 경우''print repr (u'テ ス ト メ ー ル ')'' – abbot

+1

과 같이 할 수 있습니다. 빠른 응답 주셔서 감사합니다 ... 이것을 확인하십시오 (이 문제에 대한 나의 문제점을 이해하기 위해) 나는이 테스트를 수행했다 : utf-8 단어 (그리스 문자)를 변수에 넣고 사전 'ΤΕΣΤ'= X에 저장했다. "직접 실행 창"에서 인쇄 할 때 listOfutfs가 나에게 몇 가지 코드를 알려줍니다! (mysql에서 나는 ΤΕΣΤ을 검색했다). 그럼 내가 다시 말해서 값을 listOfutfs [ 'ΤΕΣΤ']로 돌려 주면 KeyError : '\ xce \ xa6 \ xce \ xa1 \ xce \ x9b \ xce \ x9a'!!!!!!!!! !!!!!!! – hephestos

관련 문제