运行报错:'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对象时不需要加初始化参数

https://img.mukewang.com/climg/641c26e90912165006180067.jpg

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

https://img.mukewang.com/climg/641c272c0941abe212120245.jpg

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

https://img.mukewang.com/climg/641c2829090a1a8b05180156.jpg

https://img.mukewang.com/climg/641c2842095c2f9f07270082.jpg

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文件方法和发送邮件方法中,这样代码看着更清晰些

祝学习愉快~

0

0 学习 · 4469 问题

查看课程