Consigli: recuperare i file .partial.emlx

Come Recuperare i File .partial.emlx delle Mail da Apple Mail e Organizzarli in Modo Efficiente

Se hai mai dovuto recuperare email da Apple Mail, probabilmente hai incontrato i file .emlx e .partial.emlx. Questi file sono utilizzati da Mail.app per archiviare i messaggi nelle sue cartelle di sistema, ma non sono compatibili con molte altre applicazioni di posta elettronica che usano il formato .eml. In questo articolo ti mostrerò come convertire, rinominare e organizzare questi file in modo efficiente.


1. Come Recuperare e Convertire i File .partial.emlx

Per convertire i file .emlx e .partial.emlx in un formato leggibile come .eml, puoi utilizzare lo strumento partial-emlx-converter.

Installazione di partial-emlx-converter su macOS

Il modo più semplice per installare partial-emlx-converter è tramite Homebrew. Se non hai ancora Homebrew, puoi installarlo con questo comando nel terminale:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

Una volta installato Homebrew, esegui il seguente comando per installare partial-emlx-converter:

brew install qqilihq/partial-emlx-converter/partial-emlx-converter

In alternativa, se preferisci usare Node.js, puoi installarlo con:

npm install --global partial-emlx-converter

Come Usare partial-emlx-converter

Una volta installato, puoi convertire i file .emlx e .partial.emlx con il seguente comando:

partial-emlx-converter /path/to/input /path/to/output

/path/to/input è la cartella contenente i file .emlx e .partial.emlx, mentre /path/to/output è la cartella in cui vuoi salvare i file convertiti in formato .eml.


2. Rinominare i File Email Basandosi sull’Oggetto

Dopo aver convertito i file in .eml, puoi rinominarli basandoti sull’oggetto dell’email per una migliore organizzazione. A tal fine, puoi utilizzare uno script Python chiamato rename_eml.py.

Script per Rinominare le Email: rename_eml.py

import os
import email
import email.header
import quopri
import re

# Directory dove si trovano i file .eml
directory = "/path/to/output"

# Funzione per decodificare l'oggetto delle email
def decode_header_value(value):
    decoded_parts = email.header.decode_header(value)
    decoded_string = ""
    for part, encoding in decoded_parts:
        if isinstance(part, bytes):
            try:
                decoded_string += part.decode(encoding or 'utf-8', errors='ignore')
            except Exception as e:
                print(f"Errore durante la decodifica: {e}")
        else:
            decoded_string += part
    return decoded_string

# Funzione per estrarre e pulire l'oggetto
def get_subject_from_eml(eml_file):
    try:
        with open(eml_file, 'r', encoding='utf-8') as f:
            msg = email.message_from_file(f)
    except UnicodeDecodeError:
        with open(eml_file, 'r', encoding='ISO-8859-1', errors='ignore') as f:
            msg = email.message_from_file(f)

    subject = msg.get('Subject', 'unknown_subject')

    subject = decode_header_value(subject)

    if not subject.strip():
        subject = "senza_oggetto"

    subject = re.sub(r'[\\/*?:"<>|]', "_", subject)

    return subject[:80]

# Ciclo attraverso tutti i file nella directory
for filename in os.listdir(directory):
    if filename.endswith(".eml"):
        old_file = os.path.join(directory, filename)
        subject = get_subject_from_eml(old_file)
        new_file = os.path.join(directory, f"{subject}.eml")
        
        if not os.path.exists(new_file):
            try:
                os.rename(old_file, new_file)
                print(f"Rinominato: {old_file} -> {new_file}")
            except OSError as e:
                print(f"Errore durante la rinomina di {old_file}: {e}")

3. Organizzare le Email per Mittente

Il passo successivo è organizzare le email in base al mittente, creando una cartella separata per ogni indirizzo email. Puoi usare lo script move_in_from_mail_folder_eml.py per farlo.

Script per Organizzare le Email per Mittente: move_in_from_mail_folder_eml.py

import os
import email
import shutil
import re

directory = "/path/to/output"

def decode_header_value(value):
    decoded_parts = email.header.decode_header(value)
    decoded_string = ""
    for part, encoding in decoded_parts:
        if isinstance(part, bytes):
            try:
                decoded_string += part.decode(encoding or 'utf-8', errors='ignore')
            except Exception as e:
                print(f"Errore durante la decodifica: {e}")
        else:
            decoded_string += part
    return decoded_string

def get_sender_from_eml(eml_file):
    try:
        with open(eml_file, 'r', encoding='utf-8') as f:
            msg = email.message_from_file(f)
    except UnicodeDecodeError:
        with open(eml_file, 'r', encoding='ISO-8859-1', errors='ignore') as f:
            msg = email.message_from_file(f)
    
    sender = msg.get('From', 'unknown_sender')
    
    sender = decode_header_value(sender)

    if "<" in sender and ">" in sender:
        sender = sender.split("<")[1].split(">")[0]
    
    sender = re.sub(r'[\\/*?:"<>|]', "_", sender)
    
    return sender

def get_subject_from_eml(eml_file):
    subject = decode_header_value(subject)
    if not subject.strip():
        subject = "senza_oggetto"
    subject = re.sub(r'[\\/*?:"<>|]', "_", subject)
    return subject[:80]

for filename in os.listdir(directory):
    if filename.endswith(".eml"):
        old_file = os.path.join(directory, filename)
        sender = get_sender_from_eml(old_file)
        sender_dir = os.path.join(directory, sender)
        if not os.path.exists(sender_dir):
            os.makedirs(sender_dir)
        subject = get_subject_from_eml(old_file)
        new_file = os.path.join(sender_dir, f"{subject}.eml")
        if not os.path.exists(new_file):
            try:
                shutil.move(old_file, new_file)
                print(f"Spostato: {old_file} -> {new_file}")
            except OSError as e:
                print(f"Errore durante lo spostamento di {old_file}: {e}")

4. Raggruppare le Cartelle per Dominio del Mittente

Infine, puoi raggruppare le email per dominio del mittente (es. rcs.it, gmail.com) utilizzando lo script group_by_domain.py.

Script per Raggruppare le Email per Dominio: group_by_domain.py

import os
import shutil

base_directory = "/path/to/output"

def get_domain_from_email(email):
    if "@" in email:
        return email.split("@")[1]
    return None

for folder_name in os.listdir(base_directory):
    folder_path = os.path.join(base_directory, folder_name)
    if os.path.isdir(folder_path):
        domain = get_domain_from_email(folder_name)
        if domain:
            domain_folder = os.path.join(base_directory, domain)
            if not os.path.exists(domain_folder):
                os.makedirs(domain_folder)
            new_folder_path = os.path.join(domain_folder, folder_name)
            try:
                shutil.move(folder_path, new_folder_path)
                print(f"Spostato: {folder_path} -> {new_folder_path}")
            except OSError as e:
                print(f"Errore durante lo spostamento di {folder_path}: {e}")

Utilizzando questi strumenti, puoi convertire, rinominare e organizzare facilmente i tuoi file email, semplificando la gestione di grandi volumi di posta archiviata da Apple Mail.