运行报错:'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文件方法和发送邮件方法中,这样代码看着更清晰些
祝学习愉快~
相似问题