J'utilise la méthode suivante pour envoyer un courrier à partir de Python via SMTP. Est-ce la bonne méthode à utiliser ou y a-t-il des pièges 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 <[email protected]>"
to_addr = "[email protected]"
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 poste ici à titre d'exemple d'utilisation des modules de messagerie. * Pour générer des messages MIME; donc ce script peut être facilement modifié pour attacher des images, etc.
Je compte sur mon FAI pour ajouter l'en-tête date/heure.
Mon fournisseur de services Internet me demande d’utiliser une connexion smtp sécurisée pour l’envoi de courrier. Je me base sur le module smtplib (téléchargeable à l’adresse suivante: http://www1.cs.columbia.edu/~db2501/ssmtplib.py )
Comme dans votre script, le nom d'utilisateur et le mot de passe (spécifiés ci-dessous pour les valeurs factices), utilisés pour s'authentifier sur le serveur SMTP, sont en texte brut dans la source. C'est une faiblesse de sécurité. mais la meilleure alternative dépend de la prudence avec laquelle vous voulez (voulez?) protéger ces derniers.
=======================================
#! /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_string())
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'] = '[email protected]'
msg['To'] = '[email protected]'
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('[email protected]', 'mypassword')
mailserver.sendmail('[email protected]','[email protected]',msg.as_string())
mailserver.quit()
C'est ça
De plus, si vous voulez utiliser l'authentification smtp avec TLS, par opposition à SSL, il vous suffit de changer le port (utilisez 587) et de smtp.starttls (). Cela a fonctionné pour moi:
...
smtp.connect('YOUR.MAIL.SERVER', 587)
smtp.ehlo()
smtp.starttls()
smtp.ehlo()
smtp.login('USERNAME@DOMAIN', 'PASSWORD')
...
Le principal inconvénient que je vois est que vous ne gérez aucune erreur: .login () et .sendmail () ont tous les deux des exceptions documentées qu’ils peuvent générer, et il semble que .connect () doit avoir un moyen d’indiquer que c’est le cas. impossible de se connecter - probablement une exception levée par le code de socket sous-jacent.
le code suivant fonctionne bien pour moi:
import smtplib
to = '[email protected]'
gmail_user = '[email protected]'
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/
Et ça?
import smtplib
SERVER = "localhost"
FROM = "[email protected]"
TO = ["[email protected]"] # 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()
Assurez-vous de ne pas avoir de pare-feu bloquant SMTP. La première fois que j'ai essayé d'envoyer un courrier électronique, il était bloqué à la fois par le pare-feu Windows et par McAfee - il a fallu un temps fou pour les trouver tous les deux.
Vous devez vous assurer de formater la date au format correct - RFC2822 .
L'exemple de code que j'ai fait pour envoyer du courrier en utilisant SMTP.
import smtplib, ssl
smtp_server = "smtp.gmail.com"
port = 587 # For starttls
sender_email = "sender@email"
receiver_email = "receiver@email"
password = "<your password here>"
message = """ Subject: Hi there
This message is sent from Python."""
# Create a secure SSL context
context = ssl.create_default_context()
# Try to log in to server and send email
server = smtplib.SMTP(smtp_server,port)
try:
server.ehlo() # Can be omitted
server.starttls(context=context) # Secure the connection
server.ehlo() # Can be omitted
server.login(sender_email, password)
server.sendmail(sender_email, receiver_email, message)
except Exception as e:
# Print any error messages to stdout
print(e)
finally:
server.quit()
Voir toutes ces réponses longues? Permettez-moi de promouvoir moi-même en faisant tout cela en quelques lignes.
Importer et connecter:
import yagmail
yag = yagmail.SMTP('[email protected]', Host = 'YOUR.MAIL.SERVER', port = 26)
Ensuite, il s’agit d’un one-liner:
yag.send('[email protected]', 'hello', 'Hello\nThis is a mail from your server\n\nBye\n')
En fait, il se fermera quand il sortira de la portée (ou pourra être fermé manuellement). De plus, cela vous permettra d’enregistrer votre nom d’utilisateur dans votre trousseau de sorte que vous n’aurez pas à écrire votre mot de passe dans votre script (cela m’ennuyait vraiment avant d’écrire yagmail
!)
Trucs et astuces pour le paquet/l'installation, veuillez consulter git ou pip , disponible pour les deux Python 2 et 3.
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 = '[email protected]'
password = getpass('Enter Gmail password: ')
sender = '[email protected]'
destination = '[email protected]'
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)))
tu peux 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 = '[email protected]'
to = '[email protected]'
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_string()
server.sendmail(from, to, message)