131 votes

Envoi de courrier depuis Python via SMTP

J'utilise la méthode suivante pour envoyer un courrier à partir de Python à l'aide de SMTP. Est-ce la bonne méthode à utiliser ou est-ce qu'il me manque des pièges?

 from smtplib import SMTP
import datetime

debuglevel = 0

smtp = SMTP()
smtp.set_debuglevel(debuglevel)
smtp.connect('YOUR.MAIL.SERVER', 26)
smtp.login('USERNAME@DOMAIN', 'PASSWORD')

from_addr = "John Doe <john@doe.net>"
to_addr = "foo@bar.com"

subj = "hello"
date = datetime.datetime.now().strftime( "%d/%m/%Y %H:%M" )

message_text = "Hello\nThis is a mail from your server\n\nBye\n"

msg = "From: %s\nTo: %s\nSubject: %s\nDate: %s\n\n%s" 
        % ( from_addr, to_addr, subj, date, message_text )

smtp.sendmail(from_addr, to_addr, msg)
smtp.quit()
 

123voto

Vincent Marchetti Points 2097

Le script que j'utilise est tout à fait semblable; je l'ai poster ici comme un exemple de comment utiliser l'e-mail.* modules pour générer des messages MIME; de sorte que ce script peut être facilement modifié pour joindre des photos, etc.

Je m'appuie sur mon fournisseur d'accès internet pour ajouter la date de l'heure d'en-tête.

Mon fournisseur d'accès m'oblige à utiliser un smtp sécurisé la connexion pour envoyer un mail, je m'appuie sur l'ssmtplib module (téléchargeable à http://www1.cs.columbia.edu/~db2501/ssmtplib.py)

Comme dans votre script, le nom d'utilisateur et le mot de passe (compte tenu des valeurs factices ci-dessous), utilisé pour l'authentification sur le serveur SMTP, sont en texte brut dans la source. C'est une faiblesse de sécurité; mais la meilleure solution dépend de l'attention dont vous avez besoin (envie?) à propos de la protection de ces.

=======================================

#! /usr/local/bin/python


SMTPserver = 'smtp.att.yahoo.com'
sender =     'me@my_email_domain.net'
destination = ['recipient@her_email_domain.com']

USERNAME = "USER_NAME_FOR_INTERNET_SERVICE_PROVIDER"
PASSWORD = "PASSWORD_INTERNET_SERVICE_PROVIDER"

# typical values for text_subtype are plain, html, xml
text_subtype = 'plain'


content="""\
Test message
"""

subject="Sent from Python"

import sys
import os
import re

from smtplib import SMTP_SSL as SMTP       # this invokes the secure SMTP protocol (port 465, uses SSL)
# from smtplib import SMTP                  # use this for standard SMTP protocol   (port 25, no encryption)
from email.MIMEText import MIMEText

try:
    msg = MIMEText(content, text_subtype)
    msg['Subject']=       subject
    msg['From']   = sender # some SMTP servers will do this automatically, not all

    conn = SMTP(SMTPserver)
    conn.set_debuglevel(False)
    conn.login(USERNAME, PASSWORD)
    try:
        conn.sendmail(sender, destination, msg.as_string())
    finally:
        conn.close()

except Exception, exc:
    sys.exit( "mail failed; %s" % str(exc) ) # give a error message

97voto

madman2890 Points 167

La méthode que j'utilise couramment ... pas très différente mais un peu

 import smtplib
from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText

msg = MIMEMultipart()
msg['From'] = 'me@gmail.com'
msg['To'] = 'you@gmail.com'
msg['Subject'] = 'simple email in python'
message = 'here is the email'
msg.attach(MIMEText(message))

mailserver = smtplib.SMTP('smtp.gmail.com',587)
# identify ourselves to smtp gmail client
mailserver.ehlo()
# secure our email with tls encryption
mailserver.starttls()
# re-identify ourselves as an encrypted connection
mailserver.ehlo()
mailserver.login('me@gmail.com', 'mypassword')

mailserver.sendmail('me@gmail.com','you@gmail.com',msg.as_string())

mailserver.quit()
 

C'est tout

6voto

pjz Points 11925

Le principal inconvénient que je vois est que vous ne gérez aucune erreur: .login () et .sendmail () ont tous deux des exceptions documentées qu’ils peuvent générer, et il semble que .connect () doit avoir un moyen de le signaler. impossible de se connecter - probablement une exception levée par le code de socket sous-jacent.

6voto

Mark Ransom Points 132545

Assurez-vous de ne pas avoir de pare-feu bloquant SMTP. La première fois que j'ai essayé d'envoyer un e-mail, celui-ci était bloqué à la fois par le pare-feu Windows et par McAfee - il a fallu un temps fou pour les trouver tous les deux.

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