Envoyer un e-mail Outlook avec pièce jointe à la liste des utilisateurs dans Excel avec python

Aug 16 2020

Je peux envoyer un e-mail en utilisant Outlook avec le script ci-dessous, mais si j'essaie d'envoyer une pièce jointe, cela donne une erreur.

Nom de fichier_Email.xlsx

NAME    EMAIL
Roy     [email protected]
Jack    [email protected]

Script 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()

erreur que j'obtiens:

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)

Le nom du fichier est correct et se trouve dans le même répertoire que le script.

J'ai également essayé de changer la pièce jointe = 'hosts.txt', mais même erreur. Je ne sais pas ce qui manque.

Réponses

1 SrinathNeela Aug 16 2020 at 21:00

essaye ça

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 == '[email protected]':
                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()
0m3r Aug 17 2020 at 08:25

Vous affectez simplement hosts.txtà une variable mais Attachments.Add recherche le chemin complet du système de fichiers avec un nom de fichier

Pour obtenir le répertoire courant, utilisez

Exemple

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

Ou

import os

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

FYI - Je suis sur python 3.8