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