Rigenerare la lista di autocompletamento di Outlook

autocompletamento Avete perso la lista di autocompletamento di Outlook?
Ricreatela!

Capita di cambiare computer e di non ritrovarsi più la lista di completamento automatico degli indirizzi di Outlook, quindi quando si inizia a digitare un indirizzo non appare nulla se non i contatti presenti nella rubrica.

Se avete a disposizione il vecchio PC potete (a seconda delle versioni di Outlook):

  • usare l’utility di Microsoft MFCMAPI (http://mfcmapi.codeplex.com) per esportare/reimportare i dati;
  • copiare il file nk2 presente in %APPDATA%\Microsoft\Outlook nel vecchio PC ed incollarlo nel nuovo, per poi reimportarlo col comando outlook /importnk2.

Se però non fosse più disponibile il PC allora l’unica alternativa sarebbe ricreare manualmente la lista. Ma come fare?

Inserendo un finto messaggio di posta che salvi i suddetti contatti.
Per far questo è però necessario l’intervento di PowerShell per estrarre dai messaggi inviati da Outlook gli indirizzi dei nostri destinatari. Possiamo, con poche righe di script, leggere tutti i destinatari a cui abbiamo inviato un messaggio negli ultimi X giorni e salvarlo in un file di testo per poterlo poi verificare con Excel e passarlo ad Outlook.

Ecco i passaggi:

Passaggio 1 – Estrarre da Outlook i destinatari

Per estrarre la lista dei destinatari a cui abbiamo inviato messaggi nelgi ultimi 365 giorni basterà incollare il seguente script in PowerShell. Qualora si volesse impostare un intervallo di giorni più ampio basterà cambiare il valore (Get-Date).AddDays(-365) con il numero di giorni desiderato.

Add-Type -Assembly "Microsoft.Office.Interop.Outlook"
$Outlook = New-Object -ComObject Outlook.Application
$namespace = $Outlook.GetNameSpace("MAPI")
$messaggi = $namespace.GetDefaultFolder([Microsoft.Office.Interop.Outlook.OlDefaultFolders]::olFolderSentMail)
$messaggi.Items | Where-Object {$_.SentOn -gt (Get-Date).AddDays(-365)}|where {$_.to -like "*@*"}|Select-Object to -unique |sort-object -property To | Export-csv "$env:temp\indirizzi.txt" -NoTypeInformation -noclobber

oppure

# Carica l'assembly COM di Outlook
Add-Type -AssemblyName "Microsoft.Office.Interop.Outlook"

# Crea istanza Outlook e usa il profilo attivo
$outlook = New-Object -ComObject Outlook.Application
$namespace = $outlook.GetNamespace("MAPI")

Write-Host "`n✔ Profilo attivo: $($namespace.CurrentProfileName)" -ForegroundColor Cyan

# Ottiene la cartella principale "Posta Inviata"
$sentFolder = $namespace.GetDefaultFolder([Microsoft.Office.Interop.Outlook.OlDefaultFolders]::olFolderSentMail)

# Array per raccogliere indirizzi
$indirizzi = @()

# Funzione ricorsiva per esplorare cartelle e sottocartelle
function Estrai-IndirizziDaCartella($folder) {
    Write-Host "🔍 Scansione: $($folder.Name)" -ForegroundColor DarkGray

    try {
        # Ordina gli elementi per data
        $items = $folder.Items
        $items.Sort("SentOn", $false)

        # Filtra gli elementi negli ultimi 365 giorni con destinatari validi
        foreach ($item in $items) {
            if ($null -ne $item -and $item.SentOn -gt (Get-Date).AddDays(-365)) {
                if ($item.To) {
                    Write-Host "✉ [$($item.SentOn.ToShortDateString())] TO: $($item.To)" -ForegroundColor Cyan

                    $toList = $item.To -split ";" | ForEach-Object { $_.Trim() }
                    $indirizzi += $toList
                    $tolist>>$env:TEMP\indirizzi.csv
                }
            }
        }

        # Scansiona eventuali sottocartelle
        foreach ($subfolder in $folder.Folders) {
            Estrai-IndirizziDaCartella -folder $subfolder
        }
    }
    catch {
        Write-Host "⚠ Errore nella cartella '$($folder.Name)': $_" -ForegroundColor Yellow
    }
}

# Avvia la scansione ricorsiva
Estrai-IndirizziDaCartella -folder $sentFolder

# Pulisce, ordina e rimuove duplicati
$indirizziPuliti = $indirizzi |
    Where-Object { $_ -like "*@*" } |
    Select-Object -Unique |
    Sort-Object

# Percorso file output
$outputPath = "$env:TEMP\indirizzi2.txt"

# Salva su file
$indirizziPuliti | Out-File -FilePath $outputPath -Encoding UTF8 -Force

# Mostra riepilogo
Write-Host "`n📧 Totale indirizzi trovati: $($indirizziPuliti.Count)" -ForegroundColor Green
Write-Host "📁 File salvato in: $outputPath`n" -ForegroundColor Green

# Cleanup COM
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($outlook) | Out-Null
[System.GC]::Collect()
[System.GC]::WaitForPendingFinalizers()


Passaggio 2 – Formattare i destinatari con Excel

Aprire con Microsoft Excel il file %TEMP%\indirizzi.txt appena creato e cercare in esso tutti gli indirizzi che contengono voci e caratteri “anomali”; consigliamo di cercare i caratteri “(“ e “;” perchè normalmente fanno riferimento a righe errate. Si otterrà un file simile a questo:
indirizzitxt

Passaggio 3 – Creare nuovo messaggio in Outlook
Una volta ottenuta la lista Excel dei destinatari bisognerà copiare tutte le celle contenenti gli indirizzi ed incollarle nel campo A: di un nuovo messaggio di posta elettronica. Se la rimozione delle righe errate sarà stata fatta in modo corretto ci si ritroverà con un messaggio formattato in questo modo:

newmessage

Passaggio 4 – Impostare il recapito ritardato

Ora bisognerà impostare un recapito ritardato al messaggio cosìcchè lo si possa eliminare prima che venga effettivamente spedito.  Basterà aprire le opzioni del messaggio e selezionare una data molto lontana in questo modo:

recapitoritardato

A questo punto si potrà spedire il messaggio che sarà recapitato solo nel 2050. In questa fase potreste riscontrare qualche errore sui destinatari. In questo caso bisognerà correggerlo nel file Excel (quindi ritornare al passaggio n.2)

Passaggio 5 – Eliminare messaggio in Outlook

In Posta in uscita avremo il falso messaggio che potrà agevolmente essere eliminato lasciando la lista di autocomposizione finalmente correttamente compilata.

Lascia un commento qui