Я надеюсь, что у вас уже есть настроенный SMTP-сервер, если нет, вы можете использовать Gmail SMTP, Yahoo SMTP или Maligun или что-то подобное.
Отправка электронных писем с вложением CSV с использованием Python
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
from email.mime.text import MIMEText
import smtplib
def send_mail():
# Создаем составное сообщение
msg = MIMEMultipart()
body_part = MIMEText(MESSAGE_BODY, 'plain')
msg['Subject'] = EMAIL_SUBJECT
msg['From'] = EMAIL_FROM
msg['To'] = EMAIL_TO
# Добавляем контент
msg.attach(body_part)
# Открываем и читаем CSV файл в двоичном формате
with open(PATH_TO_CSV_FILE,'rb') as file:
# Прикрепляем файл к письму
msg.attach(MIMEApplication(file.read(), Name=FILE_NAME))
# Создаем SMTP объект
smtp_obj = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
# Логинимся на SMTP сервере
smtp_obj.login(SMTP_USERNAME, SMTP_PASSWORD)
# Преобразуем сообщение в строку и отправим
smtp_obj.sendmail(msg['From'], msg['To'], msg.as_string())
smtp_obj.quit()
Переменные:
- EMAIL_SUBJECT = Тема письма
- EMAIL_FROM = адрес электронной почты получателя
- EMAIL_TO = Адрес электронной почты отправителя
- MESSAGE_BODY = тело письма
- PATH_TO_CSV_FILE = путь к zip-файлу
- FILE_NAME = имя файла для вложения электронной почты
- SMTP_SERVER = SMTP-сервер
- SMTP_PORT = порт SMTP
- SMTP_USERNAME = имя пользователя для SMTP
- SMTP_PASSWORD = пароль SMTP
Поскольку эти переменные содержат конфиденциальные данные, я всегда рекомендую передавать их из переменных среды, однако вы также можете передавать их в качестве аргументов функции send_mail.
Пояснения:
Сначала мы импортируем все необходимые модули для функции, затем внутри функции мы создаем составное сообщение, используя MIMEMultipartobject. Поскольку составной объект принимает аргументы в парах ключ-значение, мы предоставляем все необходимые аргументы, такие как тело сообщения, адрес отправителя, адрес получателя, таким же образом.
Затем мы открываем файл CSV в двоичном виде и присоединяем двоичный поток к электронному письму, используя метод MIMEApplication.
Затем мы используем встроенный модуль SMTP Python и создаем объект сеанса SMTP, предоставляя учетные данные для входа и, наконец, отправляя почту.
Обратите внимание, что если вы хотите отправить несколько CSV-файлов в одном и том же письме, вы можете создать список файлов, перебрать их и прикрепить к электронному письму, как показано ниже.
.....
# create file list
csv_files = ['path_to_csv_1','path_to_csv_2']
# loop over files
for file in csv_files:
with open(file,'rb') as file:
# Attach the file with filename to the email
msg.attach(MIMEApplication(file.read(), Name=FILE_NAME))
.....