Recevoir et envoyer des e-mails en python
Comment puis-je recevoir et envoyer un e-mail en python? Une sorte de "serveur de courrier".
je cherche à faire une application qui écoute pour voir si elle reçoit un e-mail adressé à foo@bar.domain.com, et envoie un email à l'expéditeur.
maintenant, suis-je capable de faire tout cela en python, serait-il préférable d'utiliser des bibliothèques tierces?
9 réponses
voici un exemple très simple:
import smtplib
server = 'mail.server.com'
user = ''
password = ''
recipients = ['user@mail.com', 'other@mail.com']
sender = 'you@mail.com'
message = 'Hello World'
session = smtplib.SMTP(server)
# if your SMTP server doesn't need authentications,
# you don't need the following line:
session.login(user, password)
session.sendmail(sender, recipients, message)
pour plus d'options, gestion des erreurs, etc., consultez la documentation du module smtplib .
je ne pense pas que ce serait une bonne idée d'écrire un véritable serveur de messagerie en Python. C'est certainement possible (voir les messages de Mcrute et Manuel Ceron pour avoir des détails) mais c'est beaucoup de travail quand on pense à tout ce qu'un vrai serveur de messagerie doit gérer (file d'attente, retransmission, traitement de spam, etc.).
vous devriez expliquer plus en détail ce dont vous avez besoin. Si vous voulez juste réagir à un e-mail entrant, je suggère de configurer le serveur de messagerie pour appeler un programme quand il reçoit le message. Ce programme peut faire ce qu'il veut (mettre à jour une base de données, créer un fichier, parler à un autre programme Python).
Pour appeler un programme arbitraire à partir du serveur de messagerie, vous avez plusieurs choix:
- pour sendmail et Postfix, un
~/.forward
contenant"|/path/to/program"
- si vous utilisez procmail, une recette de
|path/to/program
- Et certainement beaucoup d'autres
a trouvé un exemple utile pour lire des courriels en se connectant en utilisant IMAP:
Python-imaplib IMAP exemple avec Gmail
import imaplib
mail = imaplib.IMAP4_SSL('imap.gmail.com')
mail.login('myusername@gmail.com', 'mypassword')
mail.list()
# Out: list of "folders" aka labels in gmail.
mail.select("inbox") # connect to inbox.
result, data = mail.search(None, "ALL")
ids = data[0] # data is a list.
id_list = ids.split() # ids is a space separated string
latest_email_id = id_list[-1] # get the latest
# fetch the email body (RFC822) for the given ID
result, data = mail.fetch(latest_email_id, "(RFC822)")
raw_email = data[0][1] # here's the body, which is raw text of the whole email
# including headers and alternate payloads
Python a un module SMTPD qui vous sera utile pour écrire un serveur. Vous voudrez probablement aussi que le module SMTP ré-envoie. Les deux modules sont dans la bibliothèque standard au moins depuis la version 2.3.
poplib et smtplib seront vos amis lors du développement de votre application.
Oui, vous pouvez faire un peu tout avec les bibliothèques intégrées. Faites une recherche ici à la recherche des étiquettes [python]
et [email]
et vous verrez comment c'est fait.
en Fonction de la quantité de courrier que vous envoyez, vous voudrez peut-être regarder dans l'utilisation d'un véritable serveur de messagerie comme postifx ou sendmail (systèmes*nix) ces Deux programmes ont la possibilité d'envoyer un courriel reçu d'un programme basé sur l'adresse e-mail.
la meilleure façon de faire cela serait de créer un service windows en python qui reçoit les e-mails en utilisant imaplib2
ci-dessous est un exemple de script python pour faire la même chose.Vous pouvez installer ce script pour qu'il fonctionne comme un service windows en exécutant la commande suivante sur la ligne de commande "python THENAMEOFYOURSCRIPTFILE.py install".
import win32service
import win32event
import servicemanager
import socket
import imaplib2, time
from threading import *
import smtplib
from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText
import datetime
import email
class Idler(object):
def __init__(self, conn):
self.thread = Thread(target=self.idle)
self.M = conn
self.event = Event()
def start(self):
self.thread.start()
def stop(self):
self.event.set()
def join(self):
self.thread.join()
def idle(self):
while True:
if self.event.isSet():
return
self.needsync = False
def callback(args):
if not self.event.isSet():
self.needsync = True
self.event.set()
self.M.idle(callback=callback)
self.event.wait()
if self.needsync:
self.event.clear()
self.dosync()
def dosync(self):
#DO SOMETHING HERE WHEN YOU RECEIVE YOUR EMAIL
class AppServerSvc (win32serviceutil.ServiceFramework):
_svc_name_ = "receiveemail"
_svc_display_name_ = "receiveemail"
def __init__(self,args):
win32serviceutil.ServiceFramework.__init__(self,args)
self.hWaitStop = win32event.CreateEvent(None,0,0,None)
socket.setdefaulttimeout(60)
def SvcStop(self):
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
win32event.SetEvent(self.hWaitStop)
def SvcDoRun(self):
servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
servicemanager.PYS_SERVICE_STARTED,
(self._svc_name_,''))
self.main()
def main(self):
M = imaplib2.IMAP4_SSL("imap.gmail.com", 993)
M.login("YourID", "password")
M.select("INBOX")
idler = Idler(M)
idler.start()
while True:
time.sleep(1*60)
idler.stop()
idler.join()
M.close()
M.logout()
if __name__ == '__main__':
win32serviceutil.HandleCommandLine(AppServerSvc)