python et les mails¶
envoie d’un email txt¶
On souhaite envoyer via l’adresse f.aoustin@kff.fr un message vers fraoustin@gmail.com contenant
Bonjour!
text a envoyer
import smtplib
# un message email de type text
from email.MIMEText import MIMEText
def send(mfrom,mto):
email = MIMEText('Bonjour !\ntext a envoyer') # objet Message contenant du text/plain
email['From']=mfrom # headers du mail : from/to/subject
email['To']=mto
email['Subject']='Bonjour !'
server = smtplib.SMTP('smtp.fr.oleane.com') # objet serveur
#server.login('user', 'password')
server.sendmail(mfrom, # on lui envoi notre mail
mto,
email.as_string())
server.quit() # on ferme la connection
if __name__ == '__main__':
send('f.aoustin@kff.fr','fraoustin@gmail.com')
envoie d’un email txt+html¶
#! /usr/bin/python
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
me = "f.aoustin@kff.fr"
you = "f.aoustin@kff.fr"
msg = MIMEMultipart('alternative')
msg['Subject'] = "Link"
msg['From'] = me
msg['To'] = you
text = "Hi!\nHow are you?\nHere is the link you wanted:\nhttp://www.python.org"
html = """\
<html>
<head></head>
<body>
<p>Hi!<br>
How are you?<br>
Here is the <a href="http://www.python.org">link</a> you wanted.
</p>
</body>
</html>
"""
part1 = MIMEText(text, 'plain')
part2 = MIMEText(html, 'html')
msg.attach(part1)
msg.attach(part2)
s = smtplib.SMTP('smtp.fr.oleane.com')
s.sendmail(me, you, msg.as_string())
s.close()
envoi mail par ligne de commande¶
#!/usr/bin/env python
import os
import sys
import logging
import syslog
import smtplib
from email.MIMEText import MIMEText
server_smtp = 'smtp.fr.oleane.com'
sender = 'f.aoustin@kff.fr'
def send(mfrom,mto, title, msg):
email = MIMEText(msg)
email['From']=mfrom
email['To']=mto
email['Subject']=title
server = smtplib.SMTP(server_smtp)
server.sendmail(mfrom,
mto,
email.as_string())
server.quit()
if __name__ == "__main__":
import sys
from getpass import getpass
try:
to = sys.argv[1]
subject = sys.argv[2]
msg = ''
for i in sys.argv[3:]:
msg = msg + i + '\n'
except IndexError:
syslog.syslog('[%s][ERROR]Usage: %s <to address> <subject> <txt>' % (sys.argv[0],sys.argv[0]))
for i in sys.argv[:]:
syslog.syslog('[%s][ERROR]: %s ' % (sys.argv[0],i))
print "Usage: %s <to address> <subject> <txt>" % sys.argv[0]
raise SystemExit
try:
send(sender ,to, subject, msg)
except Exception, e:
syslog.syslog('[%s][ERROR] Login failed. (Wrong username/password?)' % sys.argv[0])
syslog.syslog('[%s][ERROR][TO]: %s ' % (sys.argv[0],to))
syslog.syslog('[%s][ERROR][SUBJECT]: %s ' % (sys.argv[0],subject))
syslog.syslog('[%s][ERROR][MSG]: %s ' % (sys.argv[0],msg))
syslog.syslog('[%s][ERROR][ERROR]: %s ' % (sys.argv[0],e))
Pour utiliser gmail il faut activier le ssl et utiliser le port 587, le server smtp.gmail.com et son compte fraoustin@gmail.com + password
def send_mail(txt):
write_log(INFO, "send mail %s %s" % (CONF_MAIL, CONF_SUBJECT))
server = smtplib.SMTP('smtp.gmail.com',587)
server.ehlo()
server.starttls()
server.ehlo()
server.login(login,password)
un plus compliqué avec envoie de pièces jointes¶
from optparse import OptionParser
import sys
import os, os.path
import smtplib
from email.MIMEMultipart import MIMEMultipart
from email.MIMEBase import MIMEBase
from email.MIMEText import MIMEText
from email.Utils import COMMASPACE, formatdate
from email import Encoders
import syslog
def send_mail(send_from, send_to, subject, text, files=[], server="localhost",password=""):
"""
Send msg and attach
"""
assert type(send_to)==list
assert type(files)==list
msg = MIMEMultipart()
msg['From'] = send_from
msg['To'] = COMMASPACE.join(send_to)
msg['Date'] = formatdate(localtime=True)
msg['Subject'] = subject
msg.attach( MIMEText(text) )
for f in files:
part = MIMEBase('application', "octet-stream")
part.set_payload( open(f,"rb").read() )
Encoders.encode_base64(part)
part.add_header('Content-Disposition', 'attachment; filename="%s"' % os.path.basename(f))
msg.attach(part)
smtp = smtplib.SMTP(server)
if password != "":
smtp.login(send_from, password)
smtp.sendmail(send_from, send_to, msg.as_string())
smtp.close()
def getPathFile(p):
"""
Test of p is file with pwd and PYTHONPATH
"""
if os.path.isfile(p):
return p
if os.path.isfile(os.path.join(os.getcwd(),p)):
return os.path.join(os.getcwd(),p)
for i in sys.path:
if os.path.isfile(os.path.join(i,p)):
return os.path.join(i,p)
raise AttributeError, '%s is not directory' % p
def getPathDir(p):
"""
Test of p is file with pwd and PYTHONPATH
"""
if os.path.isdir(p):
return p
if os.path.isdir(os.path.join(os.getcwd(),p)):
return os.path.join(os.getcwd(),p)
for i in sys.path:
if os.path.isfile(os.path.join(i,p)):
return os.path.join(i,p)
raise AttributeError, '%s is not directory' % p
if __name__ == '__main__':
parser = OptionParser(version="%prog 0.1")
parser.description= "send mail with or without file"
parser.epilog = "by Frederic Aoustin"
parser.add_option("-f", "--from",
dest="fro",
help ="smtp from",
type="string")
parser.add_option("-t", "--to",
dest="to",
help ="to(s) separated by ;",
type="string")
parser.add_option("-s", "--server",
dest="server",
help ="server smtp",
type="string")
parser.add_option("-p", "--password",
dest="password",
help ="password of from",
default="",
type="string")
parser.add_option("-a", "--subject",
dest="subject",
help ="subject of mail",
type="string")
parser.add_option("-b", "--txt",
dest="txt",
help ="text of mail, line separated by ;",
type="string")
parser.add_option("-x", "--files",
dest="files",
help ="file(s) separated by ;",
type="string")
(options, args) = parser.parse_args()
try:
fro = options.fro
to= []
for i in options.to.split(";"):
to.append(i)
serv = options.server
password = options.password
subject = options.subject
txt = options.txt
txt = txt.replace(";","\n")
fil = []
for i in options.files.split(";"):
fil.append(getPathFile(i))
send_mail(fro, to, subject, txt, fil, serv,password)
except Exception, e:
print parser.error(e)
syslog.syslog('[%s][ERROR] Login failed. (Wrong username/password?)' % sys.argv[0])
syslog.syslog('[%s][ERROR][ERROR]: %s ' % (sys.argv[0],e))
Utilisation
C:\Users\aoustin\Desktop>python mailer.py -f f.aoustin@kff.fr -t f.aoustin@kff.fr;fraoustin@gmail.com
-s smtp.fr.oleane.com -p stingray -a TEST -b "coucou;deux lignes"
-x C:\eula.1028.txt;C:\eula.1033.txt
envoi d’un email en UTF-8¶
html = template('mail',{'sensors' : SENSORS,
'local' : LOCALSYSTEM,
})
msg = MIMEMultipart('alternative')
msg['Subject'] = "Dashboard %s" % self.hostname
msg['From'] = APP_MAIL_FROM
msg['To'] = APP_MAIL_TO
part = MIMEText(html.encode('utf-8'),_subtype='html', _charset='utf-8')
msg.attach(part)
server = smtplib.SMTP(APP_MAIL_SMTP)
server.sendmail(APP_MAIL_FROM, APP_MAIL_TO, msg.as_string())
server.close()
envoi d’un mail contenant des images¶
# Send an HTML email with an embedded image and a plain text message for
# email clients that don't want to display the HTML.
from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText
from email.MIMEImage import MIMEImage
# Define these once; use them twice!
strFrom = 'f.aoustin@myprop-group.com'
strTo = 'f.aoustin@myprop-group.com'
# Create the root message and fill in the from, to, and subject headers
msgRoot = MIMEMultipart('related')
msgRoot['Subject'] = 'test message'
msgRoot['From'] = strFrom
msgRoot['To'] = strTo
msgRoot.preamble = 'This is a multi-part message in MIME format.'
# Encapsulate the plain and HTML versions of the message body in an
# 'alternative' part, so message agents can decide which they want to display.
msgAlternative = MIMEMultipart('alternative')
msgRoot.attach(msgAlternative)
msgText = MIMEText('This is the alternative plain text message.')
msgAlternative.attach(msgText)
# We reference the image in the IMG SRC attribute by the ID we give it below
msgText = MIMEText('<b>Some <i>HTML</i> text</b> and an image.<br><img src="cid:image1"><br>Nifty!', 'html')
msgAlternative.attach(msgText)
# This example assumes the image is in the current directory
fp = open('test.png', 'rb')
msgImage = MIMEImage(fp.read())
fp.close()
# Define the image's ID as referenced above
msgImage.add_header('Content-ID', '<image1>')
msgRoot.attach(msgImage)
# Send the email (this example assumes SMTP authentication is required)
import smtplib
smtp = smtplib.SMTP()
smtp.connect('srvxxxx1')
smtp.sendmail(strFrom, strTo, msgRoot.as_string())
smtp.quit()