7-2【项目作业】有时执行时报错AttributeError: 'SMTP' object has no attribute 'SMTPException'

来源:7-

greatwisdom

2022-04-02 16:32:02

# coding: utf-8

import xlrd
import glob

from docx import Document
from docx.enum.style import WD_STYLE_TYPE
from docx.shared import Pt
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT, WD_ALIGN_PARAGRAPH
from docx.oxml.ns import qn
from docx.enum.table import WD_TABLE_ALIGNMENT

import smtplib
from email.mime.text import MIMEText
from email.header import Header
from email.mime.multipart import MIMEMultipart

import multiprocessing

def read_data(path):
    excel_obj = xlrd.open_workbook(path)
    book_obj = excel_obj.sheet_by_name('研发部工资表')
    datas = []
    for row in book_obj.get_rows():
        content = [j.value for j in row]
        datas.append(content)
    return datas

def write_word(datas, q):
    doc = Document()
    #设置字体和大小
    style = doc.styles['Normal']
    style.font.name = '微软雅黑'
    style.element.rPr.rFonts.set(qn('w:eastAsia'), u'微软雅黑')  # 中文字体
    style.font.size = Pt(6)

    #设置word的标题样式
    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

    #插入表格
    rows = len(datas)
    cols = len(datas[0])
    table = doc.add_table(rows, cols, style = 'Medium List 1 Accent 1')

    for i in range(rows):
        cells = table.rows[i].cells
        for j in range(cols):
            cells[j].text = str(datas[i][j])
    filename = f'{datas[1][0]}_5月工资单.docx'
    doc.save(filename)
    q.put(filename)
    # return filename

