260 votes

Envoi d'email avec Python

Ce code fonctionne et m'envoie un email très bien:

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

Cependant, si j'essaye de l'envelopper dans une fonction comme celle-ci:

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

et appelez-le je reçois les erreurs suivantes:

  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
 

Quelqu'un peut-il m'aider à comprendre pourquoi?
Merci

267voto

Escualo Points 12584

Je vous recommande d'utiliser les packages standard email et smtplib ensemble pour envoyer l'Email. S'il vous plaît regardez l'exemple suivant (tiré de la documentation Python). Notez que si vous suivez cette approche, la "simple" la tâche est en effet simple, et les tâches plus complexes (comme la fixation d'objets binaires ou de l'envoi de la plaine/HTML des messages) sont effectuées très rapidement.

# Import smtplib for the actual sending function
import smtplib

# Import the email modules we'll need
from email.mime.text import MIMEText

# Open a plain text file for reading.  For this example, assume that
# the text file contains only ASCII characters.
fp = open(textfile, 'rb')
# Create a text/plain message
msg = MIMEText(fp.read())
fp.close()

# me == the sender's email address
# you == the recipient's email address
msg['Subject'] = 'The contents of %s' % textfile
msg['From'] = me
msg['To'] = you

# Send the message via our own SMTP server, but don't include the
# envelope header.
s = smtplib.SMTP('localhost')
s.sendmail(me, [you], msg.as_string())
s.quit()

Pour l'envoi de courriels à plusieurs destinations, vous pouvez également suivre l'exemple de la documentation Python:

# Import smtplib for the actual sending function
import smtplib

# Here are the email package modules we'll need
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart

COMMASPACE = ', '

# Create the container (outer) email message.
msg = MIMEMultipart()
msg['Subject'] = 'Our family reunion'
# me == the sender's email address
# family = the list of all recipients' email addresses
msg['From'] = me
msg['To'] = COMMASPACE.join(family)
msg.preamble = 'Our family reunion'

# Assume we know that the image files are all in PNG format
for file in pngfiles:
    # Open the files in binary mode.  Let the MIMEImage class automatically
    # guess the specific image type.
    fp = open(file, 'rb')
    img = MIMEImage(fp.read())
    fp.close()
    msg.attach(img)

# Send the email via our own SMTP server.
s = smtplib.SMTP('localhost')
s.sendmail(me, family, msg.as_string())
s.quit()

Comme vous pouvez le voir, l'en-tête To dans la MIMEText objet doit être une chaîne composée d'adresses e-mail séparées par des virgules. D'autre part, le second argument de la sendmail fonction doit être une liste de chaînes de caractères (chaque chaîne est une adresse e-mail).

Donc, si vous avez trois adresses e-mail: person1@example.com, person2@example.com, et person3@example.com, vous pouvez le faire comme suit (évident sections omis):

to = ["person1@example.com", "person2@example.com", "person3@example.com"]
msg['To'] = ",".join(to)
s.sendmail(me, to, msg.as_string())

l' "","".join(to) partie rend une unique chaîne de la liste, séparée par des virgules.

À partir de vos questions, je suppose que vous n'avez pas suivi le tutoriel Python - c'est un must si vous voulez aller n'importe où en Python - la documentation est surtout excellent pour la bibliothèque standard.

4voto

Nick ODell Points 1705

C'est probablement mettre des onglets dans votre message. Imprimez le message avant de le transmettre à sendMail.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X