我正在测试从Github获得的这段代码,以渲染jinja模板并作为电子邮件发送。
当我运行下面的代码时。我收到以下错误消息。需要帮助来识别和解决问题。谢谢。
JayMac $ python3“ send_email.py”
ERROR:root:发送电子邮件时出错
错误:根:“过滤器”类型的对象没有len()
追溯(最近一次通话):
send_email中的文件“ send_email.py”,第47行
server.sendmail(sender,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:“过滤器”类型的对象没有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)
答案 0 :(得分:0)
此行中的错误:
to_list = filter(None, to_list) # remove null emails
应该是
to_list = list(filter(None, to_list) # remove null emails
因为sendmail需要一个实际的list
,而不是filter()
返回的迭代器类型。