Mavrikii
Platinum Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Kuken Цитата: Код: from openpyxl import load_workbook from datetime import datetime import smtplib import ssl INFORM_BY = (5, 1, 0) SEND_TO = 'some@email.ru' SEND_FROM = 'from@email.ru' SMTP_SERVER = '127.0.0.1' SMTP_PORT = 587 SMTP_USER = 'user@' SMTP_PASS = 'smtp_pass' def main(filename='data.xlsx'): current = datetime.now() with load_workbook(filename, data_only=True) as wb: sheet = wb["График средст измерений"] for cell in sheet['G']: cell_date = datetime.strptime(cell.value, '%d.%m.%Y') if (cell_date - current).days in INFORM_BY: send_email(sheet[cell.row]) def send_email(row): message = f"""\ Subject: This is an email subject: {row[1].value} This is a body of the message: {row[0].value} and {row[2].value}""" context = ssl.create_default_context() with smtplib.SMTP_SSL(SMTP_SERVER, SMTP_PORT, context=context) as server: server.login(SMTP_USER, SMTP_PASS) server.sendmail(SEND_FROM, SEND_TO, message) if __name__ == '__main__': main() | для работы с SSL SMTP, если через STARTTLS или иначе, вообще без защиты - поменяйте https://realpython.com/python-send-email/ запускать раз в сутки, так как не проверяет отправлено было ранее или нет и при повторном запуске в те же сутки снова отправит. не проверял, но старался написать просто. если данные отсортированы по дате (то есть не нужно все перебирать), то можно цикл остановить раньше. Код: INFORM_BY = (5, 1, 0) MAX_DAYS = max(INFORM_BY) # остальное for cell in sheet['G']: cell_date = datetime.strptime(cell.value, '%d.%m.%Y') days = (cell_date - current).days if days > MAX_DAYS: break; if days in INFORM_BY: send_email(sheet[cell.row]) | можно еще загнать отфильтрованные строки в массив, и потом установить SMTP соединение и отправить одно за другим, а не устанавливать новое соединение каждый раз - так будет быстрее. хотя зависит от количества писем и ограничения у конкретного почтового сервиса. | Всего записей: 15121 | Зарегистр. 20-09-2014 | Отправлено: 02:55 15-06-2022 | Исправлено: Mavrikii, 08:38 15-06-2022 |
|