2015-02-20 12 views
6

Tôi muốn gửi email HTML cho người dùng sau khi họ đăng ký trang web. Trước đó, tôi đã viết kịch bản này để gửiGửi email HTML trong Appengine [PYTHON] bằng cách sử dụng tệp 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 <[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() 

Nhưng thay vì đặt HTML trực tiếp vào mã chính, tôi muốn có tệp HTML riêng sẽ được sử dụng làm nội dung. Tôi đã cố gắng thực hiện như sau:

nhưng vô ích. Làm cách nào để sử dụng tệp HTML ở vị trí của mã HTML?

+2

Bạn đã thử sử dụng các lệnh 'mở()' và '.readlines() hoặc .read()'? – Anthony

Trả lời

2

Có lẽ cách tốt nhất để thực hiện việc này là use a templating engine để tải và tạo HTML dưới dạng chuỗi từ tệp HTML. Ví dụ, nếu bạn sử dụng các gói webapp2 jinja2 extras, bạn có thể làm một cái gì đó dọc theo dòng:

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() 
    # ... 

Lưu ý rằng để làm việc này, bạn cần phải thêm jinja2 đến phần thư viện của app.yaml như trong:

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

... và bạn cũng cần phải bao gồm 'webapp2_extras.jinja2' thích hợp vào cấu hình ứng dụng. Ví dụ:

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) 

Trong khi bạn có thể cũng giống như dễ dàng mở file HTML cho mình, lợi ích của việc sử dụng một động cơ templating như jinja2 là nó sẽ khuyến khích bạn soạn và tái sử dụng HTML trong một cách lành mạnh hơn (trong khi chỉ đơn giản là tải các tập tin HTML có thể dẫn đến bạn cuối cùng áp dụng thay thế bằng tay). Ngoài ra, chỉ một lời nhắc bảo mật nhanh: nếu bất kỳ dữ liệu nào bạn đưa vào email đến từ các nguồn không đáng tin cậy (như người dùng hoặc người dùng khác), hãy đảm bảo xác thực và kiểm tra tính đúng đắn của nội dung (và cũng có thể tự động thoát trong động cơ templating).

Bạn rõ ràng có thể chọn một khuôn mẫu khác với jinja2, nhưng tôi đã chọn một câu trả lời cụ thể cho câu trả lời của tôi vì nó được hỗ trợ tốt và được ghi lại đầy đủ cho App Engine.

4

Bạn có thể đặt

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

để có được chính xác tác dụng tương tự như những gì bạn đang làm gì bây giờ; hoặc, bạn có thể có HTML như một tập tin đính kèm (do đó cơ thể của email chỉ là văn bản đơn giản một, nhưng người nhận có thể tải về HTML dưới dạng đính kèm) với:

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

Tôi không khá chắc chắn những gì bạn hy vọng sẽ đạt được trong cả hai trường hợp, nhưng đây là hai khả năng duy nhất tôi có thể nghĩ đến. Nếu không thỏa mãn, vui lòng chỉnh sửa Q của bạn để giải thích chính xác những gì bạn muốn email này trông giống như người dùng (là nội dung được cho là đồng bằng hoặc html, có nghĩa vụ phải là tệp đính kèm ...?).

+0

Nó không có lỗi hoặc thư mục như vậy! –

+0

@WasimThabraze, nếu trước tiên bạn chưa viết tệp '' emailHTML.html'', tất nhiên tệp được đề cập sẽ không tồn tại và việc cố gắng mở và đọc tệp đó sẽ gây ra lỗi. Trước khi bạn đọc các tập tin nó phải tồn tại - đó là một cho! -) Làm thế nào bạn chọn để tạo ra nó là một vấn đề hoàn toàn khác nhau (trong công cụ ứng dụng bạn không thể ghi tập tin, vì vậy nó cần phải là một tập tin dữ liệu chỉ đọc được tải lên như một phần ứng dụng của bạn). –

+0

Tệp tồn tại. Thậm chí sau đó tôi nhận được lỗi. –

Các vấn đề liên quan