smtplib y gmail – problemas con el script de Python

Aquí está mi guión:

#!/usr/bin/python import smtplib msg = 'Hello world.' server = smtplib.SMTP('smtp.gmail.com',587) #port 465 or 587 server.ehlo() server.starttls() server.ehlo() server.login('myname@gmail.com','mypass') server.sendmail('myname@gmail.com','somename@somewhere.com',msg) server.close() 

Solo estoy intentando enviar un correo electrónico desde mi cuenta de gmail. La secuencia de comandos utiliza starttls debido a los requisitos de gmail. He intentado esto en dos servidores web, 1 y 1 y webfaction. 1and1 me da un error de ‘conexión rechazada’ y webfaction no informa de ningún error pero simplemente no envía el correo electrónico. No puedo ver nada malo con el script, por lo que creo que podría estar relacionado con los servidores web. Cualquier pensamiento y comentario sería muy apreciado.

EDITAR: Activé el modo de depuración. Desde la salida, parece que envió el mensaje correctamente … Simplemente nunca lo recibí.

 send: 'ehlo web65.webfaction.com\r\n' reply: '250-mx.google.com at your service, [174.133.21.84]\r\n' reply: '250-SIZE 35651584\r\n' reply: '250-8BITMIME\r\n' reply: '250-STARTTLS\r\n' reply: '250-ENHANCEDSTATUSCODES\r\n' reply: '250 PIPELINING\r\n' reply: retcode (250); Msg: mx.google.com at your service, [174.133.21.84] SIZE 35651584 8BITMIME STARTTLS ENHANCEDSTATUSCODES PIPELINING send: 'STARTTLS\r\n' reply: '220 2.0.0 Ready to start TLS\r\n' reply: retcode (220); Msg: 2.0.0 Ready to start TLS send: 'ehlo web65.webfaction.com\r\n' reply: '250-mx.google.com at your service, [174.133.21.84]\r\n' reply: '250-SIZE 35651584\r\n' reply: '250-8BITMIME\r\n' reply: '250-AUTH LOGIN PLAIN\r\n' reply: '250-ENHANCEDSTATUSCODES\r\n' reply: '250 PIPELINING\r\n' reply: retcode (250); Msg: mx.google.com at your service, [174.133.21.84] SIZE 35651584 8BITMIME AUTH LOGIN PLAIN ENHANCEDSTATUSCODES PIPELINING send: 'AUTH PLAIN *****\r\n' reply: '235 2.7.0 Accepted\r\n' reply: retcode (235); Msg: 2.7.0 Accepted send: 'mail FROM: size=12\r\n' reply: '250 2.1.0 OK 4sm652580yxq.48\r\n' reply: retcode (250); Msg: 2.1.0 OK 4sm652580yxq.48 send: 'rcpt TO:\r\n' reply: '250 2.1.5 OK 4sm652580yxq.48\r\n' reply: retcode (250); Msg: 2.1.5 OK 4sm652580yxq.48 send: 'data\r\n' reply: '354 Go ahead 4sm652580yxq.48\r\n' reply: retcode (354); Msg: Go ahead 4sm652580yxq.48 data: (354, 'Go ahead 4sm652580yxq.48') send: 'Hello world.\r\n.\r\n' reply: '250 2.0.0 OK 1240421143 4sm652580yxq.48\r\n' reply: retcode (250); Msg: 2.0.0 OK 1240421143 4sm652580yxq.48 data: (250, '2.0.0 OK 1240421143 4sm652580yxq.48') 

Creo que el servidor GMail SMTP realiza una búsqueda DNS inversa en la dirección IP desde la que se conecta, y rechaza la conexión si no se puede encontrar un dominio. Esto es para evitar que el spammer use su servidor SMTP como un relé abierto.

¿Has intentado construir un mensaje válido?

 from email.MIMEText import MIMEText msg = MIMEText('body') msg['Subject'] = 'subject' msg['From'] = "..." msg['Reply-to'] = "..." msg['To'] = "..." 

No sé si a OP todavía le importa esta respuesta, pero al encontrarme aquí en un esfuerzo por solucionar un problema similar, es de esperar que alguien más pueda encontrarlo útil. Como resultado, Google ha cambiado la forma en que permiten que se use su servidor SMTP. Usted querrá revisar un par de cosas:

  1. Que está utilizando la misma dirección que usó para autenticarse como la dirección ‘desde’. Si no me equivoco, solía ser el caso de que pudieras poner prácticamente lo que quisieras en el campo desde, pero por motivos de seguridad, muchos sitios de host SMTP (incluido Google) ahora lo restringen a la dirección que se ha autenticado con ellos.

  2. Permita que se pueda acceder a su cuenta con ‘aplicaciones menos seguras’ (lea: aplicaciones de las que no generamos ingresos). Para hacerlo, inicie sesión en su cuenta y navegue aquí: https://www.google.com/settings/security/lesssecureapps

  3. Utilice el puerto 587 con tls. No estoy muy seguro de por qué, pero nunca pude obtener el puerto 465 para jugar bien.

Espero que esto ayude a alguien más.

