2015-02-20 5 views
6

Chcę wysłać wiadomość e-mail w formacie HTML użytkownikom po zarejestrowaniu się w witrynie. Wcześniej napisałem skrypt do wysyłaniaWysyłaj wiadomość HTML w aplikacji Appengine [PYTHON] przy użyciu pliku HTML

from google.appengine.api import mail 

message = mail.EmailMessage(sender="Example.com Support <[email protected]>", 
          subject="Your account has been approved") 

message.to = "Albert Johnson <Albert[email protected]>" 

message.body = """ 
Dear Albert: 

Your example.com account has been approved. You can now visit 
http://www.example.com/ and sign in using your Google Account to 
access new features. 

Please let us know if you have any questions. 

The example.com Team 
""" 

message.html = """ 
<html><head></head><body> 
Dear Albert: 

Your example.com account has been approved. You can now visit 
http://www.example.com/ and sign in using your Google Account to 
access new features. 

Please let us know if you have any questions. 

The example.com Team 
</body></html> 
""" 
message.send() 

Ale zamiast umieszczenie HTML bezpośrednio w głównym kodzie, chcę mieć oddzielny plik HTML, który będzie używany jako ciało. Próbowałem zrobić to w następujący sposób:

message.html = 'emailHTML.html' 

, ale na próżno. Jak mogę użyć pliku HTML zamiast kodu HTML?

+2

Czy próbowałeś użyć poleceń 'open()' i '.readlines() lub .read()'? – Anthony

Odpowiedz

2

Prawdopodobnie najlepszym sposobem, aby to zrobić, jest use a templating engine załadować i wygenerować kod HTML jako ciąg znaków z pliku HTML. Na przykład, w przypadku korzystania z pakietu webapp2 jinja2 extras, można zrobić coś wzdłuż linii:

from webapp2_extras import jinja2 as webapp_extras_jinja2 
# ... 

def get_message_html(): 
    jinja2 = webapp_extras_jinja2.get_jinja2() 
    return jinja2.render_template('relative/path/to/template.html') 

# ... 
def send_email(): 
    # ... 
    message.html = get_message_html() 
    # ... 

pamiętać, że aby uzyskać tej pracy, trzeba dodać jinja2 do sekcji bibliotek app.yaml jak w:

libraries: 
- name: webapp2 
    version: 2.5.2 
- name: jinja2 
    version: 2.6 

... a do konfiguracji aplikacji należy również dołączyć odpowiednią "webapp2_extras.jinja2". Ex:

config = { 
    'webapp2_extras.jinja2': { 
    'template_path': 'path/containing/my/templates', 
    'environment_args': { 
     # Keep generated HTML short 
     'trim_blocks': True, 
     'extensions': [ 
     # Support auto-escaping for security 
     'jinja2.ext.autoescape', 
     # Handy but might not be needed for you 
     'jinja2.ext.with_' 
     # ... other extensions? ... 
     ], 
     # Auto-escape by default for security 
     'autoescape': True 
    }, 
    # .. other configuration options for jinja2 ... 
    }, 
    # ... other configuration for the app ... 
}, 
# ... 
app = webapp2.WSGIApplication(routes, is_debug_enabled, config) 

ile można tak łatwo otworzyć plik HTML siebie, korzyści z zastosowania silnika szablonów, takich jak jinja2 jest to, że zachęcamy do komponowania i ponowne wykorzystanie kodu HTML w bardziej rozsądny sposób (podczas gdy zwyczajne wczytanie pliku HTML może spowodować ręczne wprowadzenie substytucji). Ponadto wystarczy przypomnienie o bezpieczeństwie: jeśli którykolwiek z danych zawartych w e-mailu pochodzi z niezaufanych źródeł (takich jak użytkownik lub inny użytkownik), upewnij się, że prawidłowo sprawdzisz i sprawdzisz jego zawartość (a także zezwolisz na automatyczne wykluczanie) silnik szablonowy).

Oczywiście można wybrać szablony inne niż jinja2, ale specjalnie wybrałem tę dla mojej odpowiedzi, ponieważ jest ona dobrze obsługiwana i dobrze udokumentowana dla App Engine.

4

Można ustawić

message.html = open('emailHTML.html').read() 

aby uzyskać dokładnie taki sam efekt, jak to, co robisz teraz; lub może masz HTML jako przywiązania (tak ciało wiadomości e-mail jest tylko zwykły tekst jeden, ale odbiorca może pobrać HTML jako załącznik) z:

message.attachments = [('emailHTML.html', open('emailHTML.html').read())] 

nie jestem pewien, co masz nadzieję osiągnąć w obu przypadkach, ale to tylko dwie możliwości, jakie mogę wymyślić. Jeśli żadne z nich nie jest zadowalające, edytuj swoje Q, aby wyjaśnić dokładnie, co chcesz, aby ta wiadomość e-mail wyglądała dla użytkownika (czy ciało ma być proste czy html, czy ma być załącznik ...?).

+0

Nie daje takiego pliku lub błędu katalogu! –

+0

@WasimThabraze, jeśli nie napisałeś najpierw pliku ''emailHTML.html'', oczywiście plik nie istnieje, a próba jego otwarcia i odczytu spowoduje błędy. Zanim przeczytasz plik, musi on istnieć - to jest dane! -) Sposób, w jaki go stworzysz, jest zupełnie inny (w silniku aplikacji nie możesz pisać plików, więc musi to być plik danych tylko do odczytu przesłany jako część Twojej aplikacji). –

+0

Plik istnieje. Nawet wtedy dostaję błąd. –

Powiązane problemy