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.txt
a 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