Algo de autopromoción aquí, pero me siento en un terreno válido.

Literalmente, solo necesitarías este código para hacer exactamente lo que escribiste:

 import yagmail yag = yagmail.SMTP('myname@gmail.com') yag.send('somename@somewhere.com', subject = None, contents = 'Hello') 

O un trazador de líneas:

 yagmail.SMTP('myname@gmail.com').send('somename@somewhere.com', None, 'Hello world.') 

Lo que es bueno es que me propongo usar el anillo de claves para almacenar su contraseña, para que nunca corra el riesgo de que la gente vea su contraseña en su script.

Puede configurarlo ejecutando una vez en su intérprete:

 import yagmail yagmail.register("my@gmail.com", "mypassword") 

y salir. Entonces puedes usar:

 import yagmail yagmail.SMTP("my@gmail.com") # without password 

Si agrega .yagmail con “mi@gmail.com” en el directorio de su casa, puede simplemente hacer: yagmail.SMTP() , pero eso ya no tiene sentido.

Advertencia: si se toma en serio el envío de muchos mensajes, configure mejor OAuth2, yagmail puede ayudarlo.

 yagmail.SMTP("my@gmail.com", oauth2_file="/path/to/save/creds.json") 

La primera vez que se ejecutó, lo guiará en el proceso de obtención de las credenciales de OAuth2 y las almacenará en el archivo para que la próxima vez no tenga que hacer nada con él. ¿Sospechas que alguien encontró tus credenciales? Tendrán permisos limitados, pero es mejor que invalides sus credenciales a través de gmail.

Para el paquete / instalación, consulte git o readthedocs , disponibles para Python 2 y 3.

Sálvense algunos dolores de cabeza y usen esto:

http://mynthon.net/howto/-/python/python%20-%20logging.SMTPHandler-how-to-use-gmail-smtp-server.txt

Python SMTPHandler con GMail

Ss

Deberá revisar su carpeta de “Enviados” en Gmail, ya que es donde probablemente aparezca un mensaje enviado desde su cuenta a su cuenta.

Fui al enlace mencionado anteriormente y tenía 3 direcciones diferentes para enviar, pero recibí tres correos electrónicos a la misma dirección y esa es la dirección # 3.

http://mynthon.net/howto/-/python/python%20-%20logging.SMTPHandler-how-to-use-gmail-smtp-server.txt

 import logging import logging.handlers class TlsSMTPHandler(logging.handlers.SMTPHandler): def emit(self, record): """ Emit a record. Format the record and send it to the specified addressees. """ try: import smtplib import string # for tls add this line try: from email.utils import formatdate except ImportError: formatdate = self.date_time port = self.mailport if not port: port = smtplib.SMTP_PORT smtp = smtplib.SMTP(self.mailhost, port) msg = self.format(record) msg = "From: %s\r\nTo: %s\r\nSubject: %s\r\nDate: %s\r\n\r\n%s" % ( self.fromaddr, string.join(self.toaddrs, ","), self.getSubject(record), formatdate(), msg) if self.username: smtp.ehlo() # for tls add this line smtp.starttls() # for tls add this line smtp.ehlo() # for tls add this line smtp.login(self.username, self.password) smtp.sendmail(self.fromaddr, self.toaddrs, msg) smtp.quit() except (KeyboardInterrupt, SystemExit): raise except: self.handleError(record) logger = logging.getLogger() gm = TlsSMTPHandler(("smtp.gmail.com", 587), 'myusername@gmail.com', ['address1@gmail.com', 'address2@gmail.com', 'address3@gmail.com'], 'unable to find Error!', ('myusername@gmail.com', 'mypassword')) gm.setLevel(logging.ERROR) logger.addHandler(gm) try: 1/0 except: logger.exception('It NO work for me!!-') 

Funciona

 ''' Created on 2017/11/27 @author: devuser ''' import smtplib from email.mime.text import MIMEText from email.utils import formatdate FROM_ADDRESS = 'sender@gmail.com' MY_PASSWORD = 'password' TO_ADDRESS = 'receiver@test.co.jp' BCC = 'receiver2@test.net' SUBJECT = 'GmailのSMTPサーバ経由' BODY = 'pythonでメール送信' def create_message(from_addr, to_addr, bcc_addrs, subject, body): msg = MIMEText(body) msg['Subject'] = subject msg['From'] = from_addr msg['To'] = to_addr msg['Bcc'] = bcc_addrs msg['Date'] = formatdate() return msg def send(from_addr, to_addrs, msg): smtpobj = smtplib.SMTP('smtp.gmail.com', 587) smtpobj.ehlo() smtpobj.starttls() smtpobj.ehlo() smtpobj.login(FROM_ADDRESS, MY_PASSWORD) smtpobj.sendmail(from_addr, to_addrs, msg.as_string()) smtpobj.close() if __name__ == '__main__': to_addr = TO_ADDRESS subject = SUBJECT body = BODY msg = create_message(FROM_ADDRESS, to_addr, BCC, subject, body) send(FROM_ADDRESS, to_addr, msg) 

https://qiita.com/okhrn/items/630a87ce1a44778bbeb1