Pertanyaan Python 2: SMTPServerDisconnected: Koneksi tiba-tiba tertutup


Saya memiliki masalah kecil dengan Email pengiriman dengan Python:

#me == my email address
#you == recipient's email address
me = "some.email@gmail.com"
you = "some_email2@gmail.com"

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

Jadi sebelum sekarang, program saya, tidak memberi saya kesalahan, tetapi itu juga tidak mengirimi saya Email. Dan sekarang python memberi saya kesalahan:

SMTPServerDisconnected: Connection unexpectedly closed

Bagaimana saya bisa memperbaikinya?


12
2017-07-20 07:25


asal


Jawaban:


Kemungkinan besar server gmail menolak koneksi setelah perintah data (sangat jahat bagi mereka untuk melakukannya pada tahap ini :). Pesan yang sebenarnya paling mungkin yang ini:

    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

Bagaimana saya tahu itu? Karena saya sudah mencobanya :) dengan s.set_debuglevel(1), yang mencetak percakapan SMTP dan Anda dapat melihat langsung apa masalahnya.

Anda punya dua opsi di sini:

  1. Terus gunakan relay itu; seperti yang dijelaskan oleh Google, hanya gmail-to-gmail yang tidak dienkripsi, dan Anda harus membatalkan blacklist ip Anda melalui prosedur mereka

  2. Pilihan paling tolol adalah beralih ke TLS dengan autentikasi

Beginilah cara mengubah sumber tampak seperti:

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

me = "some.email@gmail.com"
my_password = r"your_actual_password"
you = "some.email2@gmail.com"

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

Sekarang, jika mencoba untuk 'menipu' sistem dan mengirim dengan alamat (non-gmail) yang berbeda itu akan a) mengharuskan Anda untuk terhubung ke nama host yang berbeda (beberapa catatan MX untuk gmail), kemudian b) menghentikan Anda dan menutup koneksi dengan dasar blacklist ip, dan c) melakukan reverse DNS, DKIM, dan banyak tindakan balasan lainnya untuk memastikan Anda benar-benar mengendalikan domain yang Anda sajikan di MAIL FROM: address.

Akhirnya, ada juga opsi 3) - gunakan layanan relai email lainnya, ada banyak yang bagus :)


6
2017-10-14 09:10



Saya memiliki masalah yang sama dan memecahkannya hanya dengan menentukan port yang tepat seperti ini:

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

3
2018-04-21 21:34



Menggunakan smtplib.SMTP_SSL() dari pada smtplib.SMTP() bekerja untukku. Coba ini.


1
2017-10-02 07:39



Saya telah menyadari perilaku aneh. Saya telah menggunakan kode serupa yang menyebutkan pertanyaan dan jawaban. Kode saya telah berfungsi untuk hari-hari terakhir. Namun, hari ini saya menemukan pesan kesalahan yang disebutkan dalam pertanyaan.

Solusi saya: Saya telah mencoba usaha sukses saya melalui jaringan perpustakaan. Hari ini saya telah mencobanya melalui jaringan Starbucks (melalui portal tawanan). Saya mengubahnya ke jaringan seluler saya. Itu mulai bekerja lagi.

Mungkin, Google menolak permintaan dari jaringan yang tidak dapat diandalkan.


1
2017-12-27 17:29



Saya menghadapi masalah yang sama. Dalam kasus saya, kata sandi diubah hanya beberapa hari lalu. Jadi, itu memberi kesalahan. Saat saya memperbarui kata sandi dalam kode, itu bekerja seperti pesona ... !!!


0
2018-06-12 09:25