Envois d'email
Par gawel le 23/02/2005 02:22
Comment envoyer un email avec python.
Catégories : messagerie
Modules python : smtplib,email
Version Python : Python 2.2+
Envois de mail simple
voici comment envoyer un simple mail en text/plain avec python il suffit de quelques lignes ;)
# -*- coding: utf-8 -*-
# la lib smtp qui nous permet de dialoguer avec un serveur de mail
import smtplib
# un message email de type text
from email.MIMEText import MIMEText
def send(mfrom,mto):
email = MIMEText('Bonjour !') # objet Message contenant du text/plain
email['From']=mfrom # headers du mail : from/to/subject
email['To']=mto
email['Subject']='Bonjour !'
server = smtplib.SMTP('localhost') # objet serveur
server.sendmail(mfrom, # on lui envoi notre mail
mto,
email.as_string())
server.quit() # on ferme la connection
if __name__ == '__main__':
send('expediteur@example.com',
'destinataire@example.com')
Envois de mail avec attachement
voici comment envoyer un mail avec attachement
# -*- coding: utf-8 -*-
# la lib smtp qui nous permet de dialoguer avec un serveur de mail
import smtplib
# un email multipart (contient des pieces jointes)
from email.MIMEMultipart import MIMEMultipart
# un message email de type text
from email.MIMEText import MIMEText
# un message email de type image
from email.MIMEImage import MIMEImage
import mimetypes, posixpath
def image_a_mail(cheminfichier):
''' renvois un message de type MIMEImage a partir d'un fichier'''
# on utilise posixpath pour avoir le nom du fichier
nomfichier = posixpath.basename( cheminfichier )
# puis pour obtenir l'extension du fichier
extension = posixpath.splitext( nomfichier )
# puis mimetypes pour avoir le content-type de l'extension
content_type = mimetypes.types_map[ extension ]
# on ouvre le fichier image en mobe binaire
fichier = open(cheminfichier, 'rb')
# un objet message avec le contenu du fichier
# un objet message avec le contenu du fichier
image = MIMEImage( fichier.read() )
# on ajoute les headers pour l'image
image.add_header('Content-Disposition','inline; filename="%s"' % filename)
image.add_header('Content-type',content_type)
# on retourne l'objet message contenant l'image
return image
def send(mfrom,mto):
# on creer un objet message multipart
emailmultipart = MIMEMultipart()
# on ajoute les headers pour le mail principal
email['From']=mfrom
email['To']=mto
email['Subject']='Bonjour !'
# on creer un message simple en html (la classe ! ;)
emailtext = MIMEText('<b>Bonjour !</b>','html')
# on attache ce mail a notre multipart
emailmultipart.attach(emailtext)
# on creer un message de type MIMEImage a l'aide de notre fonction
emailimage = image_a_mail('image.jpg')
# on attache ce mail a notre multipart
emailmultipart.attach(emailimage)
# on envoit le mail
server = smtplib.SMTP('localhost')
server.sendmail(mfrom,
mto,
emailmultipart.as_string() )
server.quit()
if __name__ == '__main__':
send('expediteur@example.com',
'destinataire@example')
Vous avez a votre disposition d'autres MIME object dont voici la liste:
- MIMEAudio
- MIMEBase
- MIMEMessage
- MIMENonMultipart
Pourquoi pas un robot mail ?
Posté par
dim
le
28/02/2005 15:38
Pour aller plus loin, on peut dans la même idée facilement écrire un robot mail, qui par exemple saurait aller chercher un document sur internet (à partir d'une URL) et le renvoyer en pièce jointe avec le bon type mime...
Le robot existe déjà, j'en ai commencé le développement il y a quelques temps pour un ami qui n'avait que le mail au boulot. Les détails et la suite par là :
http://mbot.nah-ko.org/
http://packages.debian.org/testing/mail/mbot
Le robot existe déjà, j'en ai commencé le développement il y a quelques temps pour un ami qui n'avait que le mail au boulot. Les détails et la suite par là :
http://mbot.nah-ko.org/
http://packages.debian.org/testing/mail/mbot
date
Posté par
tarek
le
04/03/2005 11:51
petite précision,
ne pas omettre le header 'Date' pour éviter que le mail ne soit daté au 1 janvier 1970
ne pas omettre le header 'Date' pour éviter que le mail ne soit daté au 1 janvier 1970








Si je veux envoyer directement mes emails en passant par un serveur smtp distant, je me retrouve avec une erreur de connexion de socket
<code>
% python mail.py
Traceback (most recent call last):
File "mail.py", line 21, in ?
'sebastien@cheminel.com')
File "mail.py", line 14, in send
server = smtplib.SMTP('smtp.free.fr') # objet serveur
File "/usr/lib/python2.3/smtplib.py", line 254, in __init__
addr = socket.gethostbyname(socket.gethostname())
socket.gaierror: (-2, 'Name or service not known')
</code>
Une courte recherche sur internet me renvoi vers des explications sur /etc/resolv.conf ce qui me chagrine beaucoup. Comment avoir accès à de tel fichier sur un serveur mutualisé. C'est impossible.
Ma question est donc : est-ce un problème de python (qui m'échappe) ? Ou est-ce un problème de résolution DNS propre à ma machine (je n'ai aucun problème par ailleurs) ?
Ce tutorial vise un but très intéressant mais comment le mettre en pratique hors localhost ?
Je n'en suis qu'au début de mes recherches sur ce problème et dès que j'ai trouvé une solution (si personne ne m'en apporte ici :) je vous en fait part.
Réponses à ce commentaire