2011-05-06 17 views
29

cómo enviar correos electrónicos utf8 por favor?Python - ¿Cómo enviar un correo electrónico a 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("su[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)) 

salida

> 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

nos falta para que podamos localizar la línea exacta del error. – orlp

+0

El error probablemente esté en 'message.as_string()'. Debe proporcionar más, o no podremos ayudarlo. – blubb

+0

rastreos completos complacer –

Respuesta

63

Usted sólo debe añadir 'utf-8' argumento para sus MIMEText llamadas (se supone 'us-ascii' por defecto).

Por ejemplo:

números de línea
# -*- 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

Lo siento por ser este viejo post y escribir una nueva pregunta debajo, pero tengo que ... se supone que un ser humano para escribir cosas como 'u \ 3035 \ u3093 ????? tienes alguna palabra japonesa, ¿verdad? ¿cómo se te ocurren estos códigos? de los tutoriales que he leído siempre que veo estos números (si bien entiendo son los códigos de letras, Me Don; t consigue cómo la entrada se realiza a este código o similares ...) – hephestos

+2

Estos códigos están aquí sólo para ilustración propósitos. Puede establecer la codificación de entrada de origen python en utf-8 y escribir constantes Unicode directamente. Si usted necesita para obtener esos '\ u ...' códigos para algunos caracteres, sólo puede hacer algo como '' repr impresión (u 'テ ス ト メ ー ル') '' – abbot

+1

En primer lugar gracias por la respuesta rápida ... Marque esta (para entender mi problema con esta pregunta) Hice esta prueba: puse una palabra utf-8 (letras griegas) en una variable y la guardé en un diccionario 'ΤΕΣΤ' = X. En la "ventana Inmediata" cuando imprimo listOfutfs, ¡me informa algunos códigos! (desde mysql me habían ΤΕΣΤ recuperado). Entonces me digo ok me dé el valor de nuevo como listOfutfs [ 'ΤΕΣΤ'], que responde a mí KeyError: '\ Xce \ xa6 \ Xce \ xa1 \ Xce \ X9b \ Xce \ X9a' !!!!!!!!! !!!!!!! – hephestos

Cuestiones relacionadas