循环浏览字典时发送电子邮件
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 函数
我正在尝试发送多封电子邮件,每封电子邮件都包含不同的文件附件。
像这样: 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 函数