运行报错:'str' object has no attribute 'policy'
来源:7-2 项目作业
Gonjre
2023-03-23 16:55:26
请老师帮我简化一下代码 然后指出错误 给点思路如何修改
代码如下:
import xlrd
import smtplib
from docx import Document
from docx.shared import Pt
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.oxml.ns import qn
from docx.enum.table import WD_TABLE_ALIGNMENT
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
def read_excel():
wb = xlrd.open_workbook('salary.xlsx')
sheet = wb.sheet_by_index(0) # 按索引获取第一个工作簿
rows = sheet.nrows
cols = sheet.ncols
data_list = []
for i in range(1, rows):
row_data = []
for j in range(cols):
row_data.append(sheet.cell_value(i, j))
data_list.append(row_data)
return data_list
def create_salary_docx():
doc = Document()
# 设置字体和大小
style = doc.styles['Normal']
style.font.name = '微软雅黑'
style.element.rPr.rFonts.set(qn('w:eastAsia'), u'微软雅黑') # 中文字体
style.font.size = Pt(11)
# 设置标题样式
title = doc.add_heading("", 0)
title.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
_t = title.add_run('5月工资单')
_t.font.name = '微软雅黑'
_t._element.rPr.rFonts.set(qn('w:eastAsia'), u'微软雅黑')
_t.bold = True
# 添加表格
table = doc.add_table(rows=2, cols=10, style='Light List Accent 5')
table.alignment = WD_TABLE_ALIGNMENT.CENTER
# 设置表格内容
table.cell(0, 0).text = '姓名'
table.cell(0, 1).text = '性别'
table.cell(0, 2).text = '部门'
table.cell(0, 3).text = '基本工资'
table.cell(0, 4).text = '绩效工资'
table.cell(0, 5).text = '餐补'
table.cell(0, 6).text = '社保'
table.cell(0, 7).text = '公积金'
table.cell(0, 8).text = '代扣个税'
table.cell(0, 9).text = '实发工资'
# 设置表格样式
for i in range(2):
for j in range(10):
cell = table.cell(i, j)
cell.paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
cell.vertical_alignment = WD_ALIGN_PARAGRAPH.CENTER
for i in read_excel():
table.cell(1, 0).text = i[0]
table.cell(1, 1).text = i[1]
table.cell(1, 2).text = i[2]
table.cell(1, 3).text = str(i[3])
table.cell(1, 4).text = str(i[4])
table.cell(1, 5).text = str(i[5])
table.cell(1, 6).text = str(i[6])
table.cell(1, 7).text = str(i[7])
table.cell(1, 8).text = str(i[8])
table.cell(1, 9).text = str(i[9])
# 保存Word文档
doc.save(i[0] + '5月工资单.docx')
def send_email():
mail_host = 'smtp.qq.com' # 第三方邮件服务器
mail_user = ''
mail_pass = ''
sender = '' # 发送者
message = MIMEMultipart('', 'html', 'utf-8')
message['From'] = Header(sender) # 发送邮件
message['Subject'] = Header('5月工资单', 'utf-8') # 标题
smtpobj = smtplib.SMTP()
smtpobj.connect(mail_host, 25)
smtpobj.login(mail_user, mail_pass)
for i in read_excel():
receivers = [str(i[10])] # 接收者
print(receivers)
attr = MIMEText(open(i[0] + '5月工资单.docx', 'rb').read(), 'base64', 'utf-8')
attr['Content-Type'] = 'application/octet-stream'
# 附件名称为中文时的写法
attr.add_header("Content-Disposition", "attachment", filename=("gbk", "", i[0] + "5月工资单.docx"))
msg_content = """
<p style="font-weight:bold;">亲爱的
""" + i[0] + """
:</p>
<p style="text-indent:2em;">感谢您为公司做出的贡献!</p>
<p style="text-indent:2em;">本月工资已经到账,请注意查收。如未收到,请您在5个工作日内联系人力资源部。</p>
<p style="text-indent:2em;">您的工资单详情请查看邮件附件!</p>
<p style="text-indent:2em;">如有异议请联系人力资源部。</p></p>
<br /><br /><br />
<p style="text-align:right;">人力资源部<br />2021年5月31日</p>
"""
message.attach(MIMEText(msg_content, 'html', 'utf-8'))
smtpobj.sendmail(sender, receivers, message.as_string())
if __name__ == '__main__':
send_email()1回答
好帮手慕小猿
2023-03-23
同学,你好!一、同学需要修改以下代码:
1、实例化message对象时不需要加初始化参数

2、将设置的attr 做为参数传入到message.attach()方法中

3、发送邮件时,接收人应该是邮箱,取excel 中每行数据的最后一个值作为参数来作为邮件的接收者


send方法完整代码:
def send_email():
mail_host = 'smtp.qq.com' # 第三方邮件服务器
mail_user = '632037011@qq.com'
mail_pass = 'gxeozzqzcdwobgah'
sender = '632037011@qq.com' # 发送者
#message = MIMEMultipart('', 'html', 'utf-8')
message = MIMEMultipart()
message['From'] = Header(sender) # 发送邮件
message['Subject'] = Header('5月工资单', 'utf-8') # 标题
smtpobj = smtplib.SMTP()
smtpobj.connect(mail_host, 25)
smtpobj.login(mail_user, mail_pass)
for i in read_excel():
mail=i[-1] #接受者
# receivers = [str(i[10])] # 接收者
# print(receivers)
attr = MIMEText(open(i[0] + '5月工资单.docx','rb').read(), 'base64', 'utf-8')
attr['Content-Type'] = 'application/octet-stream'
# 附件名称为中文时的写法
attr.add_header("Content-Disposition", "attachment", filename=("gbk", "", i[0] + "5月工资单.docx"))
#!
message.attach(attr)
msg_content = """
<p style="font-weight:bold;">亲爱的
""" + i[0] + """
:</p>
<p style="text-indent:2em;">感谢您为公司做出的贡献!</p>
<p style="text-indent:2em;">本月工资已经到账,请注意查收。如未收到,请您在5个工作日内联系人力资源部。</p>
<p style="text-indent:2em;">您的工资单详情请查看邮件附件!</p>
<p style="text-indent:2em;">如有异议请联系人力资源部。</p></p>
<br /><br /><br />
<p style="text-align:right;">人力资源部<br />2021年5月31日</p>
"""
message.attach(MIMEText(msg_content, 'html', 'utf-8'))
#!!!!
#smtpobj.sendmail(sender, receivers, message.as_string())
smtpobj.sendmail(sender, mail, message.as_string())二、同学可以将excel 读取的内容作为函数值进行返回,然后将返回值作为参数,传递到创建word文件方法和发送邮件方法中,这样代码看着更清晰些
祝学习愉快~
相似问题