2013-07-20 10 views
11

Mam mały problem z wysyłanie e-maili w Pythonie:Python 2: SMTPServerDisconnected: Połączenie nieoczekiwanie zamknięty

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

Zanim więc teraz, mój program, nie daje mi błąd, ale to też nie zrobił” t Wyślij mi e-mail. A teraz pyton dał mi błąd:

SMTPServerDisconnected: Connection unexpectedly closed 

Jak mogę to naprawić?

+0

czy sprawdziłeś połączenie internetowe? –

+2

hej zobacz to pytanie: - http: // stackoverflow.com/questions/6270782/sending-email-with-python –

+0

możliwy duplikat [problemu z wysyłaniem wiadomości e-mail z identyfikatorem poczty dystrybucyjnej \ [Python \]] (http://stackoverflow.com/questions/9972216/issue-with- send-mail-from-a-distribution-mail-id-python) – tripleee

Odpowiedz

5

Najprawdopodobniej serwer gmail odrzucił połączenie po komendzie danych (bardzo naiwni z tego powodu na tym etapie :). Faktyczna wiadomość to najprawdopodobniej ta:

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 

Skąd mam to wiedzieć? Ponieważ próbowałem go :) z s.set_debuglevel(1), który drukuje rozmowę SMTP i widzisz z pierwszej ręki, jaki jest problem.

masz dwie możliwości:

  1. dalej przy użyciu tego przekaźnika; as explained by Google, to tylko niezaszyfrowane gmail do gmail, i trzeba un-czarnej listy swój adres IP poprzez ich procedurą

  2. Najbardziej opcja idiotoodporny jest przejście na TLS z uwierzytelnianiem

Oto jak zmieniony źródło wygląda następująco:

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

teraz, jeśli starają się „ściągawki” układu i wysłać z innej (innych niż Gmail) adres to będzie a) wymagać, aby podłączyć się do innego hosta (część Rekordy MX dla Gmaila), a następnie b) Zatrzymaj Cię i zamknij połączenie z powodu umieszczenia na czarnej liście ip, i c) wykonaj odwrotną usługę DNS, DKIM i wiele innych środków zaradczych, aby upewnić się, że faktycznie kontrolujesz domenę, którą przedstawiłeś w adresie URL: adres.

Wreszcie, istnieje również opcja 3) - użyć dowolnej innej usługi sanitarną e-mail, istnieje mnóstwo dobrych :)

2

miałem ten sam problem i rozwiązać go tylko poprzez podanie odpowiedniego portu tak:

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

Użycie smtplib.SMTP_SSL() zamiast smtplib.SMTP() działa dla mnie. Spróbuj tego.

1

Zrozumiałem dziwne zachowanie. Użyłem podobnych kodów wymienionych zarówno pytanie i odpowiedzi. Mój kod działa od kilku dni. Jednak dzisiaj napotkałem komunikat o błędzie wspomniany w pytaniu.

Moje rozwiązanie: Próbowałem mojej udanej próby przez sieć bibliotek. Dzisiaj próbowałem go przez sieć Starbucks (przez portal przechwytujący). Zmieniłem go na moją sieć komórkową. Zaczęło działać ponownie.

Możliwe, Google odrzuca żądania od niewiarygodnych sieci.

Powiązane problemy