2011-05-06 11 views
29

utf8 e-posta nasıl gönderilir?Python - utf-8 e-posta nasıl gönderilir?

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

Çıktı

> 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

Biz eksik olan satır numaraları yüzden hatanın tam bir çizgi bulabilirsiniz. – orlp

+0

Hata, muhtemelen message.as_string() 'dosyasındadır. Daha fazla bilgi vermeniz gerekiyor veya size yardımcı olamayacağız. – blubb

+0

tam tracebacks –

cevap

63

Sadece kendi MIMEText aramaları (varsayılan olarak 'us-ascii' varsayar) için 'utf-8' argüman eklemek gerekir. Örneğin

:

# -*- 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

bu eski sonrası olduğu için üzgünüm lütfen ve ben altına yeni bir soru yazmak ama ... u u3093 \ 3035 \' gibi şeyler yazmak için bir insanı mı gerekiyordu zorunda ????? Japonca bir kelimeniz var mı? Bu kodlar nasıl ortaya çıkıyor? i Her zaman bu numaraları görmek okudum öğreticiler den (anlıyorum ederken mektupları kodlardır, değil; bile girdi bu kodu veya benzer olanlar için yapılır nasıl olsun ...) – hephestos

+2

Bu kodlar sadece açıklama için buradayız amaçlar. Python kaynak giriş kodlamanızı utf-8 olarak ayarlayabilir ve Unicode sabitlerini doğrudan yazabilirsiniz. Bazı karakter için bu '\ u ...' kodları almak gerekiyorsa, sadece baskı repr '' gibi (u 'テ ス ト メ ー ル') '' – abbot

+1

İlk hızlı cevap için teşekkür ederim ... Kontrol Bu şeyler yapabiliriz (Bu soruyla bu sorunu anlamak için) Bu testi yaptım: Bir utf-8 kelimesini (Yunan harflerini) bir değişkene koydum ve bir sözlükte saklıyorum ΤΕΣΤ '= X. Listeyi yazdırırken "Hemen pencerede", bazı u '' kodlarını bana bildiriyor! (mysql'den ΤΕΣΤ aldım). Sonra Tamam listOfutfs [ 'ΤΕΣΤ'] olarak bana geri değer vermek demek, bana KeyError yanıt verir: '\ çıkışlardaki \ XA6 \ çıkışlardaki \ XA1 \ çıkışlardaki \ X9b \ çıkışlardaki \ X9a' !!!!!!!!! !!!!!!! – hephestos