El envío de la salida del script FreeBSD por correo electrónico pierde formato (alineado a la izquierda y alineado a la derecha en una línea)

El envío de la salida del script FreeBSD por correo electrónico pierde formato (alineado a la izquierda y alineado a la derecha en una línea)

Todos los días ejecuto un script en mi enrutador para verificar el uso del tráfico de un servidor específico. El script funciona bien y con esta parte de salida del script, obtengo el siguiente resultado:

#Give output
printf "Traffic Report for all Servers"; printf "%10s\n"
echo -e ""
printf "## Traffic Server 1 ##"; printf "%10s\n"
echo "--------------------------------------"
printf "Traffic User1 :"; printf "%15s\n" "1200.00 GB"
printf "Traffic Client123:"; printf "%12s\n" "385.00 GB"
printf "Traffic Max:"; printf "%18s\n" "0 GB"
printf "Traffic Smith:"; printf "%16s\n" "987.00 GB"
printf "Traffic Johanna:"; printf "%14s\n" "30.00 GB"
printf "Traffic Other:"; printf "%16s\n" "8.97 GB"
echo "--------------------------------------"
printf "Traffic Gesamt DE:"; printf "%12s\n" "1524.00 GB"
printf "Traffic Quota DE:"; printf "%13s\n" "2000.00 GB"
printf "Traffic Rest DE:"; printf "%14s\n" "500.00 GB"
Traffic Report for all Servers

## Traffic Server 1 ##
--------------------------------------
Traffic User1 :     1200.00 GB
Traffic Client123:   385.00 GB
Traffic Max:              0 GB
Traffic Smith:       987.00 GB
Traffic Johanna:      30.00 GB
Traffic Other:         8.97 GB
--------------------------------------
Traffic Gesamt DE:  1524.00 GB
Traffic Quota DE:   2000.00 GB
Traffic Rest DE:     500.00 GB

Hasta ahora todo está correcto, exactamente quiero ver este resultado. Pero si uso el script para enviar este resultado por correo electrónico con ssmtp

    #!/bin/sh
    #set -x
    
    #Give output
    {
    printf "Traffic Report for all Servers"; printf "%10s\n"
    echo -e ""
    printf "## Traffic Server 1 ##"; printf "%10s\n"
    echo "--------------------------------------"
    printf "Traffic User1 :"; printf "%15s\n" "1200.00 GB"
    printf "Traffic Client123:"; printf "%12s\n" "385.00 GB"
    printf "Traffic Max:"; printf "%18s\n" "0 GB"
    printf "Traffic Smith:"; printf "%16s\n" "987.00 GB"
    printf "Traffic Johanna:"; printf "%14s\n" "30.00 GB"
    printf "Traffic Other:"; printf "%16s\n" "8.97 GB"
    echo "--------------------------------------"
    printf "Traffic Gesamt DE:"; printf "%12s\n" "1524.00 GB"
    printf "Traffic Quota DE:"; printf "%13s\n" "2000.00 GB"
    printf "Traffic Rest DE:"; printf "%14s\n" "500.00 GB"
    } | ssmtp -F Sender [email protected]
    #End

el resultado se ve totalmente diferente, como la salida en el terminal.

Traffic Report for all Servers
 
## Traffic Server 1 ##
--------------------------------------
Traffic User1 :    1200.00 GB
Traffic Client123:   385.00 GB
Traffic Max:           0 GB
Traffic Smith:     987.00 GB
Traffic Johanna:     30.00 GB
Traffic Other:       8.97 GB
--------------------------------------
Traffic Gesamt DE:  1524.00 GB
Traffic Quota DE:  2000.00 GB
Traffic Rest DE:   500.00 GB

Es extraño, acabo de descubrir que si copio el texto del correo electrónico en este cuadro de texto aquí, el texto está correctamente alineado, pero simplemente lo veo en el correo electrónico como se muestra arriba.

