Pregunta

Aquí está mi script:

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

Estoy intentando enviar un correo electrónico de mi cuenta de Gmail. La secuencia de comandos utiliza STARTTLS debido a los requerimientos de Gmail. He intentado esto en dos servidores web, 1and1 y webfaction. 1and1 me da una 'conexión rechazada' informes de errores y webfaction ningún error, pero simplemente no envía el correo electrónico. No puedo ver nada malo en el guión, así que estoy pensando que podría estar relacionado con los servidores web. Cualquier pensamientos y comentarios sería muy apreciada.

EDIT: Encendí el modo de depuración. Desde la salida, parece que se ha enviado el mensaje con éxito ... sólo que 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:<myname@gmail.com> 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:<myname@gmail.com>\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')
¿Fue útil?

Solución

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 spammer el uso de su servidor SMTP como una retransmisión abierta.

Otros consejos

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

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 su servidor SMTP que se utilizará. 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 lo que solía ser el caso de que se puede poner más o menos lo que quería en el campo, pero por razones de seguridad muchos sitios host SMTP (como Google) ahora limitar este a la dirección que se ha autenticado con ellos.

  2. Permitir su cuenta para tener acceso a aplicaciones menos seguras '' (es decir: aplicaciones que no generamos ingresos de). Para hacer eso registro en su cuenta y vaya aquí: https://www.google.com/settings/security/lesssecureapps

  3. Utilice el puerto 587 con TLS. En realidad, no sé por qué pero nunca pude conseguir el puerto 465 para jugar bien.

Espero que esto ayude a alguien más ahí fuera.

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

Se podría, literalmente, sólo se necesita el código para hacer exactamente lo que escribió:

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

O un un trazador de líneas:

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

Lo que es interesante es que propongo que se utiliza el llavero para almacenar su contraseña, para que nunca tenga un riesgo de las personas que ven su contraseña en el script.

Puede configurar esto mediante la ejecución de una vez en su intérprete:

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

y salir. A continuación, sólo puede utilizar:

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

Si se agrega .yagmail con "my@gmail.com" en su directorio personal, a continuación, puedes hacer: yagmail.SMTP(), pero eso es bastante inútil por ahora

.

Advertencia: Si usted consigue serio sobre el envío de una gran cantidad de mensajes, mejor configurar OAuth2, yagmail puede ayudar con eso

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

La primera vez que corría, que le guiará a través del proceso de obtención de credenciales OAuth2 y almacenarlos en el archivo para que la próxima vez que usted no tiene que hacer nada con ella. ¿Sospecha que alguien encontró sus credenciales? Ellos tienen permisos limitados, pero que invalidan mejor sus credenciales a través de Gmail.

Para el paquete / instalación por favor vaya a git o readthedocs , disponible tanto para Python 2 y 3.

Se 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.

Fui al enlace mencionado anteriormente y tenía 3 diferentes a las direcciones para enviar a pero recibió tres mensajes de correo electrónico a la misma dirección y que 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!!-')

Es trabajos

'''
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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top