2013-07-20 11 views
11

Ho un piccolo problema con un invio di email in Python:Python 2: SMTPServerDisconnected: connessione inaspettatamente chiuso

#me == my email address 
#you == recipient's email address 
me = "[email protected]" 
you = "[email protected]" 

# Create message container - the correct MIME type is multipart/alternative. 
msg = MIMEMultipart('alternative') 
msg['Subject'] = "Alert" 
msg['From'] = me 
msg['To'] = you 

# Create the body of the message (a plain-text and an HTML version). 
html = '<html><body><p>Hi, I have the following alerts for you!</p></body></html>' 

# Record the MIME types of both parts - text/plain and text/html. 
part2 = MIMEText(html, 'html') 

# Attach parts into message container. 
# According to RFC 2046, the last part of a multipart message, in this case 
# the HTML message, is best and preferred. 
msg.attach(part2) 

# Send the message via local SMTP server. 
s = smtplib.SMTP('aspmx.l.google.com') 
# sendmail function takes 3 arguments: sender's address, recipient's address 
# and message to send - here it is sent as one string. 
s.sendmail(me, you, msg.as_string()) 
s.quit() 

Quindi, prima di ora, il mio programma, non mi ha dato un errore, ma è anche didn' mandami un'e-mail E ora python mi dai un errore:

SMTPServerDisconnected: Connection unexpectedly closed 

Come posso risolvere il problema?

+0

hai controllato la tua connessione Internet? –

+2

vedi questa domanda: - http: // stackoverflow.it/questions/6270782/sending-email-with-python –

+0

possibile duplicato di [Problema con l'invio di mail da un id di mail di distribuzione \ [Python \]] (http://stackoverflow.com/questions/9972216/issue-with- invio-mail-da-a-distribuzione-mail-id-python) – tripleee

risposta

5

Molto probabilmente il server di Gmail ha rifiutato la connessione dopo il comando di dati (molto brutto da parte loro a farlo in questa fase :). Il messaggio effettivo è molto probabilmente questo:

retcode (421); Msg: 4.7.0 [ip.octets.listed.here  15] Our system has detected an unusual rate of 
    4.7.0 unsolicited mail originating from your IP address. To protect our 
    4.7.0 users from spam, mail sent from your IP address has been temporarily 
    4.7.0 rate limited. Please visit 
    4.7.0 https://support.google.com/mail/answer/81126 to review our Bulk Email 
    4.7.0 Senders Guidelines. qa9si9093954wjc.138 - gsmtp 

Come faccio a saperlo? Perché l'ho provato :) con lo s.set_debuglevel(1), che stampa la conversazione SMTP e puoi vedere di persona qual è il problema.

Hai due opzioni qui:

  1. Continuare a utilizzare quel relè; as explained by Google, è gmail gmail-to-in chiaro solo, e si deve a un-lista nera tuo IP attraverso la loro procedura di

  2. L'opzione più infallibile è quello di passare a TLS con l'autenticazione

Ecco come cambiate la fonte appare come:

# skipped your comments for readability 
import smtplib 
from email.mime.multipart import MIMEMultipart 
from email.mime.text import MIMEText 

me = "[email protected]" 
my_password = r"your_actual_password" 
you = "[email protected]" 

msg = MIMEMultipart('alternative') 
msg['Subject'] = "Alert" 
msg['From'] = me 
msg['To'] = you 

html = '<html><body><p>Hi, I have the following alerts for you!</p></body></html>' 
part2 = MIMEText(html, 'html') 

msg.attach(part2) 

# Send the message via gmail's regular server, over SSL - passwords are being sent, afterall 
s = smtplib.SMTP_SSL('smtp.gmail.com') 
# uncomment if interested in the actual smtp conversation 
# s.set_debuglevel(1) 
# do the smtp auth; sends ehlo if it hasn't been sent already 
s.login(me, my_password) 

s.sendmail(me, you, msg.as_string()) 
s.quit() 

Ora, se provate a 'imbrogliare' il sistema e inviare con un diverso (non Gmail) affrontare è andando a) richiede di connettersi a un nome host diverso (alcuni dei Record MX per gmail), quindi b) fermarti a e chiudi la connessione sulla base della lista nera ip, e c) inverti DNS, DKIM e molte altre contromisure per assicurarti di avere effettivamente il controllo del dominio che hai presentato nell'indirizzo MAIL FROM:.

Infine, c'è anche l'opzione 3) - utilizzare qualsiasi altro servizio inoltro e-mail, ci sono tonnellate di buoni :)

2

ho avuto lo stesso problema e risolto semplicemente specificando la porta di destra in questo modo:

smtplib.SMTP('smtp.gmail.com', 587) 
1

L'utilizzo di smtplib.SMTP_SSL() invece di smtplib.SMTP() funziona per me. Prova questo.

1

Ho realizzato uno strano comportamento. Ho usato codici simili menzionati sia la domanda che le risposte. Il mio codice ha funzionato per gli ultimi giorni. Tuttavia, oggi ho riscontrato il messaggio di errore menzionato nella domanda.

La mia soluzione: Avevo provato con successo il mio tentativo tramite la rete di librerie. Oggi l'ho provato tramite la rete Starbucks (sopra il captive portal). L'ho cambiato sulla mia rete mobile. Ha iniziato a funzionare di nuovo.

Forse, Google rifiuta le richieste da reti inaffidabili.

Problemi correlati