2009-04-22 18 views
24

Aquí está mi guión:smtplib y Gmail - problemas script Python

#!/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() 

Sólo estoy tratando de enviar un correo electrónico de mi cuenta de Gmail. El script usa starttls debido a los requisitos de gmail. Lo intenté en dos servidores web, 1and1 y webfaction. 1and1 me da un error de "conexión rechazada" y webfaction informa que no hay error, pero simplemente no envía el correo electrónico. No puedo ver nada mal con el script, así que estoy pensando que podría estar relacionado con los servidores web. Cualquier pensamiento y comentario sería muy apreciado.

EDITAR: He activado el modo de depuración. Desde la salida, parece que envió el mensaje con éxito ... Yo simplemente nunca lo recibo.

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') 
+2

puede enviar el correo a través de su servidor SMTP normal, en lugar de llamar directamente a Gmail. – gimel

+1

¿Cómo se activa el modo de depuración para obtener esos mensajes de salida? – trusktr

+3

smtplib.set_debuglevel (True) lo ordenará, @trusktr – hd1

Respuesta

7

creo que el servidor SMTP de Gmail hace una búsqueda de DNS reversa en la dirección IP que se conecta desde, y rechaza la conexión si no hay dominio se puede encontrar. Esto es para evitar que el spammer use su servidor SMTP como un retransmisor abierto.

+4

También podría ser su proveedor de acceso a internet que prohíbe las conexiones salientes a servidores smtp que no sean los suyos. –

+1

Creo que es el ISP. Probé el código y funcionó bien para mí. – hwiechers

+35

Si GMail revertió la búsqueda de DNS y rechazó las conexiones, ¿cómo podría usar mi cliente de correo electrónico de escritorio, como thunderbird, para enviar correos a través del smtp de gmail? –

8

¿Ha intentado construir un mensaje válido?

from email.MIMEText import MIMEText 

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

Usted tendrá que comprobar su carpeta "Enviados" en Gmail, ya que es donde un mensaje enviado desde su cuenta a su cuenta es muy probable que aparezca.

0

Fui al enlace mencionado anteriormente y tenía 3 diferentes direcciones para enviar a, pero he recibido tres correos electrónicos a la misma dirección y que es la dirección 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!!-') 
6

No sé si OP todavía se preocupa por esta respuesta, pero después de haber encontré aquí en un esfuerzo para solucionar un problema similar, es de esperar que alguien más podría resultar útil. Como resultado, Google ha cambiado la forma en que permiten que se use su servidor SMTP. Usted tendrá que comprobar un par de cosas:

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

  2. Permita que su cuenta sea accedida por "aplicaciones menos seguras" (léase: aplicaciones de las que no generamos ingresos). Para hacer ese registro en su cuenta y navegar aquí: https://www.google.com/settings/security/lesssecureapps

  3. Utilice el puerto 587 con tls. No estoy seguro de por qué, pero nunca podría tener el puerto 465 para jugar bien.

Espero que esto ayude a alguien más.

+0

Respuesta, ¿dónde has estado? –

5

Algunos auto-promoción aquí, pero me siento en un terreno válido.

Literalmente, sólo se necesita el código para hacer exactamente lo que escribió:

import yagmail 
yag = yagmail.SMTP('[email protected]') 
yag.send('[email protected]', subject = None, contents = 'Hello') 

O un chiste:

yagmail.SMTP('[email protected]').send('[email protected]', None, 'Hello world.') 

Lo bueno es que propongo que se utiliza el llavero para almacenar su contraseña, por lo que nunca correrá el riesgo de que las personas vean su contraseña en su secuencia de comandos.

Para el paquete/instalación Por favor, mire git o pip, disponible tanto para Python 2 y 3.

+0

Gracias por el voto popular, ¡realmente estoy tratando de llamar más la atención sobre el paquete! – PascalVKooten

+1

'SMTPAuthenticationError: inicie sesión en su navegador web y \ n5.7.14 y vuelva a intentarlo. \ N5.7.14 Obtenga más información en \ n5.7.14 https://support.google.com/mail/answer/78754 vl1sm48001045pbc.31 - gsmtp ') ' –

+0

@ Death-Stalker Parece que cometió un error al escribir su contraseña? – PascalVKooten

Cuestiones relacionadas