Python3 SMTP 'Connection unexpectedly closed'

*爱你&永不变心* 提交于 2021-02-08 07:50:22

问题


Could somebody please tell me why I am getting a SMTPServerDisconnected("Connection unexpectedly closed") error from the following code?

import smtplib

from string import Template

from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

MY_ADDRESS = '---'
PASSWORD = '---'

def get_contacts(filename):
"""
Return two lists names, emails containing names and email 
addresses
read from a file specified by filename.
"""

names = []
emails = []
with open(filename, mode='r', encoding='utf-8') as contacts_file:
    for a_contact in contacts_file:
        names.append(a_contact.split()[0])
        emails.append(a_contact.split()[1])
return names, emails

def read_template(filename):
"""
Returns a Template object comprising the contents of the 
file specified by filename.
"""

with open(filename, 'r', encoding='utf-8') as template_file:
    template_file_content = template_file.read()
return Template(template_file_content)

def main():
names, emails = get_contacts('contacts.txt') # read contacts
message_template = read_template('message.txt')

# set up the SMTP server
s = smtplib.SMTP('smtp.gmail.com', 465)
s.ehlo()
s.starttls()
s.login(MY_ADDRESS, PASSWORD)

# For each contact, send the email:
for name, email in zip(names, emails):
    msg = MIMEMultipart()       # create a message

    # add in the actual person name to the message template
    message = 
message_template.substitute(PERSON_NAME=name.title())

    # Prints out the message body for our sake
    print(message)

    # setup the parameters of the message
    msg['From']=MY_ADDRESS
    msg['To']=email
    msg['Subject']="This is TEST"

    # add in the message body
    msg.attach(MIMEText(message, 'plain'))

    # send the message via the server set up earlier.
    s.send_message(msg)
    del msg

# Terminate the SMTP session and close the connection
s.quit()

if __name__ == '__main__':
main()

Obviously when I run the code my address and password is filled in.

The traceback I get from this when running in terminal is:

Traceback (most recent call last): File "emailAlert2.py", line 71, in main() File "emailAlert2.py", line 40, in main s = smtplib.SMTP('smtp.gmail.com', 465) File "/usr/local/Cellar/python/3.7.5/Frameworks/Python.framework/Versions/3.7/lib/python3.7/smtplib.py", line 251, in init (code, msg) = self.connect(host, port) File "/usr/local/Cellar/python/3.7.5/Frameworks/Python.framework/Versions/3.7/lib/python3.7/smtplib.py", line 338, in connect (code, msg) = self.getreply() File "/usr/local/Cellar/python/3.7.5/Frameworks/Python.framework/Versions/3.7/lib/python3.7/smtplib.py", line 394, in getreply raise SMTPServerDisconnected("Connection unexpectedly closed") smtplib.SMTPServerDisconnected: Connection unexpectedly closed

Thanks


回答1:


The Google Gmail server is hanging up on your (dropping your connection attempt).

Provided that you have enabled third party access (link) to your Gmail account, change your code as follows:

s = smtplib.SMTP('smtp.gmail.com', 465)
s.ehlo()
s.starttls()
s.login(MY_ADDRESS, PASSWORD)

Change to this:

s = smtplib.SMTP_SSL('smtp.gmail.com', 465)
s.ehlo()
s.login(MY_ADDRESS, PASSWORD)

The reason for the hang up is that you are creating a connection using an unencrypted method (smtplib.SMTP()). Google is expecting that you are connecting using SMTPS which requires SSL.




回答2:


Try port number 587 instead of port 465 in s = smtplib.SMTP('smtp.gmail.com', 465)




回答3:


Probably you may need to come up with App password instead of your default password - Check this out - https://support.google.com/accounts/answer/185833



来源:https://stackoverflow.com/questions/59179964/python3-smtp-connection-unexpectedly-closed

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!