Envoi de courrier depuis Python à l’aide de SMTP

J’utilise la méthode suivante pour envoyer du courrier à partir de Python en utilisant SMTP. Est-ce la bonne méthode à utiliser ou y a-t-il des choses qui me manquent?

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

Le script que j’utilise est assez similaire; Je le publie ici comme exemple d’utilisation des modules email. * Pour générer des messages MIME; donc ce script peut être facilement modifié pour joindre des images, etc.

Je compte sur mon fournisseur de services Internet pour append l’en-tête de date et heure.

Mon fournisseur de services Internet me demande d’utiliser une connexion smtp sécurisée pour envoyer du courrier, je me fie au module smtplib (téléchargeable à l’ adresse http://www1.cs.columbia.edu/~db2501/ssmtplib.py )

Comme dans votre script, le nom d’utilisateur et le mot de passe (valeurs nominales données ci-dessous), utilisés pour s’authentifier sur le serveur SMTP, sont en texte brut dans la source. Ceci est une faiblesse de sécurité; mais la meilleure alternative dépend de la prudence dont vous avez besoin pour les protéger.

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

 #! /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) # old version # from email.MIMEText import MIMEText from email.mime.text 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_ssortingng()) finally: conn.quit() except: sys.exit( "mail failed; %s" % "CUSTOM_ERROR" ) # give an error message 

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_ssortingng()) mailserver.quit() 

C’est tout

Aussi, si vous voulez faire une authentification smtp avec TLS plutôt que SSL, il vous suffit de changer le port (utilisez 587) et faites smtp.starttls (). Cela a fonctionné pour moi:

 ... smtp.connect('YOUR.MAIL.SERVER', 587) smtp.ehlo() smtp.starttls() smtp.ehlo() smtp.login('USERNAME@DOMAIN', 'PASSWORD') ... 

La principale chose que je vois est que vous ne gérez aucune erreur: .login () et .sendmail () ont toutes deux des exceptions documentées qu’elles peuvent lancer, et il semble que .connect () ait un moyen d’indiquer incapable de se connecter – probablement une exception levée par le code de socket sous-jacent.

Assurez-vous de ne pas avoir de pare-feu bloquant le protocole SMTP. La première fois que j’ai essayé d’envoyer un courrier électronique, celui-ci a été bloqué à la fois par le pare-feu Windows et par McAfee.

Et ça?

 import smtplib SERVER = "localhost" FROM = "sender@example.com" TO = ["user@example.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(SERVER) server.sendmail(FROM, TO, message) server.quit() 

le code suivant fonctionne bien pour moi:

 import smtplib to = 'mkyong2002@yahoo.com' gmail_user = 'mkyong2002@gmail.com' gmail_pwd = 'yourpassword' smtpserver = smtplib.SMTP("smtp.gmail.com",587) smtpserver.ehlo() smtpserver.starttls() smtpserver.ehlo() # extra characters to permit edit smtpserver.login(gmail_user, gmail_pwd) header = 'To:' + to + '\n' + 'From: ' + gmail_user + '\n' + 'Subject:testing \n' print header msg = header + '\n this is test msg from mkyong.com \n\n' smtpserver.sendmail(gmail_user, to, msg) print 'done!' smtpserver.quit() 

Réf: http://www.mkyong.com/python/how-do-send-email-in-python-via-smtplib/

Vous devez vous assurer que vous formatez la date dans le format correct – RFC2822 .

Voir toutes ces réponses plus longues? S’il vous plaît, permettez-moi de me promouvoir en le faisant en quelques lignes.

Importer et connecter:

 import yagmail yag = yagmail.SMTP('john@doe.net', host = 'YOUR.MAIL.SERVER', port = 26) 

Alors c’est juste un one-liner:

 yag.send('foo@bar.com', 'hello', 'Hello\nThis is a mail from your server\n\nBye\n') 

Il se fermera réellement lorsqu’il sera hors de scope (ou pourra être fermé manuellement). De plus, cela vous permettra d’enregistrer votre nom d’utilisateur dans votre trousseau de sorte que vous n’ayez pas à écrire votre mot de passe dans votre script (cela m’a vraiment dérangé avant d’écrire yagmail !)

Pour le package / installation, des astuces et des astuces, consultez git ou pip , disponible pour Python 2 et 3.

vous pouvez faire comme ça

 import smtplib from email.mime.text import MIMEText from email.header import Header server = smtplib.SMTP('mail.servername.com', 25) server.ehlo() server.starttls() server.login('username', 'password') from = 'me@servername.com' to = 'mygfriend@servername.com' body = 'That A Message For My Girl Friend For tell Him If We will go to eat Something This Nigth' subject = 'Invite to A Diner' msg = MIMEText(body,'plain','utf-8') msg['Subject'] = Header(subject, 'utf-8') msg['From'] = Header(from, 'utf-8') msg['To'] = Header(to, 'utf-8') message = msg.as_ssortingng() server.sendmail(from, to, message) 

Voici un exemple de travail pour Python 3.x

 #!/usr/bin/env python3 from email.message import EmailMessage from getpass import getpass from smtplib import SMTP_SSL from sys import exit smtp_server = 'smtp.gmail.com' username = 'your_email_address@gmail.com' password = getpass('Enter Gmail password: ') sender = 'your_email_address@gmail.com' destination = 'recipient_email_address@gmail.com' subject = 'Sent from Python 3.x' content = 'Hello! This was sent to you via Python 3.x!' # Create a text/plain message msg = EmailMessage() msg.set_content(content) msg['Subject'] = subject msg['From'] = sender msg['To'] = destination try: s = SMTP_SSL(smtp_server) s.login(username, password) try: s.send_message(msg) finally: s.quit() except Exception as E: exit('Mail failed: {}'.format(str(E)))