簡體   English   中英

Python - 渲染 Jinja 模板和 Email

[英]Python - Render Jinja template and Email

我正在測試這段代碼,我從 Github 獲得,用於渲染 jinja 模板並作為 email 發送。
當我運行如下代碼時。 我收到以下錯誤消息。 需要幫助來識別和解決問題。 謝謝。

JayMac$ python3 "send_email.py"

錯誤:根:發送 email 時出錯
錯誤:root:object 類型“過濾器”沒有 len()
回溯(最近一次通話最后):
文件“send_email.py”,第 47 行,在 send_email 中
server.sendmail(發件人,to_list,msg.as_string())
sendmail 中的文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/smtplib.py”,第 878 行
如果 len(senderrs) == len(to_addrs):
TypeError:“過濾器”類型的 object 沒有 len()

這是我正在使用的代碼 -

*** send_email.py ****

import sys, os.path, logging 
from jinja2 import Environment, PackageLoader
from os import path 

def render_template(template, **kwargs): 
''' renders a Jinja template into HTML '''
# check if template exists
if not os.path.exists(template):
    print('No template file present: %s' % template)
    sys.exit()

import jinja2
templateLoader = jinja2.FileSystemLoader(searchpath="/")
templateEnv = jinja2.Environment(loader=templateLoader)
templ = templateEnv.get_template(template)
return templ.render(**kwargs)

#-----------------------------------------------------------

def send_email(to, sender='jk<jk@gmail.com>', cc=None, bcc=None, subject=None, body=None):
''' sends email using a Jinja HTML template '''

import smtplib
# Import the email modules
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.header import Header
from email.utils import formataddr
from email.mime.base import MIMEBase
from email import encoders

# convert TO into list if string
if type(to) is not list:
    to = to.split()

to_list = to + [cc] + [bcc]
to_list = filter(None, to_list) # remove null emails

msg = MIMEMultipart('alternative')
msg['From']    = sender
msg['Subject'] = subject
msg['To']      = ','.join(to)
msg['Cc']      = cc
msg['Bcc']     = bcc
msg.attach(MIMEText(body, 'html'))
server = smtplib.SMTP_SSL('smtp.gmail.com') # or your smtp server
try:
    server.login('jk@gmail.com', 'password')
    logging.info('sending email xxx')
    server.sendmail(sender, to_list, msg.as_string())

except Exception as e:
    logging.error('Error sending email')
    logging.exception(str(e))
finally:
    server.quit()

#-----------------------------------------------------------------------------------

# MAIN

item1 = 'kryptonite'
item2 = 'green clothing'

# generate HTML from template
html = render_template('default.j2', vars=locals())

to_list = ['xyz@gmail.com', 'vcb@gmail.com']
sender = 'jk<jk@gmail.com>'
cc = ''
bcc = ''
subject = 'Testing Jinja Email'

# send email to a list of email addresses
# send_email(to_list, sender, cc, bcc, subject, html.encode('utf-8'))
send_email(to_list, sender, cc, bcc, subject, html)

錯誤在這一行:

to_list = filter(None, to_list) # remove null emails 

它應該是

to_list = list(filter(None, to_list) # remove null emails

因為 sendmail 需要一個實際的list ,而不是filter()返回的迭代器類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM