鱼C论坛

 找回密码
 立即注册
查看: 667|回复: 1

[已解决]群发邮件问题求助

[复制链接]
发表于 2023-6-18 22:51:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我想把Excel工资表中工资明细发到表格中送指定的邮箱,遇到一个奇怪的问题,第一个邮件正常,自第二个起,主题和正文部分都会叠加前一个邮件内容。附代码如下,请大神指点。
  1. import smtplib
  2. from email.mime.text import MIMEText
  3. from email.mime.multipart import MIMEMultipart
  4. import openpyxl
  5. import re
  6. import time


  7. # 设置登录及服务器信息
  8. mail_host = 'smtp.163.com'
  9. mail_user = '1xxxxxxxx@163.com'
  10. mail_pass = 'T********FB'
  11. message = MIMEMultipart()
  12. message['From'] = '1xxxxxxx3@163.com'
  13. smtpObj = smtplib.SMTP()
  14. smtpObj.connect(mail_host, 25)
  15. smtpObj.login(mail_user, mail_pass)

  16. ws = openpyxl.load_workbook('Salary.xlsx')['Sheet1']
  17. result = list(ws.iter_rows(values_only=True))
  18. title = result[0]  # 通过之前返回数据可以看出第一行是标题 我们直接索引获取第一行
  19. datas = result[1:]  # 剩下除了第一行就是用例数据了 直接截取
  20. rules = r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}'        #邮箱合规正则式

  21. for row in datas:
  22.         dict1 = dict(zip(title, row))
  23.         name = dict1.get('姓名', '未发现"姓名"字段')
  24.         receivers = dict1.get('邮箱', '未发现"邮箱"字段')
  25.         if re.search(rules, receivers):
  26.                 detail = ''
  27.                 for k, v in dict1.items():
  28.                         detail += str(k) + ":" + str(v) + '\n'
  29.                 message['To'] = receivers
  30.                 message['Subject'] = f'亲爱的{name},感谢您的努力付出!'
  31.                 message.attach(MIMEText(detail, 'plain', 'utf-8'))
  32.                 try:
  33.                         # smtpObj = smtplib.SMTP()
  34.                         # smtpObj.connect(mail_host, 25)
  35.                         # smtpObj.login(mail_user, mail_pass)
  36.                         smtpObj.sendmail('1xxxxxxxx3@163.com', receivers, message.as_string())
  37.                         print(f'{name}的邮件发送成功!')
  38.                         time.sleep(2)
  39.                         # smtpObj.quit()
  40.                 except smtplib.SMTPException as err:
  41.                         print(f'{name}的邮件发送失败,请检查相关设置!', err)
  42.         else:
  43.                 print(f'{name}的邮箱地址{receivers}不合法,请检查更正!')
  44.                 break
复制代码
最佳答案
2023-6-18 23:21:38
本帖最后由 歌者文明清理员 于 2023-6-18 23:23 编辑

你好!看到你的代码,问题可能出在对邮件正文和主题的处理上。在 for 循环中创建 message 对象之后,每次都直接修改了该对象的主题和正文部分。导致第二个邮件开始,每个邮件都包含了之前所有邮件的内容。正确的做法应该是每次都重新创建一个 MIMEMultipart 对象,例如:

  1. for row in datas:
  2.         dict1 = dict(zip(title, row))
  3.         name = dict1.get('姓名', '未发现"姓名"字段')
  4.         receivers = dict1.get('邮箱', '未发现"邮箱"字段')
  5.         if re.search(rules, receivers):
  6.                 detail = ''
  7.                 for k, v in dict1.items():
  8.                         detail += str(k) + ":" + str(v) + '\n'
  9.                 message = MIMEMultipart()  # 新建 MIMEMultipart 对象
  10.                 message['To'] = receivers
  11.                 message['Subject'] = f'亲爱的{name},感谢您的努力付出!'
  12.                 message.attach(MIMEText(detail, 'plain', 'utf-8'))
  13.                 try:
  14.                         smtpObj.sendmail('1xxxxxxxx3@163.com', receivers, message.as_string())
  15.                         print(f'{name}的邮件发送成功!')
  16.                         time.sleep(2)
  17.                 except smtplib.SMTPException as err:
  18.                         print(f'{name}的邮件发送失败,请检查相关设置!', err)
  19.         else:
  20.                 print(f'{name}的邮箱地址{receivers}不合法,请检查更正!')
  21.                 break
复制代码

这样就可以避免每封邮件内容重叠的问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-18 23:21:38 | 显示全部楼层    本楼为最佳答案   
本帖最后由 歌者文明清理员 于 2023-6-18 23:23 编辑

你好!看到你的代码,问题可能出在对邮件正文和主题的处理上。在 for 循环中创建 message 对象之后,每次都直接修改了该对象的主题和正文部分。导致第二个邮件开始,每个邮件都包含了之前所有邮件的内容。正确的做法应该是每次都重新创建一个 MIMEMultipart 对象,例如:

  1. for row in datas:
  2.         dict1 = dict(zip(title, row))
  3.         name = dict1.get('姓名', '未发现"姓名"字段')
  4.         receivers = dict1.get('邮箱', '未发现"邮箱"字段')
  5.         if re.search(rules, receivers):
  6.                 detail = ''
  7.                 for k, v in dict1.items():
  8.                         detail += str(k) + ":" + str(v) + '\n'
  9.                 message = MIMEMultipart()  # 新建 MIMEMultipart 对象
  10.                 message['To'] = receivers
  11.                 message['Subject'] = f'亲爱的{name},感谢您的努力付出!'
  12.                 message.attach(MIMEText(detail, 'plain', 'utf-8'))
  13.                 try:
  14.                         smtpObj.sendmail('1xxxxxxxx3@163.com', receivers, message.as_string())
  15.                         print(f'{name}的邮件发送成功!')
  16.                         time.sleep(2)
  17.                 except smtplib.SMTPException as err:
  18.                         print(f'{name}的邮件发送失败,请检查相关设置!', err)
  19.         else:
  20.                 print(f'{name}的邮箱地址{receivers}不合法,请检查更正!')
  21.                 break
复制代码

这样就可以避免每封邮件内容重叠的问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-19 06:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表