parent
d4db0370b1
commit
f5369c5c2e
@ -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.
|
||||
|
||||
<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…
Reference in new issue