Gestionar carpetas en el servidor IMAP en Python
Listar carpetas IMAP
Recuperar información de carpetas de un servidor IMAP es sencillo con Aspose.Email. Sigue los pasos a continuación para obtener y trabajar con los detalles de las carpetas:
- Usa el método list_folders() de Aspose.Email ImapClient clase. Este método devuelve una instancia de ImapFolderInfoCollection, que contiene detalles de todas las carpetas.
- Iterar a través del ImapFolderInfoCollection objeto para acceder a la información de carpetas individuales.
- Obtener subcarpetas (opcional). El método list_folders() está sobrecargado. Puedes pasar un nombre de carpeta como parámetro para obtener una colección de subcarpetas de la carpeta especificada.
El siguiente fragmento de código muestra cómo obtener información de carpetas de un servidor IMAP usando el método Aspose.Email:
Renombrar y eliminar carpetas
Aspose.Email proporciona métodos del ImapClient clase para gestionar carpetas en un servidor de correo vía IMAP:
- Método delete_folder - elimina permanentemente la carpeta y todos los mensajes que contiene.
- Método rename_folder - cambia el nombre de la carpeta sin alterar su contenido.
El fragmento de código a continuación muestra cómo eliminar o renombrar carpetas en el servidor IMAP programáticamente:
# Delete a folder and Rename a folder
client.delete_folder("foldername")
client.rename_folder("foldername", "newfoldername")
Crear y agregar mensajes a carpetas específicas
Con la API Aspose.Email, puedes usar el MailMessage y ImapClient clases para agregar un nuevo mensaje a una carpeta. Primero, crea un MailMessage objeto especificando el asunto, remitente y destinatario. Luego, suscríbete a una carpeta y agrega el mensaje a ella. El fragmento de código a continuación muestra cómo agregar un nuevo mensaje a una carpeta:
- Inicializa el cliente IMAP usando el ImapClient clase para conectar a tu servidor de correo. Proporciona la dirección del servidor, puerto, nombre de usuario y contraseña.
- Selecciona la carpeta de destino donde deseas agregar el nuevo mensaje, como "Inbox", usando el método select_folder.
- Crear un nuevo correo electrónico usando el MailMessage clase. Especifica el remitente, destinatario, asunto y contenido del mensaje.
- Suscríbete a la carpeta usando el método subscribe_folder con el nombre de la carpeta.
- Agrega el mensaje recién creado a la carpeta seleccionada usando el método append_message, especificando el nombre de la carpeta y el objeto mensaje.
Mover mensajes entre carpetas
Aspose.Email para .NET permite mover mensajes de una carpeta de buzón a otra usando el ImapClient API. El método move_message usa el id único del mensaje y el nombre de la carpeta de destino para mover un mensaje a dicha carpeta. El siguiente fragmento de código muestra cómo mover mensajes entre carpetas:
Copiar mensajes entre carpetas
La API Aspose.Email te permite copiar mensajes de una carpeta de buzón a otra sin esfuerzo. Puedes copiar un solo mensaje o varios usando los métodos copy_message y copy_messages. El método copy_messages permite transferir múltiples mensajes de una carpeta origen a una carpeta destino dentro del buzón. A continuación se muestra un fragmento de código que demuestra cómo copiar mensajes entre carpetas:
Trabajar con carpetas de buzón de uso especial
Los buzones de uso especial son carpetas predefinidas en un sistema de correo diseñadas para manejar tipos específicos de mensajes, como Enviados, Borradores, Spam, Papelera y Archivo. La biblioteca Aspose.Email simplifica el acceso a estos buzones asociando atributos con sus roles y propósitos. Esto permite a los clientes descubrir y mostrar automáticamente estas carpetas sin necesidad de intervención del usuario.
El siguiente fragmento de código muestra cómo obtener información sobre los buzones de uso especial clave (Inbox, Drafts, Junk, Sent y Trash) usando las propiedades de ImapMailBoxInfo clase e imprimir los detalles:
import aspose.email as ae
client = ae.clients.imap.ImapClient("imap.domain.com", 993, "user@domain.com", "pwd", ae.clients.SecurityOptions.SSL_IMPLICIT)
mailboxInfo = client.mailbox_info
print(mailboxInfo.inbox)
print(mailboxInfo.draft_messages)
print(mailboxInfo.junk_messages)
print(mailboxInfo.sent_messages)
print(mailboxInfo.trash)
Acceder a carpetas y leer mensajes recursivamente
ImapClient utiliza el método recursivo para listar carpetas y subcarpetas del servidor IMAP. Este método también se usa para leer y guardar mensajes en el disco local en formato MSG. Tanto carpetas como mensajes se crean y guardan en la misma estructura jerárquica que aparecen en el servidor IMAP. A continuación se muestra un fragmento de código que demuestra cómo recuperar carpetas y mensajes de forma recursiva:
import aspose.email as ae
import os
# Recursive method to get messages from folders and sub-folders
def list_messages_in_folder(folder_info, root_folder, client):
# Create the folder on disk (same name as on the IMAP server)
current_folder = os.path.join(root_folder, folder_info.name)
os.makedirs(current_folder, exist_ok=True)
# Read the messages from the current folder, if it is selectable
if folder_info.selectable:
# Send a status command to get folder info
folder_info_status = client.get_folder_info(folder_info.name)
print(
f"{folder_info_status.name} folder selected. New messages: {folder_info_status.new_message_count}, "
f"Total messages: {folder_info_status.total_message_count}"
)
# Select the current folder and list messages
client.select_folder(folder_info.name)
msg_info_coll = client.list_messages()
print("Listing messages....")
for msg_info in msg_info_coll:
# Get subject and other properties of the message
print("Subject:", msg_info.subject)
print(
f"Read: {msg_info.is_read}, Recent: {msg_info.recent}, Answered: {msg_info.answered}"
)
# Get rid of characters like ? and :, which should not be included in a file name
# Save the message in MSG format
file_name = (
msg_info.subject.replace(":", " ").replace("?", " ")
+ "-"
+ str(msg_info.sequence_number)
+ ".msg"
)
msg = client.fetch_message(msg_info.sequence_number)
msg.save(
os.path.join(current_folder, file_name),
ae.SaveOptions.default_msg_unicode,
)
print("============================\n")
else:
print(f"{folder_info.name} is not selectable.")
try:
# If this folder has sub-folders, call this method recursively to get messages
folder_info_collection = client.list_folders(folder_info.name)
for subfolder_info in folder_info_collection:
list_messages_in_folder(subfolder_info, root_folder, client)
except Exception:
pass
client = ae.clients.imap.ImapClient("imap.domain.com", 993, "user@domain.com", "pwd", ae.clients.SecurityOptions.SSL_IMPLICIT)
try:
# The root folder (which will be created on disk) consists of host and username
root_folder = f"{client.host}-{client.username}"
# Create the root folder and list all the folders from the IMAP server
os.makedirs(root_folder, exist_ok=True)
folder_info_collection = client.list_folders()
for folder_info in folder_info_collection:
# Call the recursive method to read messages and get sub-folders
list_messages_in_folder(folder_info, root_folder, client)
except Exception as ex:
print("\n", ex)
print("\nDownloaded messages recursively from IMAP server.")
Usar MultiConnection para operaciones masivas de carpetas
Aspose.Email permite configurar el cliente para establecer múltiples conexiones simultáneas al servidor IMAP. No necesariamente incrementa el rendimiento, pero es una solución confiable para operaciones concurrentes. Esto es especialmente útil si el cliente necesita realizar múltiples tareas al mismo tiempo, como obtener diferentes carpetas de correo, sincronizar grandes cantidades de datos o procesar múltiples mensajes simultáneamente.
El fragmento de código a continuación muestra cómo establecer múltiples conexiones al servidor IMAP mientras se cargan una colección de mensajes de correo usando el método ‘append_messages’ del ImapClient clase:
import aspose.email as ae
client = ae.clients.imap.ImapClient("imap.domain.com", 993, "user@domain.com", "pwd", ae.clients.SecurityOptions.SSL_IMPLICIT)
client.connections_quantity = 5
client.use_multi_connection = ae.clients.MultiConnectionMode.ENABLE
client.append_messages(messages)