def send_mail(name,email,q):

    mail_host = 'smtp.qq.com'
    mail_user = '45xxxx65@qq.com'
    mail_pass = 'lqdkcccmwmnjcaad'

    sender = '45xxxx65@qq.com'
    receivers = email

    message = MIMEMultipart()

    message['From'] = Header(sender)

    filename= q.get()
    subject = filename.split('.')[0].split('_')[-1]
    message['Subject'] = Header(subject, 'utf-8')

    attr = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')
    attr['Content-Type'] = 'application/octet-stream'
    attr.add_header("Content-Disposition", "attachment", filename = ("gbk", "", filename))
    message.attach(attr)
    msg_content = """
    <p style="font-weight:bold;">亲爱的
    """ + name + """
    :</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'))
    try:
        smtpobj = smtplib.SMTP()
        smtpobj.connect(mail_host, 25)
        smtpobj.login(mail_user, mail_pass)
        smtpobj.sendmail(sender, receivers, message.as_string())
    except smtpobj.SMTPException as e:
        print('error: %s' % e)

if __name__ == '__main__':


    path = glob.os.path.join(glob.os.getcwd() , 'salary.xlsx')
    data = read_data(path)

    recs = [(data[0], data[i]) for i in range(1,len(data))]

    q = multiprocessing.Queue()
    #为了写word,每个元素里面第一个元素是表头
    for datas in recs:
        p_w = multiprocessing.Process(target = write_word, args = (datas, q, ))
        p_mail = multiprocessing.Process(target=send_mail, args = (datas[1][0],datas[1][-1],q,))
        for p in (p_w, p_mail):
            p.start()
        for p in (p_w, p_mail):
            p.join()


问题描述:

能正常执行,收到邮件,有时执行会报错。

D:\mooc_lessons\python_fullStack_2020\mail_python\venv\Scripts\python.exe D:/mooc_lessons/python_fullStack_2020/mail_python/work.py
Process Process-10:
Traceback (most recent call last):
  File "D:\mooc_lessons\python_fullStack_2020\mail_python\work.py", line 95, in send_mail
    smtpobj.login(mail_user, mail_pass)
  File "D:\Program Files (x86)\python3.8.1\lib\smtplib.py", line 734, in login
    raise last_exception
  File "D:\Program Files (x86)\python3.8.1\lib\smtplib.py", line 723, in login
    (code, resp) = self.auth(
  File "D:\Program Files (x86)\python3.8.1\lib\smtplib.py", line 646, in auth
    raise SMTPAuthenticationError(code, resp)
smtplib.SMTPAuthenticationError: (535, b'Login Fail. Please enter your authorization code to login. More information in http://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=1001256')

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "D:\Program Files (x86)\python3.8.1\lib\multiprocessing\process.py", line 315, in _bootstrap
    self.run()
  File "D:\Program Files (x86)\python3.8.1\lib\multiprocessing\process.py", line 108, in run
    self._target(*self._args, **self._kwargs)
  File "D:\mooc_lessons\python_fullStack_2020\mail_python\work.py", line 97, in send_mail
    except smtpobj.SMTPException as e:
AttributeError: 'SMTP' object has no attribute 'SMTPException'
Process Process-12:
Traceback (most recent call last):
  File "D:\mooc_lessons\python_fullStack_2020\mail_python\work.py", line 95, in send_mail
    smtpobj.login(mail_user, mail_pass)
  File "D:\Program Files (x86)\python3.8.1\lib\smtplib.py", line 734, in login
    raise last_exception
  File "D:\Program Files (x86)\python3.8.1\lib\smtplib.py", line 723, in login
    (code, resp) = self.auth(
  File "D:\Program Files (x86)\python3.8.1\lib\smtplib.py", line 646, in auth
    raise SMTPAuthenticationError(code, resp)
smtplib.SMTPAuthenticationError: (535, b'Login Fail. Please enter your authorization code to login. More information in http://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=1001256')

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "D:\Program Files (x86)\python3.8.1\lib\multiprocessing\process.py", line 315, in _bootstrap
    self.run()
  File "D:\Program Files (x86)\python3.8.1\lib\multiprocessing\process.py", line 108, in run
    self._target(*self._args, **self._kwargs)
  File "D:\mooc_lessons\python_fullStack_2020\mail_python\work.py", line 97, in send_mail
    except smtpobj.SMTPException as e:
AttributeError: 'SMTP' object has no attribute 'SMTPException'
Process Process-14:
Traceback (most recent call last):
  File "D:\mooc_lessons\python_fullStack_2020\mail_python\work.py", line 95, in send_mail
    smtpobj.login(mail_user, mail_pass)
  File "D:\Program Files (x86)\python3.8.1\lib\smtplib.py", line 734, in login
    raise last_exception
  File "D:\Program Files (x86)\python3.8.1\lib\smtplib.py", line 723, in login
    (code, resp) = self.auth(
  File "D:\Program Files (x86)\python3.8.1\lib\smtplib.py", line 646, in auth
    raise SMTPAuthenticationError(code, resp)
smtplib.SMTPAuthenticationError: (535, b'Login Fail. Please enter your authorization code to login. More information in http://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=1001256')

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "D:\Program Files (x86)\python3.8.1\lib\multiprocessing\process.py", line 315, in _bootstrap
    self.run()
  File "D:\Program Files (x86)\python3.8.1\lib\multiprocessing\process.py", line 108, in run
    self._target(*self._args, **self._kwargs)
  File "D:\mooc_lessons\python_fullStack_2020\mail_python\work.py", line 97, in send_mail
    except smtpobj.SMTPException as e:
AttributeError: 'SMTP' object has no attribute 'SMTPException'
Process Process-16:
Traceback (most recent call last):
  File "D:\mooc_lessons\python_fullStack_2020\mail_python\work.py", line 95, in send_mail
    smtpobj.login(mail_user, mail_pass)
  File "D:\Program Files (x86)\python3.8.1\lib\smtplib.py", line 734, in login
    raise last_exception
  File "D:\Program Files (x86)\python3.8.1\lib\smtplib.py", line 723, in login
    (code, resp) = self.auth(
  File "D:\Program Files (x86)\python3.8.1\lib\smtplib.py", line 646, in auth
    raise SMTPAuthenticationError(code, resp)
smtplib.SMTPAuthenticationError: (535, b'Login Fail. Please enter your authorization code to login. More information in http://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=1001256')

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "D:\Program Files (x86)\python3.8.1\lib\multiprocessing\process.py", line 315, in _bootstrap
    self.run()
  File "D:\Program Files (x86)\python3.8.1\lib\multiprocessing\process.py", line 108, in run
    self._target(*self._args, **self._kwargs)
  File "D:\mooc_lessons\python_fullStack_2020\mail_python\work.py", line 97, in send_mail
    except smtpobj.SMTPException as e:
AttributeError: 'SMTP' object has no attribute 'SMTPException'

Process finished with exit code 0

尝试过的解决方式:

重新qq邮箱重新生成授权码,需要等一会再执行脚本就不会报错了。


写回答

1回答

好帮手慕燕燕

2022-04-02

同学,你好!由于是自动化发送邮件,触发了QQ邮箱的安全机制,授权码需要重新生成才能有效,并非程序bug,从错误信息也可以看出,登录失败,提示输入授权码,'Login Fail. Please enter your authorization code to login. More information in http://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=1001256' 

祝:学习愉快!

0

0 学习 · 4469 问题

查看课程