2010-06-17 31 views
5

Estoy intentando escribir una función de Python para enviar un correo electrónico a una lista de usuarios, utilizando el cliente de correo instalado por defecto. Quiero abrir el cliente de correo electrónico y darle al usuario la oportunidad de editar la lista de usuarios o el cuerpo del correo electrónico.Python - Abrir el cliente de correo predeterminado usando mailto, con varios destinatarios

lo hice un poco de búsqueda, y según aquí:

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

al parecer es en contra de la especificación RFC poner varios destinatarios separados por comas en un enlace de correo. Sin embargo, esa es la manera en que todos parecen estar haciéndolo. ¿Cuál es exactamente la postura moderna sobre esto?

De todos modos, me encontré con los dos sitios siguientes:

que parecen sugerir soluciones utilizando urllib.parse (url.parse.quote para mí), y webbrowser.open.

Probé el código de muestra del primer enlace (2ality.blogspot.com), y funcionó bien, y abrí mi cliente de correo predeterminado. Sin embargo, cuando trato de usar el código en mi propio módulo, parece abrir mi navegador predeterminado, por alguna razón extraña. No hay texto gracioso en la barra de direcciones, solo abre el navegador.

La función email_incorrect_phone_numbers() está en la clase Empleados, que contiene un diccionario (employee_dict) de objetos Employee, que a su vez tienen una serie de atributos de empleado (sn, givenName, mail etc.). código completo es en realidad aquí (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')) 
        ) 

¿Alguna sugerencia?

Saludos, Victor

Respuesta

3

Bueno, ya que pidieron sugerencias: olvidar el esquema de mailto: y webbrowser, y escribir un pequeño cliente SMTP utilizando el módulo de Python smtplib. Es estándar, totalmente compatible con todos los sistemas, y hay un ejemplo incluido en la documentación del que puedes copiar y pegar prácticamente.

Por supuesto, si está utilizando smtplib tendrá que pedirle al usuario los detalles de un servidor SMTP para usar (nombre de host y puerto, y probablemente un nombre de usuario/contraseña). Eso es un inconveniente, así que puedo ver por qué querría delegar en programas existentes en el sistema para manejar el correo electrónico. El problema es que no hay una manera independiente de sistema para hacer eso. Incluso el módulo webbrowser no funciona en todas partes; algunas personas usan sistemas en los que el módulo no puede detectar el navegador predeterminado (o cualquiera), e incluso cuando puede, lo que sucede cuando proporciona un enlace mailto: depende exclusivamente del navegador.

Si no desea o no puede usar SMTP, su mejor opción podría ser escribir un módulo personalizado que sea capaz de detectar y abrir el cliente de correo electrónico predeterminado en tantos sistemas diferentes como sea posible, básicamente lo que webbrowser módulo, excepto para clientes de correo electrónico en lugar de navegadores. En ese caso, depende de usted identificar qué tipo de clientes de correo han instalado sus usuarios y asegurarse de que los admite.Si eres lo suficientemente minucioso, probablemente podrías publicar tu módulo en PyPI (índice de paquete de Python) e incluso incluirlo en una versión futura de la biblioteca estándar de Python. Estoy seguro de que hay muchas personas que apreciarían algo así como ese.

+0

+1, secundo el movimiento. –

+0

Hmm, sí, parece que mailto está bastante roto. El único problema es que queremos que el usuario pueda editar la lista de correo, el tema y el cuerpo si lo desea. Abrir su cliente de correo electrónico con cosas pre-pobladas es una buena manera de hacerlo. Además, este es un entorno corporativo bastante homogéneo, por lo que sabemos qué cliente de correo electrónico tendrá el usuario y cómo se configura su entorno. Eso, y es una utilidad que solo es ejecutada por un usuario (al menos por ahora). – victorhooi

+0

Y en segundo lugar, smtplib no es realmente una opción, ya que este es un entorno empresarial. Esta es una pequeña utilidad que se ejecuta en el escritorio de un usuario, no hay servidores SMTP internos a los que tendríamos acceso, y no podemos acceder a los externos debido al proxy/cortafuegos corporativo (y no deberíamos estar haciendo eso). ya sea). ¿No hay una manera clara de hacerlo, excepto por usar un servidor SMTP? Su última opción parece intrigante, pero no está seguro de cómo lograrlo. – victorhooi

0

En la siguiente línea, no debe haber espacio después de la coma.

recipients = ', '.join(email_list) 

Además, Outlook necesita punto y coma, no comas. Aparte de eso, mailto nunca me dio pena.

El consejo general es probar las URL de mailto manualmente en el navegador primero y depurar las URL imprimiéndolas e ingresándolas manualmente.

1

Como suele ser el caso en Python, alguien ya ha hecho la mayor parte del trabajo duro. Consulte this recipe.

Cuestiones relacionadas