Envíe un correo electrónico de Outlook con un archivo adjunto a la lista de usuarios en Excel con python

Aug 16 2020

Puedo enviar correos electrónicos usando Outlook con el siguiente script, pero si intento enviar un archivo adjunto, aparece un error.

Nombre de archivo_Email.xlsx

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

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

error que obtengo:

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)

El nombre del archivo es correcto y está en el mismo directorio que el script.

También intenté cambiar adjunto = 'hosts.txt', pero el mismo error. No estoy seguro de lo que falta.

Respuestas

1 SrinathNeela Aug 16 2020 at 21:00

prueba esto

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

Simplemente está asignando hosts.txta una variable pero Attachments.Add busca la ruta completa del sistema de archivos con un nombre de archivo

Para obtener el uso del directorio actual

Ejemplo

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

O

import os

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

FYI - Estoy en 3.8 Python