読者です 読者をやめる 読者になる 読者になる

M12i.

学術書・マンガ・アニメ・映画の消費活動とプログラミングについて

JP1/AJS2のメール送信ジョブのユニット定義インポートで数時間ロス

またまたJP1/AJS2でハマった話。今度はメール送信ジョブです。これは仕様というより、恐らくJP1/AJS2のユニット定義ファイルのインポート処理の不具合と思われます。

学んだこと

メール送信ジョブの本文mltxtにハイフンを含む文字列を使用すると、インポート処理(コマンドラインでもJP1/AJS2 Viewでも)がクラッシュすることがある。

[2015/12/19追記]この事象は特定文字列の問題ではなくメール本文に指定できる文字数の問題であった可能性が高い。当時のファイルがもう手元にないので確証はないが。。直近職場の同僚がこの問題に気が付いた。JP1/AJS2 Viewでは文字数制限オーバーがあった場合なんらの警告やエラーもないが代わりに文字列の末尾が勝手に切詰められる。一方インポート処理の際は処理がエラーにより中断されるが、具体的にどんなエラーであったかは一切表示されない。

学ぶまでのこと

前回のポストで取り上げた問題を解決した後、新しいエージェント・ホストのためにユニット定義の置き換えを行っていたときのことです。定義情報をエクスポートして、それを自家製のユニット定義ファイル・パースAPIを使って構築したツールでもって一括置換、再度インポートしようとしたところエラーが発生しました。

最初はもちろんツールの不具合を疑ったのですが、置換前の定義ファイルと細かに比較してみてもおかしなところは見つかりません。
置換する箇所や、置換に使用する文字列を取っ替え引っ替えしてわかったのはハイフンを含むホスト名──foobar-01のような──をmltxtに含むユニット定義ファイルだと、インポート処理がクラッシュするということです。

リファレンスではユニット定義パラメータの値について、エスケープが必要な文字は二重引用符とシャープ記号しか記載がありませんから、仕様外の動き・・・つまりはバグなのではないかと考えています:

mltxt="本文";
送信するメールの本文を定義します。
指定できる文字数は,改行を含めて1~512(単位:バイト)です。なお,UNIXの場合は,最終行に改行がないと行として成りたたないため,最終行には必ず改行が入ります。
本文中に「"(ダブルクォーテーションマーク)」や「#」が含まれる場合は,キャスト文字(#)でキャストします。「"」は「#"」,「#」は「##」と記述します。
マクロ変数を指定できます。

マクロ変数を利用できるとあるので、メール本文mltxtは単にプレーンテキストとして処理されるのではないことはたしかです。問題が潜んでいるとしたらそこらへんでしょうか。

それにしても「いくらなんでも・・・」という感じのエラー発現条件です。が、実際ハイフンなしのホスト名(もともとのホスト名)ではクラッシュは起きません。また実行ホスト名exにハイフン付きのホスト名を使う分には問題ありません。とにかくメール本文なのです。

メール本文にはもちろんホスト名以外にもいろいろの文字列が並んでいるので、トリガーとなる条件はいくつかあるのかもしれません(例えば、ハイフンと別の何かの記号がいっしょに利用されたときに発現する、など)。ただそれをしらべる時間がありませんでした。