rcmdnk's blog

20190430_noname_200_200

Linuxサーバーで動かしているcronジョブで問題があると メールを送る様にしているのですが、そのメールをGmailで受け取った際、 本文がないメールでnonameという名前のファイルが添付された状態になっていたので それを直したことについて。

本文内容が添付ファイルになってしまう現象

問題はmailコマンドなどでメールを送る際、 メールツールが理解できない文字が入っているとそれを 添付ファイルに変換して送る、という機能が働いてしまってるために起こったことでした。

この際作られる添付ファイルには名前が付けられてないので Gmailだとnoname、他のメールクライアントでみたらuntitled-[1].octet-streamという名前に なっているものもありました。 これらのファイルの中身を見てみると確かに送ったはずの内容になっていました。

20190430_noname.jpg

今回起こったのは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のテクニックを使う方法もあります。

linux - Use crontab job send mail, The email text turns to an attached file which named ATT00001.bin - Stack Overflow

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)は除いた状態で使う必要があります。

Sponsored Links
Sponsored Links

« MacのターミナルやiTermでOperation not permittedが出る場合の対処法 Linuxbrew改めHomebrew@Linuxでrelocation errorに対する対処法 »

}