|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
我想把Excel工资表中工资明细发到表格中送指定的邮箱,遇到一个奇怪的问题,第一个邮件正常,自第二个起,主题和正文部分都会叠加前一个邮件内容。附代码如下,请大神指点。
- import smtplib
- from email.mime.text import MIMEText
- from email.mime.multipart import MIMEMultipart
- import openpyxl
- import re
- import time
- # 设置登录及服务器信息
- mail_host = 'smtp.163.com'
- mail_user = '1xxxxxxxx@163.com'
- mail_pass = 'T********FB'
- message = MIMEMultipart()
- message['From'] = '1xxxxxxx3@163.com'
- smtpObj = smtplib.SMTP()
- smtpObj.connect(mail_host, 25)
- smtpObj.login(mail_user, mail_pass)
- ws = openpyxl.load_workbook('Salary.xlsx')['Sheet1']
- result = list(ws.iter_rows(values_only=True))
- title = result[0] # 通过之前返回数据可以看出第一行是标题 我们直接索引获取第一行
- datas = result[1:] # 剩下除了第一行就是用例数据了 直接截取
- rules = r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}' #邮箱合规正则式
- for row in datas:
- dict1 = dict(zip(title, row))
- name = dict1.get('姓名', '未发现"姓名"字段')
- receivers = dict1.get('邮箱', '未发现"邮箱"字段')
- if re.search(rules, receivers):
- detail = ''
- for k, v in dict1.items():
- detail += str(k) + ":" + str(v) + '\n'
- message['To'] = receivers
- message['Subject'] = f'亲爱的{name},感谢您的努力付出!'
- message.attach(MIMEText(detail, 'plain', 'utf-8'))
- try:
- # smtpObj = smtplib.SMTP()
- # smtpObj.connect(mail_host, 25)
- # smtpObj.login(mail_user, mail_pass)
- smtpObj.sendmail('1xxxxxxxx3@163.com', receivers, message.as_string())
- print(f'{name}的邮件发送成功!')
- time.sleep(2)
- # smtpObj.quit()
- except smtplib.SMTPException as err:
- print(f'{name}的邮件发送失败,请检查相关设置!', err)
- else:
- print(f'{name}的邮箱地址{receivers}不合法,请检查更正!')
- break
复制代码
本帖最后由 歌者文明清理员 于 2023-6-18 23:23 编辑
你好!看到你的代码,问题可能出在对邮件正文和主题的处理上。在 for 循环中创建 message 对象之后,每次都直接修改了该对象的主题和正文部分。导致第二个邮件开始,每个邮件都包含了之前所有邮件的内容。正确的做法应该是每次都重新创建一个 MIMEMultipart 对象,例如:
- for row in datas:
- dict1 = dict(zip(title, row))
- name = dict1.get('姓名', '未发现"姓名"字段')
- receivers = dict1.get('邮箱', '未发现"邮箱"字段')
- if re.search(rules, receivers):
- detail = ''
- for k, v in dict1.items():
- detail += str(k) + ":" + str(v) + '\n'
- message = MIMEMultipart() # 新建 MIMEMultipart 对象
- message['To'] = receivers
- message['Subject'] = f'亲爱的{name},感谢您的努力付出!'
- message.attach(MIMEText(detail, 'plain', 'utf-8'))
- try:
- smtpObj.sendmail('1xxxxxxxx3@163.com', receivers, message.as_string())
- print(f'{name}的邮件发送成功!')
- time.sleep(2)
- except smtplib.SMTPException as err:
- print(f'{name}的邮件发送失败,请检查相关设置!', err)
- else:
- print(f'{name}的邮箱地址{receivers}不合法,请检查更正!')
- break
复制代码
这样就可以避免每封邮件内容重叠的问题。
|
|