diff --git a/.idea/misc.xml b/.idea/misc.xml index 7a7809b..59934d8 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,4 +1,7 @@ + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/main.py b/app/main.py index 60f65c5..5c65050 100644 --- a/app/main.py +++ b/app/main.py @@ -4,7 +4,8 @@ import time import datetime from tkinter import Menu # Importar el widget Menu from tkinter import ttk # Importar el widget ttk - +from correo_server.EmailTab import MailTab +from correo_server.MailClient import MailClient from hilos.ChatWidget import ChatWidget from hilos.MusicPlayer import MusicPlayer from hilos.WeatherWidget import WeatherWidget @@ -17,9 +18,20 @@ from solapas.SQLQueryExecutor import SQLQueryExecutor from solapas.TicTacToe import TicTacToe from solapas.WebScraperToDB import WebScraperToDB +# Configuración del servidor de correos +smtp_server = "192.168.120.103" +smtp_port = 465 +imap_server = "192.168.120.103" +imap_port = 993 +username = "tu_usuario@psp.ieslamar.org" +password = "tu_contraseña" + # Clave de API de OpenWeatherMap API_KEY = "1fa8fd05b650773bbc3f2130657e808a" +# Crear cliente de correo +mail_client = MailClient(smtp_server, smtp_port, imap_server, imap_port, username, password) + def update_time(status_bar): """Función que actualiza la hora y el día de la semana en un label""" while True: @@ -175,13 +187,14 @@ notebook.add(tab5, text="Solapa 5", padding=4) # Añadir el widget de Web Scraper a la Solapa 5 web_scraper = WebScraperToDB(tab5) +# Crear e inicializar la pestaña de correos +email_tab = MailTab(notebook, mail_client) + # Barra de estado # Dividir la barra de estado en 4 labels - # Usar pack para alinear los labels horizontalmente label_fecha_hora = tk.Label(barra_estado, text="Hilo fecha-hora", font=("Helvetica", 14), bd=1, fg="blue", relief="sunken", anchor="w", width=20, padx=10) - label_fecha_hora.pack(side="right", fill="x", expand=True) # barra_estado.grid(row=1, column=0, columnspan=3, sticky="ew") diff --git a/correo_server/EmailTab.py b/correo_server/EmailTab.py new file mode 100644 index 0000000..33bdacf --- /dev/null +++ b/correo_server/EmailTab.py @@ -0,0 +1,80 @@ +import tkinter as tk +from tkinter import ttk, messagebox +import threading + +class MailTab: + def __init__(self, notebook, mail_client): + self.mail_client = mail_client + + # Crear el frame de la pestaña dentro del Notebook + self.frame = ttk.Frame(notebook) + notebook.add(self.frame, text="Correo") # ← Ahora esto es correcto + + # Campos de entrada para credenciales + ttk.Label(self.frame, text="Correo electrónico:").grid(row=0, column=0, sticky="e", padx=5, pady=5) + self.entry_email = ttk.Entry(self.frame, width=40) + self.entry_email.grid(row=0, column=1, padx=5, pady=5) + + ttk.Label(self.frame, text="Contraseña:").grid(row=1, column=0, sticky="e", padx=5, pady=5) + self.entry_password = ttk.Entry(self.frame, show="*", width=40) + self.entry_password.grid(row=1, column=1, padx=5, pady=5) + + self.login_button = ttk.Button(self.frame, text="Iniciar Sesión", command=self.login) + self.login_button.grid(row=2, column=1, padx=5, pady=5, sticky="e") + + # Campos para enviar correo + ttk.Label(self.frame, text="Destinatario:").grid(row=3, column=0, padx=5, pady=5, sticky="e") + self.recipient_entry = ttk.Entry(self.frame, width=40) + self.recipient_entry.grid(row=3, column=1, padx=5, pady=5) + + ttk.Label(self.frame, text="Asunto:").grid(row=4, column=0, padx=5, pady=5, sticky="e") + self.subject_entry = ttk.Entry(self.frame, width=40) + self.subject_entry.grid(row=4, column=1, padx=5, pady=5) + + ttk.Label(self.frame, text="Mensaje:").grid(row=5, column=0, padx=5, pady=5, sticky="ne") + self.body_text = tk.Text(self.frame, width=50, height=10) + self.body_text.grid(row=5, column=1, padx=5, pady=5) + + self.send_button = ttk.Button(self.frame, text="Enviar", command=self.send_email_thread) + self.send_button.grid(row=6, column=1, padx=5, pady=5, sticky="e") + + # Widgets para recibir correos + self.receive_button = ttk.Button(self.frame, text="Recibir Correos", command=self.fetch_emails_thread) + self.receive_button.grid(row=7, column=1, padx=5, pady=5, sticky="e") + + self.emails_listbox = tk.Listbox(self.frame, height=10, width=80) + self.emails_listbox.grid(row=8, column=0, columnspan=2, padx=5, pady=5) + + def login(self): + email = self.entry_email.get() + password = self.entry_password.get() + result = self.mail_client.login(email, password) + if result: + messagebox.showinfo("Inicio de Sesión", "Inicio de sesión exitoso") + else: + messagebox.showerror("Error", "Credenciales incorrectas") + + def send_email_thread(self): + threading.Thread(target=self.send_email).start() + + def send_email(self): + recipient = self.recipient_entry.get() + subject = self.subject_entry.get() + body = self.body_text.get("1.0", tk.END).strip() + result = self.mail_client.send_email(recipient, subject, body) + messagebox.showinfo("Resultado", result) + + def fetch_emails_thread(self): + threading.Thread(target=self.fetch_emails).start() + + def fetch_emails(self): + try: + result = self.mail_client.fetch_emails() + if isinstance(result, list): + self.emails_listbox.delete(0, tk.END) + for email in result: + self.emails_listbox.insert(tk.END, email[:100]) # Mostrar los primeros 100 caracteres + else: + messagebox.showerror("Error", result) + except Exception as e: + print(f"Error al recibir correos: {e}") diff --git a/correo_server/MailClient.py b/correo_server/MailClient.py new file mode 100644 index 0000000..ead2e55 --- /dev/null +++ b/correo_server/MailClient.py @@ -0,0 +1,41 @@ +import smtplib +import imaplib + +class MailClient: + def __init__(self, smtp_server, smtp_port, imap_server, imap_port, username, password): + self.smtp_server = smtp_server + self.smtp_port = smtp_port + self.imap_server = imap_server + self.imap_port = imap_port + self.username = username + self.password = password + + def send_email(self, recipient, subject, body): + """Envía un correo utilizando el servidor SMTP.""" + try: + with smtplib.SMTP_SSL(self.smtp_server, self.smtp_port) as server: + server.login(self.username, self.password) + message = f"Subject: {subject}\\n\\n{body}" + server.sendmail(self.username, recipient, message) + return "Correo enviado correctamente" + except Exception as e: + return f"Error al enviar el correo: {str(e)}" + + def fetch_emails(self): + """Obtiene los correos más recientes utilizando el servidor IMAP.""" + try: + with imaplib.IMAP4_SSL(self.imap_server, self.imap_port) as server: + server.login(self.username, self.password) + server.select("inbox") + status, messages = server.search(None, "ALL") + email_ids = messages[0].split() + emails = [] + + for email_id in email_ids[-5:]: # Obtener los últimos 5 correos + status, msg_data = server.fetch(email_id, "(RFC822)") + for response_part in msg_data: + if isinstance(response_part, tuple): + emails.append(response_part[1].decode()) + return emails + except Exception as e: + return f"Error al recibir correos: {str(e)}" diff --git a/correo_server/__init__.py b/correo_server/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/correo_server/__pycache__/EmailTab.cpython-313.pyc b/correo_server/__pycache__/EmailTab.cpython-313.pyc new file mode 100644 index 0000000..55a0012 Binary files /dev/null and b/correo_server/__pycache__/EmailTab.cpython-313.pyc differ diff --git a/correo_server/__pycache__/MailClient.cpython-313.pyc b/correo_server/__pycache__/MailClient.cpython-313.pyc new file mode 100644 index 0000000..d1a239a Binary files /dev/null and b/correo_server/__pycache__/MailClient.cpython-313.pyc differ diff --git a/correo_server/__pycache__/__init__.cpython-313.pyc b/correo_server/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000..ddb5078 Binary files /dev/null and b/correo_server/__pycache__/__init__.cpython-313.pyc differ diff --git a/hilos/__pycache__/ChatWidget.cpython-313.pyc b/hilos/__pycache__/ChatWidget.cpython-313.pyc index 8359f65..71334b2 100644 Binary files a/hilos/__pycache__/ChatWidget.cpython-313.pyc and b/hilos/__pycache__/ChatWidget.cpython-313.pyc differ