0 votos

Problemas con los caracteres especiales al extraer el correo

Estoy usando este script para guardar un correo desde la aplicación Apple Mail:

tell application "Mail"

    # take the selected Mail
    set selectedMessages to selected messages of message viewer 0
    set mailToSave to first item of selectedMessages

    set resultFile to (choose file name with prompt "Speichere E-Mail unter ..." 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

        -- Convert the file to a string
        set theFile to theFile as string

        -- Open the file for writing
        set theOpenedFile to open for access file theFile with write permission

        -- Clear the file if content should be overwritten
        if overwriteExistingContent is true then set eof of theOpenedFile to 0

        -- Write the new content to the file
        write theText to theOpenedFile starting at eof

        -- Close the file
        close access theOpenedFile

        -- Return a boolean indicating that writing was successful
        return true

        -- Handle a write error
    on error

        -- Close the file
        try
            close access file theFile
        on error errMsg
            log errMsg
        end try

        -- Return a boolean indicating that writing failed
        return false
    end try
end writeTextToFile

En la mayoría de los casos funciona perfectamente, pero en algunos casos los caracteres especiales se rompen en el archivo exportado. Por ejemplo:

Un correo se muestra correctamente en Mail. Si abro el origen de este correo me sale esto:

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

...

für Sie ...

En Mail el texto se muestra correctamente como für Sie ... .

El archivo exportado contiene:

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 arrastro y suelto este correo desde Apple Mail, se guarda correctamente. ¿Hay alguna manera de lograr esto con AppleScript?

2voto

Lupurus Puntos 141

He descubierto una manera propia, ya que ahora estoy usando JavaScript:

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

Para obtener el resultado final, necesito guardarlo como una cadena UTF-8, lo que sólo funciona con NSString :

writeTextToFile(newFilePath.toString(), newSource);

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

    // convert to NSPath
    var nsPath = $(pathString).stringByStandardizingPath

    // write File
    var success = nsString.writeToFileAtomicallyEncodingError(nsPath, false, $.NSUTF8StringEncoding, null)

    if (!success) {
        throw new Error("Write failed. ERROR: Writing to file failed.\nPath: " + pathString)
    }

    return success
}

0voto

Mockman Puntos 16

Yo especularía que el correo electrónico original fue convertido (o se origina como tal) a una codificación de Windows (por ejemplo, algo-1252) que luego Mail convirtió a utf-8.

No se puede ver -que yo sepa- lo que ocurre en el editor de script pero sí se podría si se utiliza La sonrisa de Satimage que tiene dos comandos internos : unicode number y unicode character . Por desgracia, no parecen ser portátiles.

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

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

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

Con la satimage osax instalado, puede utilizar el readtext y writetext comandos para guardar en un archivo en una codificación diferente y luego obtener su contenido.

use scripting additions -- specifically Satimage.osax must be installed
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"

En caso de que prefiera trabajar con el texto en línea, entonces se requieren otras herramientas. Si lo tomamos fuera de applescript y lo examinamos en el shell usando iconv podemos ver algunos de los detalles sórdidos. NB Obviamente no sé qué codificación de texto es realmente responsable, pero voy a suponer que es 'Windows-1252' y como 'cp1252' es sinónimo y más corto, voy a usar eso.

Esto toma el carácter esperado y lo convierte de CP-1252 a UTF-8.

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

Mi opinión es que alguna parte de la infraestructura a lo largo del camino (por ejemplo, el cliente de correo que envía, el servidor de correo, la puerta de enlace que interviene) está tratando el texto como si estuviera codificado en Windows. Luego, otra pieza (por ejemplo, su servidor de correo o cliente) lo está tratando como utf-8, y el resultado es un desastre.

Esto probablemente no funcione en todos los escenarios (porque podría ocurrir más de una conversión en el camino) pero en este caso, una sola transformación es suficiente.

Actualización: Dado que estás escribiendo en un archivo, probablemente lo más fácil sea hacer que iconv lea el archivo directamente.

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

Así que si puedes poner el texto corrupto en una variable, es sencillo conseguir que el shell lo procese.

Me inspiré en esta útil respuesta https://stackoverflow.com/a/14985394/7410243 . Espero que mi uso de la terminología aquí sea razonablemente correcto.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X