2013-07-20 36 views
11

Tôi có một vấn đề nhỏ với một Email gửi bằng Python:Python 2: SMTPServerDisconnected: Kết nối bất ngờ đóng

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

Vì vậy, trước nay, chương trình của tôi, không cho tôi một lỗi, nhưng nó cũng didn' t gửi cho tôi một email. Và bây giờ python cho tôi một lỗi:

SMTPServerDisconnected: Connection unexpectedly closed 

Làm cách nào để khắc phục điều đó?

+0

bạn có kiểm tra kết nối internet ur không? –

+2

hey xem câu hỏi này: - http: // stackoverflow.com/questions/6270782/gửi-email-với-python –

+0

bản sao có thể có của [Vấn đề với việc gửi thư từ một id thư phân phối \ [Python \]] (http://stackoverflow.com/questions/9972216/issue-with- gửi-mail-từ-một-phân phối-mail-id-python) – tripleee

Trả lời

5

Có thể máy chủ gmail nhất từ ​​chối kết nối sau khi lệnh dữ liệu (rất khó chịu trong số họ làm như vậy ở giai đoạn này :). Tin nhắn thực tế có lẽ là thông điệp chính:

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 

Làm sao tôi biết? Bởi vì tôi đã thử nó :) với s.set_debuglevel(1), in các cuộc hội thoại SMTP và bạn có thể thấy trực tiếp vấn đề là gì.

Bạn đã có hai tùy chọn ở đây:

  1. Tiếp tục sử dụng rơle đó; as explained by Google, đó là gmail-to-gmail không được mã hóa mà thôi, và bạn phải bỏ danh sách đen ip của bạn thông qua thủ tục của họ

  2. Tùy chọn fool-proof nhất là chuyển đổi sang TLS với xác thực

Sau đây là cách nguồn thay đổi trông giống như:

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

Bây giờ, nếu cố gắng 'cheat' hệ thống và gửi với một khác nhau (không gmail) giải quyết nó gonna a) yêu cầu bạn phải kết nối với một hostname khác nhau (một số Bản ghi MX cho gmail), sau đó b) dừng bạn nd đóng kết nối trên cơ sở của danh sách đen ip, và c) làm đảo ngược DNS, DKIM và rất nhiều biện pháp đối phó khác để đảm bảo rằng bạn thực sự kiểm soát miền bạn đã trình bày trong địa chỉ MAIL FROM :.

Cuối cùng, cũng có tùy chọn 3) - sử dụng bất kỳ dịch vụ chuyển tiếp email khác, có tấn của những người tốt :)

2

I Had cùng một vấn đề và giải quyết nó chỉ bằng cách xác định cổng bên phải như thế này:

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

Sử dụng smtplib.SMTP_SSL() thay vì smtplib.SMTP() phù hợp với tôi. Thử cái này.

1

Tôi đã nhận ra một hành vi lạ. Tôi đã sử dụng các mã tương tự được đề cập cả câu hỏi và câu trả lời. Mã của tôi đã hoạt động trong những ngày qua. Tuy nhiên, hôm nay tôi đã gặp thông báo lỗi được đề cập trong câu hỏi.

Giải pháp của tôi: Tôi đã thử nỗ lực thành công của mình thông qua mạng thư viện. Hôm nay tôi đã thử qua mạng Starbucks (qua cổng bị khóa). Tôi đã đổi nó thành mạng di động của mình. Nó bắt đầu hoạt động trở lại.

Có thể, Google từ chối yêu cầu từ các mạng không đáng tin cậy.

Các vấn đề liên quan