import win32com as win32
import win32com.client
import datetime, os
import xlrd
import re
"需要更改第20行"
"创建收件人姓名数组, 创建收件人邮箱地址数组, 创建需要被CC的邮件地址"
ReceiverNameArray = []
ReceiverMailArray = []
CcMailArray = []
MailTopicSubject = 'multi-mail send test'
"将excel中的sheet0内容读出"
readExcel = xlrd.open_workbook('ReceiversAddressList.xlsx')
readExcel.sheets()
readSheet = readExcel.sheet_by_index(0)
"从sheet里面提取所需要的: 创建收件人姓名数组, 创建收件人邮箱地址数组, 创建需要被CC的邮件地址"
for col in readSheet.get_rows():
ReceiverName = col[0].value
ReceiverNameArray.append(ReceiverName)
ReceiverMail = col[1].value
ReceiverMailArray.append(ReceiverMail)
CcMail = col[2].value
CcMailArray.append(CcMail)
"将每个数组的第一行剔除(也就是剔除excel中的第一行)"
del(ReceiverNameArray[0])
del(ReceiverMailArray[0])
del(CcMailArray[0])
"ReceiverNameArray内容数量与ReceiverMailArray内容数量进行比较"
NumberCheck = False
if len(ReceiverNameArray) == len(ReceiverMailArray) and len(ReceiverNameArray) > 0:
NumberCheck = True # check 成功
else:
print("错误!!! 收件人数目与收件人邮箱数目不一致!!!")
"在MultiMailSend文件夹中找出文件名, 检查 ReceiverNameArray 的收件人是不是都能在该文件夹下找到对应的文件"
for root, dirs, files in os.walk('MultiMailSend'):
print("MultiMailSend文件夹下的所有文件名: " + str(files)) #运行for函数找出MultiMailSend文件夹下所有的文件名
count = 0
for i in range(0, len(ReceiverNameArray)):
for j in range(0, len(files)):
if (bool(re.search(str(ReceiverNameArray[i]), str(files[j]))) == True):
count = count + 1
FilesCheck = False
if count != len(ReceiverNameArray):
print("错误!!! 收件人名称和附件名称不一致!!!")
else:
FilesCheck = True
"发送多个邮件函数的实现"
class SendMultiEmail():
def outlook(self):
for i in range(0, len(ReceiverNameArray)):
mail_path_content = os.path.join('MultiMailSend', 'Content.txt') # 邮件正文内容
mail_path_attachment = os.path.join('MultiMailSend', ReceiverNameArray[i] + '.xlsx') #找到每个收件人对应的附件
olook = win32.client.Dispatch("outlook.Application") # 固定写法
mail = olook.CreateItem(0) # 固定写法
mail.To = ReceiverMailArray[i] # 收件人邮箱
mail.CC = CcMailArray[i] # 需要CC的邮箱
mail.Subject = MailTopicSubject # 邮件主题,
mail.Attachments.Add(mail_path_attachment, 1, 1, ReceiverNameArray[i]) # 添加附件
read = open(mail_path_content, encoding='utf-8') # 邮件正文
content = read.read() # 读取测试报告文件中的内容
read.close()
mail.Body = content # 将从报告中读取的内容,作为邮件正文中的内容
mail.Send() # 发送
"python程序的入口"
if __name__ == '__main__':
if FilesCheck == True and NumberCheck == True:
SendMultiEmail().outlook()
print("发送成功 !!!!!!!!!!")
else:
print("发送失败 !!!!!!!!!!")
报错
C:\Users\jie.luo\venv\Scripts\python.exe "C:/Users/jie.luo/OneDrive - Thermo Fisher Scientific/Python/发邮件/Main.py"
Traceback (most recent call last):
File "C:\Users\jie.luo\OneDrive - Thermo Fisher Scientific\Python\发邮件\Main.py", line 51, in <module>
for j in range(0, len(files)):
NameError: name 'files' is not defined. Did you mean: 'filter'?
Process finished with exit code 1
请问这是什么问题,以及如何处理呢?
因为你的i和上面的
for root, dirs, files in os.walk('MultiMailSend'):
写在同一层了
并没有写在上层循环的里面
前面统一加4个空格