Domanda

Ecco il mio 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()

Sto solo cercando di inviare una e-mail dal mio account Gmail. Lo script utilizza STARTTLS a causa del requisito del gmail. Ho provato questo su due host web, 1and1 e Webfaction. 1and1 mi dà una 'connessione rifiutata' segnalazioni di errori e Webfaction nessun errore, ma semplicemente non invia l'e-mail. Non riesco a vedere niente di sbagliato con lo script, quindi sto pensando che potrebbe essere correlato ai web host. Tutti i pensieri e commenti sarebbe molto apprezzato.

EDIT: ho acceso la modalità di debug. Dalla uscita, sembra che ha inviato il messaggio con successo ... Ho appena mai riceverlo.

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')
È stato utile?

Soluzione

Penso che il server SMTP di Gmail fa una ricerca DNS inversa sull'indirizzo IP che si connette da, e si rifiuta la connessione se nessun dominio può essere trovato. Questo per evitare spammer di utilizzare i propri server SMTP come inoltro aperto.

Altri suggerimenti

Hai provato a costruire un messaggio valido?

from email.MIMEText import MIMEText

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

Non so se OP tiene ancora a questa risposta, ma dopo aver sono trovato qui, nel tentativo di risolvere un problema simile, si spera che qualcun altro potrebbe rivelarsi utile. Come si è visto, Google ha cambiato il modo in cui essi consentono loro server SMTP da utilizzare. Si consiglia di controllare un paio di cose:

  1. che si sta utilizzando lo stesso indirizzo che hai usato per autenticare come l'indirizzo 'da'. Se non mi sbaglio è usato per essere il caso che si potrebbe mettere praticamente tutto quello che si voleva nel campo, ma per motivi di sicurezza molti siti host SMTP (tra cui Google) ora limitare tale all'indirizzo che ha autenticato con loro.

  2. Lasciate che il vostro account per accedere da 'app meno sicure' (leggi: le applicazioni che non generano ricavi da). Per fare questo Accedi al tuo account e vai qui: https://www.google.com/settings/security/lesssecureapps

  3. utilizzare la porta 587 con TLS. Non realmente sicuro perché, ma non ho mai potuto ottenere la porta 465 di bel gioco.

Spero che questo aiuti qualcun altro fuori.

Alcune auto-promozione qui, ma mi sento un motivo valido.

Si avrebbe letteralmente solo bisogno di questo codice per fare esattamente quello che hai scritto:

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

O un uno di linea:

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

Ciò che è bello è che mi propongo di usare portachiavi per memorizzare la password, in modo da non avere un rischio di persone che vedono la password nello script.

È possibile impostare questa funzione eseguendo una volta nella interprete:

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

e uscire. Poi si può semplicemente utilizzare:

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

Se si aggiunge .yagmail con "my@gmail.com" nella vostra directory home, allora si può solo fare: yagmail.SMTP(), ma questo è piuttosto inutile ormai

.

Attenzione: Se si ottiene sul serio l'invio di un sacco di messaggi, meglio impostare OAuth2, yagmail può aiutare in questo

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

La prima volta che correva, che vi guiderà attraverso il processo di ottenere le credenziali OAuth2 e memorizzarli nel file in modo che la prossima volta non c'è bisogno di fare qualsiasi cosa con esso. Non si sospetta che qualcuno ha trovato le credenziali? Avranno autorizzazioni limitate, ma è meglio invalidano le loro credenziali attraverso gmail.

Per il pacchetto / installazione si prega di guardare git o readthedocs , disponibile sia per Python 2 e 3.

È necessario controllare la cartella "Posta inviata" in GMail, come è lì che un messaggio inviato dal tuo account per tuo conto sarà molto probabilmente visualizzato.

Sono andato al link di cui sopra e aveva 3 diverso di indirizzi da inviare a ma ho ricevuto tre messaggi di posta elettronica per lo stesso indirizzo e che essere l'indirizzo # 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!!-')

E 'lavori

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top