0 votes

Problèmes avec les caractères spéciaux lors de l'extraction de courrier

Je suis en train d'utiliser ce script pour enregistrer un e-mail à partir de l'application Apple Mail:

tell application "Mail"

    # prendre le Mail sélectionné
    set selectedMessages to selected messages of message viewer 0
    set mailToSave to first item of selectedMessages

    set resultFile to (choose file name with prompt "Enregistrer l'e-mail sous ..." default name "Mail.eml") as rich text
    if resultFile does not end with ".eml" then set resultFile to resultFile & ".eml"

    my writeTextToFile(source of mailToSave, resultFile, true)

end tell

on writeTextToFile(theText, theFile, overwriteExistingContent)
    try

        -- Convertir le fichier en une chaîne de caractères
        set theFile to theFile as string

        -- Ouvrir le fichier en écriture
        set theOpenedFile to open for access file theFile with write permission

        -- Effacer le fichier si le contenu doit être écrasé
        if overwriteExistingContent is true then set eof of theOpenedFile to 0

        -- Écrire le nouveau contenu dans le fichier
        write theText to theOpenedFile starting at eof

        -- Fermer le fichier
        close access theOpenedFile

        -- Renvoyer un booléen indiquant que l'écriture a réussi
        return true

        -- Gérer une erreur d'écriture
    on error

        -- Fermer le fichier
        try
            close access file theFile
        on error errMsg
            log errMsg
        end try

        -- Renvoyer un booléen indiquant que l'écriture a échoué
        return false
    end try
end writeTextToFile

Dans la plupart des cas, cela fonctionne parfaitement, mais dans certains cas, les caractères spéciaux sont corrompus dans le fichier exporté. Par exemple:

Un e-mail est affiché correctement dans Mail. Si j'ouvre la source de cet e-mail, je vais obtenir ceci:

MIME-Version: 1.0
Content-Disposition: inline
Content-Transfer-Encoding: 8bit
Content-Type: text/plain; charset="UTF-8"
X-Mailer: .......

...

für Sie ...

Dans Mail, le texte est correctement affiché en tant que für Sie ....

Le fichier exporté contient:

MIME-Version: 1.0
Content-Disposition: inline
Content-Transfer-Encoding: 8bit
Content-Type: text/plain; charset="UTF-8"
X-Mailer: ...

...

fÌ1Ú4r Sie ...

Si je fais glisser et déposer cet e-mail hors d'Apple Mail, il est enregistré correctement. Y a-t-il un moyen de réaliser ceci avec AppleScript?

2voto

Lupurus Points 241

J'ai trouvé un moyen d'y parvenir en utilisant désormais JavaScript:

var source = mailToSave.source();
var newSource = decodeURIComponent(escape(source));

Pour obtenir le résultat final, je dois le sauvegarder en tant que chaîne UTF-8, ce qui ne fonctionne qu'avec NSString:

writeTextToFile(newFilePath.toString(), newSource);

function writeTextToFile(pathString, textToWrite) { 
    // convertir en NSString
    var nsString = $.NSString.alloc.initWithUTF8String(textToWrite)

    // convertir en NSPath
    var nsPath = $(pathString).stringByStandardizingPath

    // écrire dans le fichier
    var success = nsString.writeToFileAtomicallyEncodingError(nsPath, false, $.NSUTF8StringEncoding, null)

    if (!success) {
        throw new Error("L'écriture a échoué. ERREUR: Échec de l'écriture dans le fichier.\nChemin: " + pathString)
    }

    return success
}

0voto

Mockman Points 847

Je spéculerais que l'e-mail original a été converti (ou provient tel quel) en une codification Windows (par exemple quelque chose-1252) que Mail a ensuite converti en utf-8.

Vous ne pouvez pas voir -à ma connaissance- ce qui se passe dans l'éditeur de script mais vous pourriez si vous utilisez Smile de Satimage qui a deux commandes internes : unicode number et unicode character. Hélas, ils ne semblent pas portables.

unicode number "für"
--> {102, 252, 114}

unicode number "für" encoding «class utf8»
--> {102, 195, 188, 114}

unicode character {195, 188}
--> "ü"

Avec l' osax satimage installé, vous pouvez utiliser les readtext et writetext commandes pour enregistrer dans un fichier avec un encodage différent puis obtenir son contenu.

use scripting additions -- en particulier Satimage.osax doit être installé
set sText to "für Sie"
set pd to ((path to desktop) as text)
writetext sText to file (pd & "brk2.txt")

set au1 to readtext file (pd & "brk2.txt") encoding "UTF-8"
--> "für Sie"
writetext au1 to file (pd & "fixed.txt") encoding "windows-1252"
readtext file (pd & "fixed.txt")
--> "für Sie"

Si vous préférez travailler avec le texte en ligne, d'autres outils sont nécessaires. Si nous le sortons d'AppleScript et l'examinons dans le shell en utilisant iconv, nous pouvons voir certains des détails sordides. NB Évidemment, je ne sais pas quel encodage de texte est réellement responsable mais je suppose que c'est 'WINDOWS-1252' et comme 'cp1252' est synonyme et plus court, je l'utiliserai.

Cela prend le caractère attendu et le convertit de CP-1252 en UTF-8.

% echo 'ü' | iconv -f cp1252 -t utf-8
--> ü

Je suppose qu'un morceau de l'infrastructure quelque part (par exemple, l'envoi d'un client de messagerie, le serveur de messagerie, une passerelle intervenante) traite le texte comme étant codé en Windows. Ensuite, un autre morceau (par exemple, votre serveur ou client de messagerie) le traite comme utf-8, et le résultat est un désordre.

Cela ne fonctionnera probablement pas dans tous les scénarios (parce qu'il pourrait y avoir plus d'une conversion en route) mais dans ce cas, une seule transformation suffit.

Mise à jour: Étant donné que vous écrivez dans un fichier, il est probablement plus facile de laisser iconv lire le fichier directement.

set pdk to ((path to desktop) as text) & "deskfil.txt"
set pf to POSIX path of pdk
do shell script "iconv -t cp1252 -f utf-8 " & pf

Donc, si vous pouvez mettre le texte corrompu dans une variable, il est simple de demander au shell de le traiter.

J'ai trouvé l'inspiration de cette réponse utile https://stackoverflow.com/a/14985394/7410243. J'espère que mon utilisation de la terminologie ici est raisonnablement correcte.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X