Actualizar 'README.md'

main
sheila 7 months ago
parent d4db0370b1
commit f5369c5c2e

@ -1,2 +1,237 @@
# InterfazEmail # 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.
<pre>
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("</div>")
# 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()
</pre>

Loading…
Cancel
Save

Powered by INFORMATICA.FP.EDU.ES.