Como añadir imagen a correo enviado desde python

publicado por: Anonymous

Estoy intentando añadir una imagen al final de un correo enviado desde python pero me esta dando error. Hasta el mensaje lo enviaba usando html e incluso podia añadir links sin ningun problema.

message = "<br>Hola %s,<br><br> Se ha detectado una alerta de seguridad <br><br> Si este cambio ha sido voluntario, por favor, ignore este mensaje. De lo contrario por favor hago acceda al siguiente link para localizar su SIM y desactivarla: <br><br> <center><a href='https://ponteaprueba.com/response'> Localizar y desactivar SIM </a><br><br></center>    Muchas gracias,<br><br>    Equipo de Soporte ponteaprueba<br> <img src ="http://cdn.revistagq.com/uploads/images/thumbs/es/gq/3/s/2016/13/tipologias_foto_whastapp_606053640_511x384.jpg" alt="firma">" % (customer, iccid)
mime_message = MIMEText(message, "html", _charset = "uft-8")
mime_message["From"] = "[email protected]"
mime_message["To"] = recipient
mime_message["Subject"] = "Alert"
#We try to make the conection with the SMTP server
smtp = SMTP('smtp.gmail.com', 587)
smtp.ehlo()
smtp.starttls()
smtp.ehlo()
print "Conexion exitosa con Gmail"
print "Concectado a Gmail"
#We introduce the credentials of the sender in the SMTP server and send the email.
smtp.login(username, pass)
smtp.sendmail(username,recipient,mime_message.as_string())
smtp.quit()
return "Mensaje enviado"

¿Puede ser porque es una imagen de internet? ¿Existe alguna forma de coger una imagen igual que haces con un link?

Gracias

solución

El problema está en que la cadena mensaje está mal construida. Usas el mismo tipo de comillas que usas para delimitar la cadena, como caractéres dentro de ella, sin escapar estos caractéres adecuadamente. Esto rompe tu cadena. Por ejemplo:

>>> cadena = "Dime "hola"" 

Dará un error de sintaxis:

SyntaxError: invalid syntax

En Python puedes crear una cadena usando comillas simples ('cadena'), dobles ("cadena") o triples ('''cadena'''). Si necesitas usar las comillas como un carácter cualquiera dentro de tu cadena, tienes dos opciones:

  • Usar una secuecia de escape:

    cadena = "Dime "hola""
    
  • Usar un tipo de comillas como delimitador y otro como carácter interno:

    cadena = 'Dime "hola"'
    cadena = '''Dime "hola"'''
    cadena = "Dime 'hola'"
    

En tu caso lo más simple (menos cambios requiere) es usar comillas simples para delimitar la cadena y dobles dentro de ella.

Por otro lado usas dos parámetros para formatear la cadena customery iccid pero solo usas uno en la cadena, esto dará también error:

TypeError: not all arguments converted during string formatting

Si uno no hace falta, quítalo. Si hacen falta los dos, añade el %s correspondiente en el lugar que toque.

Para terminar, el uso de % para formatear cadenas es válido pero considera algo “anticuado” en favor del método str.format o incluso de los literales de cadena formateados (Python 3.6) que son más trasparentes y más flexibles (permitiendo por ejemplo tabular datos fácilmente):

nombre = 'Juan'
edad = 24

# Usando % como en c

cad1 = 'Hola me llamo %s y tengo %i años.' % (nombre, edad))

# Usando el método str.format
cad2 = 'Hola me llamo {} y tengo {} años.'.format(nombre, edad))

# Usando literales de cadena formateados (Python >= 3.6):
cad3 = f'Hola me llamo {nombre} y tengo {edad} años.'

print(cad1, cad2, cad3, sep='n')

Salida:

Hola me llamo Juan y tengo 24 años.
Hola me llamo Juan y tengo 24 años.
Hola me llamo Juan y tengo 24 años.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *