2010-06-17 11 views
5

Próbuję napisać funkcję Pythona, aby wysłać wiadomość e-mail do listy użytkowników przy użyciu domyślnego zainstalowanego klienta poczty. Chcę otworzyć klienta poczty e-mail i dać użytkownikowi możliwość edytowania listy użytkowników lub treści wiadomości e-mail.Python - Otwórz domyślnego klienta poczty, używając mailto, z wieloma adresatami

Zrobiłem kilka wyszukiwania, a według tutaj:

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

To pozornie przeciwko specyfikacji RFC umieścić wielu odbiorców, oddziel je przecinkami w mailto link. Tak jednak wydaje się, że wszyscy tak robią. Co to jest współczesne stanowisko w tej sprawie?

Byle jak, znalazłem następujące dwie strony:

które zdają się sugerować rozwiązania wykorzystujące urllib.parse (url.parse.quote dla mnie), a webbrowser.open.

Próbowałem kodu przykładowego z pierwszego linku (2ality.blogspot.com), który działał dobrze i otworzył domyślnego klienta poczty. Jednak kiedy próbuję użyć kodu w moim własnym module, wydaje mi się, że otwieram domyślną przeglądarkę z jakiegoś dziwnego powodu. Brak tekstu w pasku adresu, po prostu otwiera przeglądarkę.

Funkcja email_incorrect_phone_numbers() znajduje się w klasie Employees, która zawiera słownik (employee_dict) obiektów Employee, które same mają wiele atrybutów pracowniczych (sn, givenName, mail itp.). Pełny kod jest faktycznie tutaj (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')) 
        ) 

Wszelkie sugestie?

Cheers, Victor

Odpowiedz

3

dobrze, skoro pytasz o sugestie: zapomnieć o schemacie mailto: i webbrowser i napisać mały klient SMTP przy użyciu modułu Pythona smtplib. Jest to standardowa, w pełni obsługiwana na wszystkich systemach, a istnieje przykład w dokumentacji, który można praktycznie po prostu skopiować i wkleić kawałki.

Oczywiście, jeśli używasz smtplib, będziesz musiał zapytać użytkownika o szczegóły dotyczące serwera SMTP, który ma być użyty (nazwa hosta i port oraz prawdopodobnie login/hasło). Jest to niewątpliwie niewygodne, więc widzę, dlaczego chcesz przekazać dostęp do istniejących programów w systemie, aby obsłużyć pocztę. Problem polega na tym, że nie ma sposobu niezależnego od systemu. Nawet moduł webbrowser nie działa wszędzie; niektórzy używają systemów, na których moduł nie jest w stanie wykryć domyślnej (ani żadnej) przeglądarki, a nawet gdy może, to co się stanie, gdy podasz link jest całkowicie zależny od przeglądarki.

Jeśli nie chcesz lub nie możesz używać SMTP, najlepiej jest napisać niestandardowy moduł, który będzie w stanie wykryć i otworzyć domyślnego klienta poczty e-mail na tylu różnych systemach, jak to możliwe - w zasadzie to, co jest możliwe. Moduł webbrowser ma, z wyjątkiem klientów poczty e-mail zamiast przeglądarek. W takim przypadku od Ciebie zależy, jakie rodzaje klientów pocztowych zainstalowali Twoi użytkownicy, i upewnij się, że je wspierasz.Jeśli jesteś wystarczająco dokładny, prawdopodobnie możesz opublikować swój moduł w PyPI (indeks paczek Pythona), a być może nawet włączyć go do przyszłej wersji standardowej biblioteki Pythona - na pewno jest wielu ludzi, którzy docenią coś takiego że.

+0

+1, cofam wniosek. –

+0

Hmm, tak, wygląda na to, że mailto jest zepsute. Jedynym problemem jest to, że chcemy, aby użytkownik mógł edytować listę mailto, temat i ciało, jeśli chcą. Otwieranie swojego klienta poczty z rzeczy wstępnie wypełnionych jest dobrym sposobem na to. Ponadto jest to dość jednorodne środowisko korporacyjne, więc wiemy, jakiego klienta poczty e-mail ma mieć użytkownik i jak jest skonfigurowane jego środowisko. To i jest to narzędzie, które naprawdę działa tylko jeden użytkownik (przynajmniej na razie). – victorhooi

+0

Po drugie, smtplib nie jest tak naprawdę opcją, ponieważ jest to środowisko korporacyjne. Jest to małe narzędzie uruchamiane na pulpicie użytkownika, nie ma wewnętrznych serwerów SMTP, do których mielibyśmy dostęp, i nie możemy uderzyć na zewnętrzne z powodu korporacyjnego proxy/zapory (i nie powinniśmy tego robić zarówno). Czy nie ma czystej metody robienia tego, z wyjątkiem korzystania z serwera SMTP? Twoja ostatnia opcja wygląda intrygująco, ale nie wiesz, jak ją osiągnąć. – victorhooi

0

W poniższym wierszu po przecinku nie powinno być spacji.

recipients = ', '.join(email_list) 

Co więcej, Outlook potrzebuje średników, a nie przecinków. Poza tym mailto nigdy nie dawało mi żalu.

Ogólna wskazówka to przetestowanie adresów URL mailto ręcznie w przeglądarce i debugowanie adresów URL poprzez ich wydrukowanie i ręczne wprowadzanie.

1

Jak to często bywa w Pythonie, ktoś już wykonał większość ciężkiej pracy. Sprawdź this recipe.

Powiązane problemy