使用Python将带有附件的Outlook电子邮件发送给Excel名单中的用户

5
我可以使用以下脚本通过Outlook发送电子邮件,但如果我尝试发送附件,则会出错。
附件名称为_File Name_Email.xlsx_。
NAME    EMAIL
Roy     Roy@gmail.com
Jack    Jack@gmail.com

Python脚本

import win32com.client as win32
import pandas as pd

email_list = pd.read_excel(r'C:\Users\roy\Name_Email.xlsx')

names = email_list['NAME']
emails = email_list['EMAIL']

for i in range(len(emails)):
   name = names[i]
   email = emails[i]

   outlook = win32.Dispatch('outlook.application')
   mail = outlook.CreateItem(0)
   mail.To = email
   mail.Subject = 'Message subject'
   mail.Body = 'Hello ' + name
   attachment = "hosts.txt"
   mail.Attachments.Add(attachment)
   mail.Send()

我得到的错误:

pywintypes.com_error: (-2147352567, 'Exception occurred.', (4096, 'Microsoft Outlook', 'Cannot find this file. Verify the path and file name are correct.', None, 0, -2147024894), None)

文件名正确,且与脚本在同一目录中。
我尝试更改"attachment = 'hosts.txt'",但仍出现相同的错误。不确定缺少了什么。
3个回答

2
尝试这个。
from win32com.client import Dispatch
import win32com
import pandas as pd

def mailprepare():
    num = range(0, 5)
    for kk in num:
        outlook = win32com.client.Dispatch("Outlook.Application")
        for accoun in outlook.Session.Accounts:
            if accoun.SmtpAddress == 'your@mail.com':
                newaccount = accoun
                break
        mail = outlook.CreateItem(0)
        mail._oleobj_.Invoke(*(64209, 0, 8, 0, newaccount))
        data = pd.ExcelFile('D:\\path.xlsx')
        sheet = data.parse('Sheet1')
        name = sheet['Names'][kk]
        mailto = sheet['Mails'][kk]

        att = 'D:\\yourattchment.txt'
        with open(att, 'r') as my_attch:
            myfile=my_attch.read()

        mail.To = mailto
        mail.Subject = 'Subject'
        mail.Body = 'mail body'+ name
        mail.Attachments.Add(att)

        mail.Display(True)
        mail.send

mailprepare()

我有另一个问题,我想让附件从for循环中获取值。这个脚本在静态路径/文件中运行得非常完美,但是对于来自for循环的变量文件却不起作用。请给予建议,因为我已经在这里发布了问题:https://stackoverflow.com/questions/63472575/python-win32com-client-to-send-different-attachments-instead-of-fixed-file-path - ukki

1

你只是在将hosts.txt分配给一个变量,但Attachments.Add需要完整的文件系统路径和文件名。

要获取当前目录,请使用

示例

import os
print(os.getcwd() + "\hosts.txt")

或者

import os

attachment = "hosts.txt"
print(os.path.realpath(attachment))

提醒 - 我正在使用 Python 3.8


0

当我使用以下代码时,您的代码对我有效:

outlook = win32com.client.Dispatch('outlook.application')


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接