Я делаю программу, чтобы электронные письма можно было легко отправлять списку людей с уникальным файлом, отправляемым каждому получателю. Эта программа считывает список в виде файла .csv с фамилией, именем, адресом электронной почты и соответствующим вложением для каждого получателя, использует шаблон для настройки каждого электронного письма с именем получателя и прикрепляет его файл.
Код можно увидеть ниже. Я использовал заполнители для строки темы и адреса электронной почты и скрыл фактический текст электронного письма, но вы должны быть в состоянии понять идею. В переменную email_data изначально загружается CSV-файл, содержащий информацию о получателе.
import csv
import datetime
import sys
import smtplib
import yagmail
import tkinter as tk
from tkinter import filedialog
from tkinter import simpledialog
root = tk.Tk()
root.withdraw()
password = simpledialog.askstring("Password", "Enter password:", show='*')
current_date = datetime.datetime.now()
subject_line = f'xyz {current_date.strftime("%B")} {current_date.year} xyz File'
LNAMES = []
FNAMES = []
EMAILS = []
FILES = []
yag = yagmail.SMTP('[email protected]', password)
email_data = filedialog.askopenfilename(filetypes=[('.csv', '.csv')],
title='Select the Email Data file')
def send_email():
with open(email_data) as csv_file:
csv_reader = csv.reader(csv_file, delimiter=',')
line_count = 0
for row in csv_reader:
last_name = row[0]
first_name = row[1]
email = row[2]
file = row[3]
LNAMES.append(last_name)
FNAMES.append(first_name)
EMAILS.append(email)
FILES.append(file)
line_count += 1
try:
for first_name, last_name, email, file in zip(FNAMES, LNAMES, EMAILS, FILES):
txt = '...'
yag.send(to=email,
subject=subject_line,
contents=[txt, file])
print("Email(s) sent successfully")
input("Press Enter to exit")
sys.exit(1)
except smtplib.SMTPAuthenticationError:
print("Incorrect Email password entered")
input("Press Enter to exit")
sys.exit(1)
send_email()
Проблема, с которой я сталкиваюсь, заключается в том, что если указанный файл находится не в рабочем каталоге, электронное письмо отправляется с фрагментом текста в нижней части электронного письма, который говорит что-то вроде «file.xlsx» вместо фактического вложения. Есть ли способ создать исключение, если файл не найден, чтобы электронное письмо не было просто отправлено без реального вложения?






Вы можете написать свои собственные исключения:
class EmailAttachmentNotFoundException(Exception):
pass
а затем в вашем коде, который прикрепляет файл: (остальная часть кода удалена для ясности):
защита send_email():
with open(email_data) as csv_file:
csv_reader = csv.reader(csv_file, delimiter=',')
line_count = 0
for row in csv_reader:
last_name = row[0]
first_name = row[1]
email = row[2]
file = row[3]
if not os.isfile(file):
raise EmailAttachmentNotFoundException('Could not find file {} Aborting!!!!'.format(file))
LNAMES.append(last_name)
FNAMES.append(first_name)
EMAILS.append(email)
FILES.append(file)
line_count += 1
Если вы хотите захватить его по линии:
try:
send_email()
except EmailAttachmentNotFoundException as e:
# Modify the way the exception is raised and how it is captured, but this is the most basic way of getting what is inside
print(str(e))
«Не удалось найти файл myfile.txt. Прерывание!!!!»
Я думаю, что вы хотите сказать, что вы хотите создать исключение EmailAttachmentNotFoundException и захватить его в другом месте, а затем посмотреть, какой файл не удалось выполнить? Вы можете зафиксировать исключение, а затем использовать его, отредактируйте ответ, чтобы сделать его понятным.
Это было именно то, что я пытался сказать. Ваше обновленное решение работало отлично; Спасибо большое.
В качестве альтернативы, если вам не нужно исключение, вы можете просто пропустить эту строку:
with open(email_data) as csv_file:
csv_reader = csv.reader(csv_file, delimiter=',')
line_count = 0
for row in csv_reader:
last_name = row[0]
first_name = row[1]
email = row[2]
file = row[3]
if not os.isfile(file):
continue # <-----
LNAMES.append(last_name)
FNAMES.append(first_name)
EMAILS.append(email)
FILES.append(file)
line_count += 1
continue пропустит остальную часть кода и вернется к циклу for. Вы можете добавить оператор печати прямо над continue, если хотите увидеть отзывы о том, какие из них не существуют.
Использовать
import os
if os.path.exists(file_path):
do_someting()
else:
raise SOME_ERROR()
чтобы узнать, существует ли файл.
Это было решение, которое работало лучше всего для меня. В итоге я сделал попытку, кроме того, что я сделал с исключением пароля. Есть ли способ перечислить файл, который не был найден, если я использую оператор try-except, такой как
except EmailAttachmentNotFoundException:?