Linuxサーバーで動かしているcronジョブで問題があると メールを送る様にしているのですが、そのメールをGmailで受け取った際、 本文がないメールでnonameという名前のファイルが添付された状態になっていたので それを直したことについて。
本文内容が添付ファイルになってしまう現象
問題はmail
コマンドなどでメールを送る際、
メールツールが理解できない文字が入っているとそれを
添付ファイルに変換して送る、という機能が働いてしまってるために起こったことでした。
この際作られる添付ファイルには名前が付けられてないので Gmailだとnoname、他のメールクライアントでみたらuntitled-[1].octet-streamという名前に なっているものもありました。 これらのファイルの中身を見てみると確かに送ったはずの内容になっていました。
今回起こったのはssh
を使ったコネクションチェックみたいなもので、
内容としては鍵認証で失敗したとかいう無いようなのですが、
この出力の最後に^M
とCR+LFの改行コード(Windowsが使う)が付いていました。
どうやらこれが理解できずに添付ファイルにしてしまったようです。
解決策
これに対する解決策としてはこの改行コードを消してやれば良いだけ。 なので、出力を作るスクリプトに対して
make_output.sh |tr -d \\r|mail -s cron-mail [email protected]
こんな感じでtr
を使って余計な改行を消します。
これでメッセージ内容がメール本文として送られる様になります。
その他の場合
改行以外にも色々とNon-ASCIIな文字が入っている場合もあると思います。
そういった場合にはそれぞれの文字について対応するのは大変なので、 例えばUTFな日本語が入っているなら
LANG=ja_JP.utf8
をスクリプトの最初に指定するか、複数cronジョブがあってそれらすべてが同じ状況であれば
crontab -e
で開いた編集画面で一番上にこれを書いておけばこの環境で作業を行ってくれて
mail
コマンドなどでも文字を理解してそのまま本文として送ってくれる様になります。
LinuxからmailコマンドでメールするとGmailでnonameという添付ファイルになる件の対処法 · DQNEO起業日記
また、英数字などしかないのであれば、
tr -cd '\11\12\15\40-\176'
というtrのテクニックを使う方法もあります。
cd
で次のものにあたる文字以外を削除します。ここでバックスラッシュで指定されてるのは
文字の8進法でのASCIIコードです。
Ascii Table - ASCII character codes and html, octal, hex and decimal chart conversion
- \11: TAB (horizontal tab)
- \12: LF (NL line feed, new line)
- \15: CR (carriage return)
- \40-\57: Spaceや/などの記号。
- \60-\71: 0-9
- \72-\100: :などの記号
- \101-\132: A-Z
- \133-\140: [などの記号
- \141-\172: a-z
- \173-\176: {などの記号
です。
ただし、ここでこのまま使うとLFとCR両方が入ってしまうので、上記問題を解決するためには
make_output.sh |tr -cd '\11\12\40-\176'|mail -s cron-mail [email protected]
とCR(\15)は除いた状態で使う必要があります。