with sending from python smtp gmail smtplib

with - sending gmail from python



smtplib y gmail-problemas con el script de Python (8)

¿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''] = "..."

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(''[email protected]'',''mypass'') server.sendmail(''[email protected]'',''[email protected]'',msg) server.close()

Solo intento 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, así 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:<[email protected]> 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:<[email protected]>/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'')


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(''[email protected]'') yag.send(''[email protected]'', subject = None, contents = ''Hello'')

O un trazador de líneas:

yagmail.SMTP(''[email protected]'').send(''[email protected]'', 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("[email protected]", "mypassword")

y salir. Entonces puedes usar:

import yagmail yagmail.SMTP("[email protected]") # without password

Si agrega .yagmail con "[email protected]" en su directorio de inicio, entonces 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 ayudar con eso.

yagmail.SMTP("[email protected]", 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 será mejor que invaliden sus credenciales a través de gmail.

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


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.


Deberá revisar su carpeta "Enviado" 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 a las que 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), ''[email protected]'', [''[email protected]'', ''[email protected]'', ''[email protected]''], ''unable to find Error!'', (''[email protected]'', ''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 = ''[email protected]'' MY_PASSWORD = ''password'' TO_ADDRESS = ''[email protected]'' BCC = ''[email protected]'' 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


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 lo encuentre ú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 todo lo que quisieras en el campo desde, pero por motivos de seguridad, muchos sitios de host SMTP (incluido Google) ahora restringen esto 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 realmente seguro de por qué, pero nunca pude obtener el puerto 465 para jugar bien.

Espero que esto ayude a alguien más.