鱼C论坛

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

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

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

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

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

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:21:38
本帖最后由 歌者文明清理员 于 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
这样就可以避免每封邮件内容重叠的问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-18 23:21:38 | 显示全部楼层    本楼为最佳答案   
本帖最后由 歌者文明清理员 于 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
这样就可以避免每封邮件内容重叠的问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-22 19:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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