FreeBSD スクリプトの出力を電子メールで送信すると、フォーマットが失われます (1 行に左揃えと右揃え)

FreeBSD スクリプトの出力を電子メールで送信すると、フォーマットが失われます (1 行に左揃えと右揃え)

毎日、ルーターでスクリプトを実行して、特定のサーバーのトラフィック使用量を確認しています。スクリプトは正常に動作しており、スクリプトのこの出力部分では、次の結果が得られます。

#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

ここまではすべて正しいです。この出力を正確に見たいのですが、スクリプトを使用してこの出力を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

結果はターミナルの出力とは全く異なって見えます。

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

不思議なことに、メールのテキストをこのテキスト ボックスにコピーすると、テキストが正しく配置されることがわかりましたが、メールには上記のように表示されます。

メールと同じスタイルで出力する方法を知っている人はいますか? ありがとうございます

答え1

不思議なことに、メールのテキストをこのテキスト ボックスにコピーすると、テキストが正しく配置されることがわかりましたが、メールには上記のように表示されます。

テキストはプレーンテキストで、連続するスペースによって「書式設定」が行われます。一部を右揃えにするという情報はありません。右部分の前にスペースがあるだけです。フォントが固定幅フォント

端末や端末エミュレータは固定幅フォントを使用するのが一般的です。この方法だと、あなたのようなテキストが正しく表示されるだけでなく、単純なボックスも表示されます。描くことができるでは、より複雑なレイアウト( のインターフェースなどmc)を描画できます。異なる幅の文字がレンダリングされると、レイアウトが崩れる場合があります()。

コードを扱う GUI プログラムは固定幅フォントを使用します (インデント、文字列、コード全般の見栄えが良いため、これは経験上わかっています)。ただし、汎用 GUI プログラムは通常、可変幅フォントを使用します (文献の見栄えが良いため)。どうやら、電子メール クライアントは、プレーン テキストを表示するために可変幅フォントを使用しているようです。

問題の電子メールにはスペースがすべて含まれており、テキストを端末に貼り付けると正しく配置されます。問題は、電子メールを表示したときに、スペースが文字や数字と同じ幅ではない (一部の文字が他の文字と同じ幅ではない) ことです。

ここでも違いがわかります1。このサイトではコードブロックに固定幅フォントを使用しています。

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

テキストには可変幅フォントを使用します。

例 2
トラフィック クライアント 123: 385.00 GB
トラフィック最大: 0 GB

さらに悪い状況になることもあります。例 2 では、サイトで連続する通常のスペースが 1 つとして扱われるため、通常の ASCII スペースを非改行スペースに置き換えました。対処しないと、次のようになります。

例 3
トラフィック クライアント 123: 385.00 GB
トラフィック最大: 0 GB

電子メール クライアントは連続するスペースを圧縮しない可能性があり、例 2 のようにテキストをレンダリングします。それでも配置は例 1 のようにはなりません。

電子メール クライアントを、プレーン テキストに固定幅フォントを使用するように設定してください。それができない場合、または設定したくない場合は、電子メールから位置がずれたテキストをテキスト エディターに貼り付けて、位置合わせを行う必要があります。固定幅フォントを使用するように設定されている場合、GUI エディターでもかまいません。または、基本的にターミナル エミュレーター内の任意のテキスト エディターでもかまいません (ただし、ターミナル エミュレーター自体が可変幅フォントを使用するように設定されている場合を除いて、これはほとんどあり得ません)。

あるいは、電子メール クライアントが HTML 形式の電子メールをレンダリングできる場合は、プレーン テキストではなく HTML を送信するようにスクリプトを変更します。HTML でフォントを指定できると思います (この場合、固定幅フォントが望ましいのは明らかです)。または、スペースではなくディレクティブを使用して位置合わせすることもできます。私は HTML についてよく知りませんが、次のものを見つけました。同じ行内でテキストを左揃えと右揃えにするにはどうすればよいでしょうか?オプションは、電子メール クライアントが解釈できる内容によって制限されることに注意してください。


1異なるシステムの異なるブラウザでは、異なるフォントが使用される場合があります。また、ブラウザが、サイトが要求したフォントとは異なるフォントを使用するように設定されている場合もあります。そのため、私の例が意図したとおりに表示されるかどうかはわかりません。念のため、以下のスクリーンショットは、例が意図したとおりに表示されることを示しています (クリックするとフルサイズで表示されます)。

examples as screenshot

関連情報