Как отправить электронное письмо с Python? - PullRequest
146 голосов
/ 07 июня 2011

Этот код работает и отправляет мне электронное письмо просто отлично:

import smtplib
#SERVER = "localhost"

FROM = 'monty@python.com'

TO = ["jon@mycompany.com"] # must be a list

SUBJECT = "Hello!"

TEXT = "This message was sent with Python's smtplib."

# Prepare actual message

message = """\
From: %s
To: %s
Subject: %s

%s
""" % (FROM, ", ".join(TO), SUBJECT, TEXT)

# Send the mail

server = smtplib.SMTP('myserver')
server.sendmail(FROM, TO, message)
server.quit()

Однако, если я пытаюсь обернуть его в функцию, подобную этой:

def sendMail(FROM,TO,SUBJECT,TEXT,SERVER):
    import smtplib
    """this is some test documentation in the function"""
    message = """\
        From: %s
        To: %s
        Subject: %s
        %s
        """ % (FROM, ", ".join(TO), SUBJECT, TEXT)
    # Send the mail
    server = smtplib.SMTP(SERVER)
    server.sendmail(FROM, TO, message)
    server.quit()

и вызвать ее, я получаюследующие ошибки:

 Traceback (most recent call last):
  File "C:/Python31/mailtest1.py", line 8, in <module>
    sendmail.sendMail(sender,recipients,subject,body,server)
  File "C:/Python31\sendmail.py", line 13, in sendMail
    server.sendmail(FROM, TO, message)
  File "C:\Python31\lib\smtplib.py", line 720, in sendmail
    self.rset()
  File "C:\Python31\lib\smtplib.py", line 444, in rset
    return self.docmd("rset")
  File "C:\Python31\lib\smtplib.py", line 368, in docmd
    return self.getreply()
  File "C:\Python31\lib\smtplib.py", line 345, in getreply
    raise SMTPServerDisconnected("Connection unexpectedly closed")
smtplib.SMTPServerDisconnected: Connection unexpectedly closed

Может кто-нибудь помочь мне понять, почему?

Ответы [ 11 ]

0 голосов
/ 12 февраля 2016

Что касается вашего кода, то, похоже, в этом нет ничего принципиально неправильного, за исключением того, что неясно, как вы на самом деле вызываете эту функцию.Все, что я могу думать, это то, что когда ваш сервер не отвечает, вы получите эту ошибку SMTPServerDisconnected.Если вы посмотрите функцию getreply () в smtplib (отрывок ниже), вы поймете идею.

def getreply(self):
    """Get a reply from the server.

    Returns a tuple consisting of:

      - server response code (e.g. '250', or such, if all goes well)
        Note: returns -1 if it can't read response code.

      - server response string corresponding to response code (multiline
        responses are converted to a single, multiline string).

    Raises SMTPServerDisconnected if end-of-file is reached.
    """

посмотрите пример на https://github.com/rreddy80/sendEmails/blob/master/sendEmailAttachments.py, который также использует вызов функции для отправки электронной почты, если это то, что вы пытаетесь сделать (СУХОЙ подход).

...