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?

35
demandé sur MatthewMartin 2008-12-08 03:12:25

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 .

22
répondu Manuel Ceron 2008-12-08 02:36:49

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:

  1. pour sendmail et Postfix, un ~/.forward contenant "|/path/to/program"
  2. si vous utilisez procmail, une recette de |path/to/program
  3. Et certainement beaucoup d'autres
12
répondu bortzmeyer 2008-12-08 12:23:21

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
12
répondu jakebrinkmann 2014-11-06 15:28:55

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.

6
répondu mcrute 2008-12-08 00:39:49

poplib et smtplib seront vos amis lors du développement de votre application.

4
répondu Bullines 2008-12-08 00:21:53

la partie d'envoi a été couverte, pour la réception vous pouvez utiliser pop ou imap

3
répondu Toni Ruža 2008-12-08 09:37:39

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.

2
répondu Harley Holcombe 2008-12-08 00:15:54

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.

2
répondu epochwolf 2008-12-08 03:06:33

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)
1
répondu ambassallo 2015-06-04 16:35:48