From f5369c5c2ec388ea05d045462cd10fd151783ef1 Mon Sep 17 00:00:00 2001 From: sheila Date: Mon, 12 Feb 2024 11:36:04 +0000 Subject: [PATCH] Actualizar 'README.md' --- README.md | 235 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 235 insertions(+) diff --git a/README.md b/README.md index 4afa025..4016a71 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,237 @@ # InterfazEmail +En este proyecto se ha creado una interfaz para poder enviar correos electrónicos, así +como también poder ver la bandeja de entrada con los correos recibidos de un correo usuario concreto. +Al ejecutar la aplicación aparecerá una ventana principal con un menú con dos botones, uno para enviar +correo, y otro par consultar la bandeja de entrada. Al pulsar un botón u otro nos abrirá una nueva ventana, +ya sea la bandeja de entrada con el listado de correos recibidos, que mostrará solamente quién es el remitente, +el asunto del mensaje y un fragmento del contenido del mensaje. +La ventana para enviar un correo es una interfaz sencilla, donde salen etiquetas para insertar el correo electrónico +al que se desea enviar el correo, otra etiqueta con el asunto y el otra con el cuerpo del mensaje. Cada etiqueta +va acompañada de un espacio en blanco, como una cajita donde poder escribir. Si pulsamos el botón de "enviar", +se ejecutará el envío, y si ha ido bien nos saldrá un mensaje de éxito, sino, un mensaje de error. + +
+
+import tkinter as tk
+from tkinter import messagebox
+from tkinter.scrolledtext import ScrolledText  
+import smtplib
+from email.mime.multipart import MIMEMultipart
+from email.mime.text import MIMEText
+import imaplib
+import email
+
+# Ventana principal
+ventana_principal = None
+
+# Funciones para la interfaz gráfica
+def abrir_ventana_enviar_correo():
+    # Ventana para enviar correo
+    ventana_enviar = tk.Toplevel(ventana_principal)
+    ventana_enviar.title("Enviar Correo")
+
+    # Configurar el tamaño y la posición de la ventana
+    ancho_ventana = 600
+    alto_ventana = 400
+    x_ventana = ventana_principal.winfo_screenwidth() // 2 - ancho_ventana // 2
+    y_ventana = ventana_principal.winfo_screenheight() // 2 - alto_ventana // 2
+    ventana_enviar.geometry(f"{ancho_ventana}x{alto_ventana}+{x_ventana}+{y_ventana}")
+
+    # Campos para ingresar información
+    etiqueta_destinatario = tk.Label(ventana_enviar, text="Destinatario:")
+    etiqueta_destinatario.pack()
+    entrada_destinatario = tk.Entry(ventana_enviar)
+    entrada_destinatario.pack()
+
+    etiqueta_asunto = tk.Label(ventana_enviar, text="Asunto:")
+    etiqueta_asunto.pack()
+    entrada_asunto = tk.Entry(ventana_enviar)
+    entrada_asunto.pack()
+
+    etiqueta_mensaje = tk.Label(ventana_enviar, text="Mensaje:")
+    etiqueta_mensaje.pack()
+    entrada_mensaje = tk.Text(ventana_enviar, height=8, width=60)
+    entrada_mensaje.pack()
+
+    # Función para enviar correo
+    def enviar():
+        destinatario = entrada_destinatario.get()
+        asunto = entrada_asunto.get()
+        mensaje = entrada_mensaje.get("1.0", tk.END)
+
+        body = mensaje
+        enviado_por = 'test@psp.fp'
+        password = 'Abcd#1234#'
+
+
+        msg = MIMEMultipart()
+        msg['From'] = enviado_por
+        msg['To'] = destinatario
+        msg['Subject'] = asunto
+
+    
+        msg.attach(MIMEText(body, 'plain'))
+
+        try:
+            session = smtplib.SMTP('localhost', 25)
+            session.starttls()
+            session.login(enviado_por, password)
+            text = msg.as_string()
+            session.sendmail(enviado_por, destinatario, text)
+            session.quit()
+            messagebox.showinfo("Éxito", "Correo enviado correctamente")
+            ventana_enviar.destroy()
+        except Exception as e:
+            messagebox.showerror("Error", f"Error al enviar el correo: {str(e)}")
+
+    # Botón para enviar correo
+    boton_enviar = tk.Button(ventana_enviar, text="Enviar", command=enviar)
+    boton_enviar.pack()
+
+def abrir_ventana_consultar_bandeja():
+    # Ventana para mostrar la bandeja de entrada
+    ventana_bandeja = tk.Toplevel(ventana_principal)
+    ventana_bandeja.title("Bandeja de Entrada")
+
+    # Configuramos el tamaño y la posición de la ventana
+    ancho_ventana = 800
+    alto_ventana = 600
+    x_ventana = ventana_principal.winfo_screenwidth() // 2 - ancho_ventana // 2
+    y_ventana = ventana_principal.winfo_screenheight() // 2 - alto_ventana // 2
+    ventana_bandeja.geometry(f"{ancho_ventana}x{alto_ventana}+{x_ventana}+{y_ventana}")
+    
+    # Título para la bandeja de entrada
+    label_titulo = tk.Label(ventana_bandeja, text="Mi Bandeja de Entrada", font=("Courier New", 14, "bold"))
+    label_titulo.pack(pady=15)
+
+    # Este código nos servirá para consultar la bandeja de entrada de un correo de usuario concreto
+    user = 'jn@psp.fp'
+    password = 'Abcd#1234#'
+    imap_url = 'localhost'
+
+    
+    #Aquí obtenemos la bandeja de entrada de un remitente concreto
+    def search(key, value, con):  
+       result, data = con.search(None, key, '"{}"'.format(value)) 
+       return data 
+
+    def get_emails(result_bytes): 
+        msgs = [] 
+        for num in result_bytes[0].split(): 
+            typ, data = con.fetch(num, '(RFC822)') 
+            msgs.append(data) 
+        return msgs 
+
+    con = imaplib.IMAP4_SSL(imap_url)    
+    con.login(user, password)    
+    con.select('Inbox')  # Seleccionamos la bandeja de entrada para leer los correos recibidos
+    #msgs = get_emails(search('FROM', 'test@psp.fp', con))  #Aquí obtenemos la bandeja de entrada de un remitente concreto
+    msgs = get_emails(search(con))
+    
+    # Mostramos los correos en una lista
+    lista_correos = tk.Listbox(ventana_bandeja, selectmode=tk.SINGLE, height=20, width=70)
+    for msg in msgs[::-1]:
+        for sent in msg:
+            if type(sent) is tuple:
+                content = str(sent[1], 'utf-8')
+                data = str(content)
+                try:
+                    indexstart = data.find("ltr")
+                    data2 = data[indexstart + 5: len(data)]
+                    indexend = data2.find("")
+                    # En la lista que se muestra nos quedaremos solo con el remitente, el asunto y el cuerpo/contenido del mensaje
+                    remitente = email.message_from_string(content).get("From", "Desconocido")
+                    asunto = email.message_from_string(content).get("Subject", "Sin asunto")
+                    cuerpo = ""
+                    if email.message_from_string(content).is_multipart():
+                        for parte in email.message_from_string(content).walk():
+                            if parte.get_content_type() == "text/plain":
+                                cuerpo = parte.get_payload(decode=True).decode("utf-8")
+                                break
+                    else:
+                        cuerpo = email.message_from_string(content).get_payload(decode=True).decode("utf-8")
+                    # Agregamos el mensaje a la lista de correos
+                    lista_correos.insert(tk.END, f"Remitente: {remitente} | \n\nAsunto: {asunto} | \n\nMensaje: {cuerpo}")
+                    lista_correos.insert(tk.END, "")
+                except UnicodeEncodeError as e:
+                    pass
+
+    lista_correos.pack(pady=10)
+    
+    # Función para mostrar el correo seleccionado
+    def mostrar_correo_seleccionado():
+        seleccion = lista_correos.curselection()
+        if seleccion:
+            
+            # Creamos una nueva ventana para mostrar el detalle del mensaje seleccionado de la lista
+            ventana_detalle = tk.Toplevel(ventana_bandeja)
+            ventana_detalle.title("Detalles del Correo")
+
+            # Etiqueta para el remitente
+            etiqueta_remitente = tk.Label(ventana_detalle, text="Remitente:", font=("Courier New", 12, "bold"))
+            etiqueta_remitente.pack(pady=10)
+
+            # Etiqueta para el asunto
+            etiqueta_asunto = tk.Label(ventana_detalle, text="Asunto:", font=("Courier New", 12, "bold"))
+            etiqueta_asunto.pack(pady=10)
+
+            # Campo de texto para el cuerpo del mensaje
+            etiqueta_mensaje = tk.Label(ventana_detalle, text="Mensaje:", font=("Courier New", 12, "bold"))
+            etiqueta_mensaje.pack(pady=10)
+
+            # Aquí creamos espacios en blanco para inseratr los datos del remitente, asunto y mensaje
+            tk.Label(ventana_detalle, text="", font=("Courier New", 12)).pack()
+            tk.Label(ventana_detalle, text="", font=("Courier New", 12)).pack()
+            tk.Label(ventana_detalle, text="", font=("Courier New", 12)).pack()
+
+            # Configuramos el tamaño y la posición de la ventana del detalle del correo
+            ancho_ventana = 600
+            alto_ventana = 400
+            x_ventana = ventana_principal.winfo_screenwidth() // 2 - ancho_ventana // 2
+            y_ventana = ventana_principal.winfo_screenheight() // 2 - alto_ventana // 2
+            ventana_detalle.geometry(f"{ancho_ventana}x{alto_ventana}+{x_ventana}+{y_ventana}")
+            
+
+
+    # Botón para mostrar el detalle del correo seleccionado
+    boton_mostrar_detalle = tk.Button(ventana_bandeja, text="Mostrar Detalles", command=mostrar_correo_seleccionado)
+    boton_mostrar_detalle.pack()
+
+def mostrar_menu_principal():
+    global ventana_principal
+    # Configuramos la ventana principal de la interfaz para enviar o mostrar correos
+    ventana_principal = tk.Tk()
+    ventana_principal.title("Aplicación de Correo")
+    
+   # Obtenemos el tamaño de la pantalla del usuario/a para centrar la ventana
+    ancho_pantalla = ventana_principal.winfo_screenwidth()
+    alto_pantalla = ventana_principal.winfo_screenheight()
+
+    # Calculamos la posición para centrar la ventana en la pantalla
+    x = (ancho_pantalla - ventana_principal.winfo_reqwidth()) // 2 - 120
+    y = (alto_pantalla - ventana_principal.winfo_reqheight()) // 2 - 120
+
+    # Establecemos la posición de la ventana en la pantalla
+    ventana_principal.geometry(f"500x400+{x}+{y}")
+
+    # Añadimos un título antes del menú de opciones
+    label_titulo = tk.Label(ventana_principal, text="Menú consultar/enviar emails", font=("Courier New", 14, "bold"))
+    label_titulo.pack(pady=15)
+
+    # Botones del menú principal
+    boton_enviar_correo = tk.Button(ventana_principal, text="Enviar Correo", command=abrir_ventana_enviar_correo)
+    boton_enviar_correo.pack(pady=10)
+
+    boton_consultar_bandeja = tk.Button(ventana_principal, text="Consultar Bandeja de Entrada", command=abrir_ventana_consultar_bandeja)
+    boton_consultar_bandeja.pack(pady=10)
+
+    # Ejecutamos la aplicación para que se muestre la ventana
+    ventana_principal.mainloop()
+
+# Ejecutanos la aplicación para que se muestre el menú de la aplicación
+mostrar_menu_principal()
+
+
+
+