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. 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.
    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. 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
          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. 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
              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.
            2. 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)

            3. Modérateur
              socket.error(10054,'Connection reset by peer')

              Simple: le serveur en face t'a jeté.
              1. 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. 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?
                2. 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
                3. 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")
                4. 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....