Emvoi de mails - Python

Bonjour,
Quelqu'un a-t-il deja envoye des mails en programmant en Python? Il voudrait bien partager son code?

Merci d'avance.
Configuration: Windows XP
Firefox 3.0.1

15 réponses

Résumé de la discussion

La discussion porte sur l'envoi d'emails depuis Python, avec des questions sur l'utilisation de smtplib et sur la configuration réseau et serveur (SMTP, ports et authentication). Plusieurs réponses suggèrent d'utiliser smtplib avec MIMEText et de vérifier le serveur SMTP, le port réel et les paramètres d'authentification, y compris les cas où Exchange peut nécessiter une approche différente. D'autres échanges portent sur des erreurs de port 465 ou 25 et sur la nécessité de tester la connectivité et la disponibilité du serveur SMTP, ainsi que sur un extrait de code d'exemple. Dernièrement, une nuance utile indique qu'un exemple de code montre l'utilisation de MIMEText et smtplib avec login et sendmail, et que le choix du port dépend du serveur SMTP cible.

Bobot (l’IA à votre service)
  1. Contributeur
    Salut,
    Comment veux tu l'envoyer? J'ai un truc qui le fait en passant par outlook mais ça ne marche que si tu utilises outlook (pro) sans doute...
    1. Modérateur
      Il y a plus....portable :-)
      http://www.python.org/doc/lib/SMTP-example.html
    2. Contributeur
      @kilianCa dépend, je suis pas aidé si j'utilise pas SMTP (ce qui est le cas :-P)
    3. Modérateur
      @teeboOulah, double négation, lapin compris :-s
    4. Contributeur
      @kilianJ'ai pas de SMTP pour envoyer des mails, mais un serveur exchange...
    5. Modérateur
      @teeboJe savais pas qu'Exchange n'utilisait pas smtp :-O

      C'est pire que ce que je pensais....
  2. Modérateur
    Exchange ne possède pas des interfaces COM ?
    Sinon tu pourrais très bien le piloter en appellant du COM avec Python.
    1. Contributeur
      C'est pas moi qui ai posé la question, bon je donne mon script au cas où...

      # coding=iso-8859-1
      import sys
      import win32com.client
      import datetime
      
      PERSONAL_ADRESS = "adresse@mail.com"
      CATEGORY = "Home"
      TITLE = "TODO List on : " + str(datetime.date.today())
      
      ##def send():
      ##	olMailItem = 0x0
      ##	obj = win32com.client.Dispatch("Outlook.Application")
      ##	newMail = obj.CreateItem(olMailItem)
      ##	newMail.Subject = 'A subject line'
      ##	newMail.Body = 'Body, wonderful body'
      ##	newMail.To = 'somebody at example.com'
      ##	newMail.Display()
      
      def sendMail(text):
      	oOutlook = win32com.client.gencache.EnsureDispatch("Outlook.Application")
      	Msg = oOutlook.CreateItem(0)
      	Msg.To = PERSONAL_ADRESS
      	Msg.Subject = TITLE
      	Msg.Body = text
      	#Msg.Display()
      	Msg.Send()
      
      def getTasks():
      	oOutlook = win32com.client.gencache.EnsureDispatch("Outlook.Application")
      	onMAPI = oOutlook.GetNamespace("MAPI")
      	ofTasks = onMAPI.GetDefaultFolder(13) # 13=outlook tasks folder
      	redemption = oOutlook.CreateObject('Redemption.SafeTaskItem')
      	result = ''
      	for i in range(len(ofTasks.Items)):
      		redemption.Item = ofTasks.Items.Item(i+1)
      		if CATEGORY.lower() in redemption.Item.Categories.lower():
      			result = result  + '\t- ' + redemption.Item.Subject + '(' + redemption.Item.Categories +'(\n\n'
      	return result
      
      try:
      	sendMail(getTasks())
      except:
      	r= raw_input("Sorry, an error occured")
  3. Merci a tous d'avoir repondu a mon post.

    Il s'agit d'un envoi texte de mail, tout ce qu'il y a de plus simple. Le serveur est distant. J'aimerais avoir un code independant du client de messagerie, une correction au code suivant:

    import smtplib
    from email.mime.text import MIMEText
    def sendTextMail(mfrom,mto,text,sujet):
    mail = MIMEText(text)
    mail['From'] = mfrom
    mail['Subject'] = sujet
    mail['To'] = mto

    smtp = smtplib.SMTP('smtp.powweb.com', '25', 'localhost')
    smtp.connect()
    smtp.login('test@trucmuche.com', 'motdepasse')
    smtp.sendmail(mfrom, mto, mail.as_string())
    smtp.close()

    if __name__ == "__main__" :
    sendTextMail('test@trucmuche.com','test@machine.fr', 'test', 'test')

    Le code source de python.org recommande par killian ne me permet pas de comprendre.

    Merci.
    1. Contributeur
      Re,

      Tu peux utiliser la balise "code" s'il te plait (les <> bleus au dessus de la fenêtre de message) pour que l'on voit comment c'est organisé...
      Merci
  4. Comme je l'ai dit plus haut
    Il s'agit d'un envoi de mail texte, tout ce qu'il y a de plus simple. Le serveur est distant. J'aimerais avoir un code independant du client de messagerie, une correction au code suivant:

    import smtplib
    from email.mime.text import MIMEText
    def sendTextMail(mfrom,mto,text,sujet):
    mail = MIMEText(text)
    mail['From'] = mfrom
    mail['Subject'] = sujet
    mail['To'] = mto
    
    smtp = smtplib.SMTP('smtp.powweb.com', '25', 'localhost')
    smtp.connect()
    smtp.login('test@trucmuche.com', 'motdepasse')
    smtp.sendmail(mfrom, mto, mail.as_string())
    smtp.close()
    
    if __name__ == "__main__" :
    sendTextMail('test@trucmuche.com','test@machine.fr', 'test', 'test')


    Le code source de python.org recommande par killian ne me permet pas de comprendre.

    Merci d'avance.
    1. Contributeur
      Heu, le but de la balise code est de laisser l'identation, si ton programme est identé comme ca, ce n'est pas surprenant qu'il ne marche pas...

      Il se passe quoi? Rien ou as tu des messages d'erreurs?
  5. Heu...non je pense que j'ai juste fait une mauvaise copie. Je recommence:

    import smtplib
    
    from email.mime.text import MIMEText
    
    def sendTextMail(mfrom,mto,text,sujet):
        
        mail = MIMEText(text)
        mail['From'] = mfrom
        mail['Subject'] = sujet
        mail['To'] = mto
    
        smtp = smtplib.SMTP('smtp.trucmuche.com', '645', 'localhost')
        smtp.connect()
        smtp.login('test@trucmuche.com', 'motdepasse')
        smtp.sendmail(mfrom, mto, mail.as_string())
        smtp.close()
    
    if __name__ == "__main__" :
        sendTextMail('test@trucmuche.com','test@machine.fr', 'test', 'test')


    J'ai le message d'erreur suivant:

    Traceback (most recent call last):
    File "sendTextMail.py", line 19, in (module)
    sendTextMail('test@.trucmuche.com','retest@machine.fr', 'test', 'test')
    File "sendTextMail.py", line 12, in (module)
    smtp = smtplib.SMTP('smtp.trucmuche.com', '465', 'localhost')
    File "C:\Python25\lib\smtplib.py", line 244, in __init__
    (code,msg) = self.connect(host, port)
    File "C:\Python25\lib\smtplib.py", line 311, in connect
    (code,msg) = self.getreply()
    File "C:\Python25\lib\smtplib.py", line 352, in getreply
    line = self.file.readline()
    File "C:\Python25\lib\smtplib.py", line 346, in readline
    data = self._sock.recv(self.rbufsize)
    socket.error(10054,'Connection reset by peer')
    1. Modérateur
      socket.error(10054,'Connection reset by peer')

      Simple: le serveur en face t'a jeté.
      1. Merci.
        Mais est-ce que c'est tout? Y a aussi le

        Traceback (most recent call last):
        File "sendTextMail.py", line 19, in (module)
        sendTextMail('test@.trucmuche.com','retest@machine.fr', 'test', 'test')
        File "sendTextMail.py", line 12, in (module)


        ca signifie quoi?

        Et quelles sont les raisons pour lesquelles j'ai ete jetee?
        1. Contributeur
          Ca t'explique à quel endroit de ton code tu as un problème, mais sebsauvage a raison, le problème de départ c'est que tu t'es fait jeter.
          Le reste c'est juste pour te dire où tu demandes au serveur de t'accepter en quelque sorte (quel fonctions, quel lignes)

      2. Modérateur
        Le traceback t'indique où ça a planté.

        Dans ton source sendTextMail.py, c'est à la ligne 12:

        File "sendTextMail.py", line 12, in (module)
        smtp = smtplib.SMTP('smtp.trucmuche.com', '465', 'localhost') 


        Donc à la connexion.
        Donc soit le serveur n'existe pas, soit le chemin réseau est bloqué (firewall ?), soit le serveur te refuse la connexion.
        1. Contributeur
          Mauvais port?
        2. Modérateur
          @teebosoit mauvais port, oui.
      3. oui. merci.
        mais ma derniere question concerne plus les reseaux. comment je passe un serveur en parametre?
        smtp.serveur.com par exemple? ou l'@ ip? pour l'argument 'host'.

        P.s.:je ne suis pas tres "reseaux", pardon pour la betise.
        1. Modérateur
          Avant de te connecter sur le serveur, tu t'es assuré qu'il existe ?
          Tu arrive à le pinguer ?

          Tu es certain qu'il y a un serveur SMTP en écoute sur ce port ?
          (465 c'est assez curieux pour du SMTP ; habituellement c'est port 25)
          1. oui, j'ai fait un ping sur le serveur. Il existe.

            J'ai d'abord essaye avec le port 25; y a eu le meme bug, puis, j'ai change de port (en me disant que peut etre que c'est pas le port par defaut 25 qui a ete utilise)

            Comment je fais pour savoir quel port est reellement utilise?
            1. Modérateur
              Comment je fais pour savoir quel port est reellement utilise?

              ben il faut demander à la personne qui administre le serveur de mail.
              1. Modérateur
                Il existe en tant que nom de domaine, après est ce qu'il existe physiquement c'est autre chose...
                C:\>ping smtp.powweb.com
                
                Envoi d'une requête 'ping' sur smtp.powweb.com [65.254.250.100] avec 32 octets d
                e données :
                
                Délai d'attente de la demande dépassé.
                Délai d'attente de la demande dépassé.
                Délai d'attente de la demande dépassé.
                Délai d'attente de la demande dépassé.
                
                Statistiques Ping pour 65.254.250.100:
                    Paquets : envoyés = 4, reçus = 0, perdus = 4 (perte 100%),


                Et un ping n'est pas forcément fiable pour en témoigner.