Starbug1 Windows版でメール送信ができない問題
Starbug1のWindows版ユーザの方からメールを頂いて、メール送信ができないことに気がつきました。ありがとうございます。開発時はLinuxで、普段使っているのもFreeBSDかLinuxで動かしているので、Windows版の問題は気がつきにくいです。
stat
調べてみると、statでファイルの実行権限があるかどうか調べている部分で、拡張子がplのファイルを実行ファイルと見做していないようでした。最初、環境変数のPATHEXTに含めれば、拡張子がplのファイルも実行ファイルと見做してくれるかと思ったけど、変わらず。結局Windows版では、実行権限があるかどうかのチェックを外すことにしました。
環境変数の文字コード
その次の問題は、環境変数周り。
Starbug1のメール送信の仕組みは、hookを仕掛けることでメール送信の外部スクリプトを呼び出します。詳細は以下。
hook機能は、チケットの登録・返信完了時に外部プログラムを呼び出す機能です。
Starbug1 Official WebSite – install:hook
この時に、外部スクリプトに投稿・返信の情報を渡す方法として、環境変数を利用してました。
- 本体で、STARBUG1_CONTENTという環境変数に、json形式で情報を設定する。
- 外部スクリプトを呼び出す。
- 外部スクリプトでは、環境変数STARBUG1_CONTENTを参照して、jsonをパースすることで、情報を得る。
Linux、FreeBSDでは問題なかったのですが、Windowsでは、外部スクリプトでSTARBUG1_CONTENT環境変数から取り出す際に、文字化けしていました。どこかで無理矢理cp932に変換されてしまってるっぽい。環境変数経由で情報を渡すようにした明確な理由は忘れてしまったのですが、テンポラリファイル経由にした方が良さそうだったので、本体の方も合わせて修正しました。
- 本体で、テンポラリファイルに、json形式で情報を保存する。
- 本体で、STARBUG1_CONTENTという環境変数に、json形式で情報を設定する。(一応残しとく?検討中)
- テンポラリファイルをコマンドライン引数に指定して、外部スクリプトを呼び出す。
- 外部スクリプトでは、コマンドライン引数のファイル名のファイルを参照して、jsonをパースすることで、情報を得る。
テンポラリファイルのファイル名 mktempとmkstemp
本当は、mkstempを使えればよかったが、外部スクリプト呼び出し時にテンポラリファイルのファイル名を指定する必要があったので、しかたなくmktempでテンポラリファイル名を取得して、自分でfopenして、使い終わったら自分でfcloseするようにしました。mktemp使うと、コンパイル時に警告がでてくるのはどうにかならないのだろうか。ファイルディスクリプタから、ファイル名を取得できれば、mkstempを使うけど、シグネチャ違うのにmkstempを使えと言われても。
懸案事項
- テンポラリファイルの場所は、環境変数から取った方がいいのかと思ったが、これもLinux,FreeBSD,Windowsを考えると。。。
- そもそも、hookの仕組みもあんまり洗練されてない気がするんだよな。
次のリリースでWindows版でもちゃんとメール送信できるようになります。