10 KiB
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.
CÓDIGO FUENTE:
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()