2010-06-17 5 views
5

J'essaye d'écrire une fonction Python pour envoyer un email à une liste d'utilisateurs, en utilisant le client de messagerie installé par défaut. Je veux ouvrir le client de messagerie, et donner à l'utilisateur la possibilité de modifier la liste des utilisateurs ou le corps de l'e-mail.Python - Ouvrir le client de messagerie par défaut en utilisant mailto, avec plusieurs destinataires

Je l'ai fait quelques recherches, et selon ici:

http://www.sightspecific.com/~mosh/WWW_FAQ/multrec.html

Il est apparemment contre la spécification RFC mettre plusieurs destinataires séparés par des virgules dans un lien mailto. Cependant, c'est comme ça que tout le monde semble le faire. Quelle est exactement la position moderne à ce sujet?

Quoi qu'il en soit, j'ai trouvé les deux sites suivants:

qui semblent suggérer des solutions à l'aide urllib.parse (url.parse.quote pour moi), et webbrowser.open.

J'ai essayé l'exemple de code du premier lien (2ality.blogspot.com), et cela a bien fonctionné, et ouvert mon client de messagerie par défaut. Cependant, lorsque j'essaie d'utiliser le code dans mon propre module, il semble ouvrir mon navigateur par défaut, pour une raison étrange. Pas de texte drôle dans la barre d'adresse, ça ouvre juste le navigateur. La fonction email_incorrect_phone_numbers() est dans la classe Employees, qui contient un dictionnaire (employee_dict) des objets Employee, eux-mêmes dotés d'un certain nombre d'attributs employés (sn, givenName, mail, etc.). code complet est en fait ici (Python - Converting CSV to Objects - Code Design)

from urllib.parse import quote 
import webbrowser 

.... 

    def email_incorrect_phone_numbers(self): 
     email_list = [] 
     for employee in self.employee_dict.values(): 
      if not PhoneNumberFormats.standard_format.search(employee.telephoneNumber): 
       print(employee.telephoneNumber, employee.sn, employee.givenName, employee.mail) 
       email_list.append(employee.mail) 
     recipients = ', '.join(email_list) 
     webbrowser.open("mailto:%s?subject=%s&body=%s" % 
        (recipients, quote("testing"), quote('testing')) 
        ) 

Toutes les suggestions?

Cheers, Victor

Répondre

3

Eh bien, puisque vous avez demandé des suggestions: oublier le schéma mailto: et webbrowser, et écrire un petit client SMTP en utilisant le module smtplib de Python. C'est un standard, entièrement pris en charge sur tous les systèmes, et il y a un exemple inclus dans la documentation dont vous pouvez pratiquement copier et coller des pièces.

Bien sûr, si vous utilisez smtplib, vous devrez demander à l'utilisateur les détails d'un serveur SMTP à utiliser (nom d'hôte et port, et probablement un identifiant/mot de passe). C'est certes gênant, donc je peux voir pourquoi vous voudriez déléguer à des programmes existants sur le système pour gérer le courrier électronique. Le problème est, il n'y a pas de façon indépendante du système de le faire. Même le module webbrowser ne fonctionne pas partout; certaines personnes utilisent des systèmes sur lesquels le module n'est pas capable de détecter le navigateur par défaut (ou tout), et même quand cela est possible, ce qui se passe lorsque vous fournissez un lien mailto: dépend entièrement du navigateur. Si vous ne voulez pas ou ne pouvez pas utiliser le protocole SMTP, le mieux serait d'écrire un module personnalisé capable de détecter et d'ouvrir le client de messagerie par défaut sur le plus de systèmes possible - essentiellement ce que webbrowser fait, à l'exception des clients de messagerie au lieu des navigateurs. Dans ce cas, c'est à vous d'identifier les types de clients de messagerie que vos utilisateurs ont installés et assurez-vous de les prendre en charge.Si vous êtes assez complet, vous pouvez probablement publier votre module sur PyPI (index de paquet Python) et peut-être même l'inclure dans une future version de la bibliothèque standard de Python - je suis sûr qu'il y a beaucoup de gens qui apprécieraient quelque chose comme cette.

+0

+1, je seconde le mouvement. –

+0

Hmm, oui, il semble que mailto est assez cassé. Le seul problème est que nous voulons que l'utilisateur puisse éditer la liste mailto, le sujet et le corps s'ils le souhaitent. Ouverture de leur client de messagerie avec des choses pré-remplies est un bon moyen de le faire. En outre, il s'agit d'un environnement d'entreprise assez homogène, nous savons donc quel client de messagerie l'utilisateur aura, et comment leur environnement est configuré. Cela, et c'est un utilitaire qui est vraiment seulement exécuté par un utilisateur (au moins pour l'instant). – victorhooi

+0

Et d'autre part, smtplib n'est pas vraiment une option, puisqu'il s'agit d'un environnement d'entreprise. C'est un petit utilitaire qui fonctionne sur le bureau d'un utilisateur, il n'y a pas de serveurs SMTP internes auxquels nous aurions accès, et nous ne pouvons pas pointer vers des serveurs externes à cause du proxy/pare-feu de l'entreprise (et nous ne devrions pas le faire non plus). N'y a-t-il pas une manière propre de faire cela, économiser pour utiliser un serveur SMTP? Votre dernière option semble intrigante, mais vous ne savez pas comment la réaliser. – victorhooi

0

Dans la ligne suivante, il ne devrait pas y avoir d'espace après la virgule.

recipients = ', '.join(email_list) 

En outre, Outlook a besoin de points-virgules, pas de virgules. En dehors de cela, mailto ne m'a jamais donné de chagrin.

L'astuce générale est de tester d'abord manuellement les URL mailto dans le navigateur et de déboguer les URL en les imprimant et en les entrant manuellement.

1

Comme c'est souvent le cas en Python, quelqu'un a déjà fait le gros du travail. Découvrez this recipe.

Questions connexes