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)
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:
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.
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
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.
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
http://mynthon.net/howto/-/python/python%20-%20logging.SMTPHandler-how-to-use-gmail-smtp-server.txt
Ss