循环浏览字典时发送电子邮件

Send e-mail while Looping though dictionary

我正在尝试发送多封电子邮件,每封电子邮件都包含不同的文件附件。

像这样: file_A 转到 mail_a@mail.com file_B 转到 mail_b@mail.com ...

我试过这段代码,但是当我循环浏览字典时,我所有的电子邮件都转到 mail_c@mail.com,而不是 A 到 A、B 到 B、C按预期转换为 C。

import pandas as pd
import shutil, os
import os
import tempfile
import win32com.client as win32 
import glob, os

npath="yourpath/"

files=['file_a.xlsx','file_b.xlsx','file_c.xlsx']

mails=dict(zip(['mail_a@mail.com','mail_b@mail.com','mail_c@mail.com'],files))

for file in os.listdir(npath):
    if file.endswith(".xlsx"):
        outlook = win32.Dispatch('outlook.application')
        mail = outlook.CreateItem(0)
        for id,i in mails.items():
            mail.To = id            
        mail.Subject = 'Test'
        mail.HtmlBody = 'testing'
        mail.Attachments.Add(os.path.join(npath,file))
        mail.Display()

我很确定我的问题出在这个循环或我的字典上,但尝试了几个小时后我无法自行解决。

for id,i in mails.items():
            print(id)
            mail.To = id 

你的循环 returns id 的正确顺序。该字典还包含正确的键值对。您的 for 循环在 mail_c 处结束,因此被选中用于所有文件。

您可以通过将邮件 content/logic 放入 for loop

来修复它
for file in os.listdir(npath):
    if file.endswith(".xlsx"):
        outlook = win32.Dispatch('outlook.application')
        mail = outlook.CreateItem(0)
        for id,i in mails.items():
            mail.To = id            
            mail.Subject = 'Test'
            mail.HtmlBody = 'testing'
            mail.Attachments.Add(os.path.join(npath,file))
            mail.Display()

您的代码应使用 mails dict 遍历文件列表,这是一个示例:

files=['file_a.xlsx','file_b.xlsx','file_c.xlsx']

mails=dict(zip(['mail_a@mail.com','mail_b@mail.com','mail_c@mail.com'],files))

for mail_id, file in mails.items():
    if file.endswith(".xlsx"):
        outlook = win32.Dispatch('outlook.application')
        mail = outlook.CreateItem(0)
        mail.To = mail_id            
        mail.Subject = 'Test'
        mail.HtmlBody = 'testing'
        mail.Attachments.Add(os.path.join(npath,file))
        mail.Display()

如果您需要完全使用您的方法,则必须在第二个循环中添加文件匹配检查:

    for mail_id, file_name in mails.items():
        if file.endswith(file_name):
            mail.To = id  
            break   

注意:我没有使用 id 作为变量名,因为它是一个保留的内置 python 函数