¿Alguien tiene una idea de cómo conseguir que el resultado tenga el mismo estilo que el del correo electrónico? Gracias

Respuesta1

Es extraño, acabo de descubrir que si copio el texto del correo electrónico en este cuadro de texto aquí, el texto está correctamente alineado, pero simplemente lo veo en el correo electrónico como se muestra arriba.

El texto es texto plano donde el "formateo" se realiza mediante espacios consecutivos. No hay información de que alguna parte deba alinearse a la derecha. Sólo hay espacios que preceden a la parte derecha. Los espacios hacen que se alinee muy bien a la derecha si la fuente es unafuente de ancho fijo.

Los terminales y emuladores de terminales suelen utilizar fuentes de ancho fijo. De esta forma no sólo se podrá visualizar correctamente un texto como el tuyo; cajas simplesPuede ser dibujadomc, se pueden dibujar diseños más complejos (como la interfaz de ). Si se representa un carácter de diferente ancho, puede romper el diseño (ejemplo).

Los programas GUI que funcionan con código usan fuentes de ancho fijo (porque la sangría, las cadenas y el código en general se ven mejor de esta manera, lo sabemos por experiencia), pero los programas GUI de propósito general generalmente usan fuentes de ancho variable (porque la literatura se ve mejor así). forma). Aparentemente su cliente de correo electrónico utiliza una fuente de ancho variable para mostrarle texto sin formato.

En el correo electrónico en cuestión están todos los espacios; si pega el texto en una terminal, se alineará correctamente; el problema es que los espacios no son tan anchos como las letras y los dígitos (y algunas letras no son tan anchas como otras) cuando ves el correo electrónico.

Podemos ver la diferencia incluso aquí 1 . Este sitio utiliza una fuente de ancho fijo para bloques de código:

Example 1
Traffic Client123:   385.00 GB
Traffic Max:              0 GB

Utiliza una fuente de ancho variable para el texto:

Ejemplo 2
Tráfico Cliente123: 385,00 GB
Tráfico máximo: 0 GB

Puede ser incluso peor. En el ejemplo 2, reemplacé los espacios ASCII regulares con espacios que no se separan porque el sitio trata los espacios regulares consecutivos como uno solo y si no lo contrarresto, se vería así:

Ejemplo 3
Cliente de tráfico 123: 385,00 GB
Tráfico máximo: 0 GB

Su cliente de correo electrónico probablemente no compacta espacios consecutivos, representa el texto como en el ejemplo 2. Aun así, la alineación no es como en el ejemplo 1.

Configure su cliente de correo electrónico para utilizar una fuente de ancho fijo para texto sin formato. Si no puede o no quiere, deberá pegar el texto desalineado de los correos electrónicos en un editor de texto para disfrutar de la alineación. Puede ser un editor GUI, si está configurado para utilizar una fuente de ancho fijo; o básicamente cualquier editor de texto en un emulador de terminal (a menos que su emulador de terminal esté configurado para usar una fuente de ancho variable, esto es poco probable).

Alternativamente, si su cliente de correo electrónico puede representar correos electrónicos formateados como HTML, modifique su secuencia de comandos para enviar HTML en lugar de texto sin formato. Creo que puedes especificar la fuente en HTML (obviamente en este caso quieres una fuente de ancho fijo); o puede alinear usando directivas, no espacios. Realmente no sé HTML pero encontré esto:¿Cómo puedo alinear el texto a la izquierda y el texto a la derecha en la misma línea?Tenga en cuenta que sus opciones están limitadas por lo que su cliente de correo electrónico pueda interpretar.


1 Diferentes navegadores en diferentes sistemas pueden usar diferentes fuentes; Además, se puede configurar un navegador para utilizar una fuente diferente a la del sitio solicitado. Por lo tanto, es posible que veas o no mis ejemplos de la manera que pretendía. Por si acaso, la siguiente captura de pantalla muestra los ejemplos tal como deben verse (haga clic para verlos en tamaño completo):

examples as screenshot

información relacionada