import tkinter as tk
from tkinter import filedialog, messagebox
import pandas as pd
from datetime import datetime, timedelta
import smtplib
from datetime import datetime
import sys
from email.mime.text import MIMEText
from email.header import Header
from email.utils import formataddr
from email.message import EmailMessage
from  io  import  StringIO 
from  email.generator  import  Generator


current_date = datetime.now().date()
target_date = datetime(2023, 8, 20).date()

if current_date >= target_date:
    messagebox.showinfo("Пробный период истек", "Для приобретения свяжитесь <PRESIDIO_ANONYMIZED_PHONE_NUMBER>, <PRESIDIO_ANONYMIZED_PHONE_NUMBER>")
    sys.exit()
else:

    def process_excel_file():
        # Открытие диалогового окна для выбора файла Excel
        filepath = filedialog.askopenfilename(filetypes=[("Excel Files", "*.xlsx")])
        
        # Загрузка файла Excel
        df = pd.read_excel(filepath)
        
        # Формат даты в столбце Excel (dd//mm/yy)
        date_format = "%d/%m/%y"

        # Текущая дата
        today = datetime.now().date()
        
        # Вычисление разницы дат и фильтрация строк
        df["Срок исполнения"] = pd.to_datetime(df["Срок исполнения"], format=date_format)
        df["Разница"] = df["Срок исполнения"].apply(lambda x: (today - x.date()).days)
        filtered_df = df.loc[df["Разница"] <= 3]

        # Создание нового столбца с информацией о разнице и имени
        filtered_df["Информация"] = filtered_df.apply(lambda row: f"На исполнение поручения осталось {row['Разница']} дней , поручение {row['Номер']}", axis=1)
        
        # Сохранение отфильтрованных данных в новый файл Excel
        output_file = "новый_файл.xlsx"
        filtered_df.to_excel(output_file, index=False)

         # Отправка уведомления по электронной почте
        send_email_notification(filtered_df["email"].tolist())
        
        # Отправка уведомления по электронной почте
        send_email_notification(filtered_df["Информация"].tolist())
               
        # Вывод сообщения об успешном сохранении
        messagebox.showinfo("Успех", "Файл успешно сохранен и отправлен по электронной почте!")

    def send_email_notification(emails):
        # Настройки SMTP-сервера и отправителя
        smtp_server = "smtp.gmail.com"
        smtp_port = 465
        sender_email = "tishenkoevgenii.95@gmail.com"
        sender_password = "cmejejqsvffirxsb"
      
        # Формирование email-сообщения
        subject = "Уведомление"
        body = "\n".join(emails)
        message = MIMEText(body, 'plain', 'utf-8')
        message['Subject'] = Header(subject, 'utf-8')
        message['From'] = formataddr(("Сообщение из канцелярии", sender_email))
        message['To'] = ", ".join(emails)
                
        try:
            msg_str = StringIO()
            g = Generator(msg_str)
            g.flatten(message)
            
            server = smtplib.SMTP_SSL(smtp_server, smtp_port)
            server.ehlo()
            server.login(sender_email, sender_password)
            server.sendmail(sender_email, emails, msg_str.getvalue())
            server.quit()
            print("Сообщение успешно отправлено!")
        except Exception as e:
            print("Ошибка при отправке сообщения:", str(e))

    # Создание главного окна
    window = tk.Tk()
    # Установка размера окна при запуске
    window.geometry("350x150")
    window.title("Уведомление на почту")

    # Создание кнопки "Выбрать файл" и привязка функции к ней
    choose_file_btn = tk.Button(window, text="Выбрать файл", command=process_excel_file)
    choose_file_btn.pack(anchor='center')

    # Создание кнопки "Отправить почту" и привязка функции к ней
    send_email_btn = tk.Button(window, text="Отправить почту", command=lambda: send_email_notification(["email@example.com"]))
    send_email_btn.pack(anchor='center')

    label = tk.Label(window, text="Собственность Тищенко Е.А. 2023")
    label.pack(anchor='s')

    # Запуск главного цикла окна
    window.mainloop()

Ошибка при отправке сообщения: 'ascii' codec can't encode characters in position 9-10: ordinal not in range(128)