client単純SMTPクライアント別稿でも述べたように、戸田は確たる意図に基づいて「unix系OS上の原始的なメール環境」を使い続けており、POPサーバへアクセスしにいくメール環境も自作ソフトで実現しています。メール送信はunix伝統標準の「mailx」や「mail」で雛形を作ってエディタで編集し、sendmail/postfixのコマンドモード(非デーモンモード)で送っていました。将来的にサーバ機能を有しない環境から直接メールを送信する必要が生じる可能性も高いので、sendmail/postfixのような高度な機能を有さない単純なSMTPクライアントを作って運用してみました。安定的に動作していると認められるに至ったので、公表することにしました。動作する3つのプログラムで構成されており、各々単独でコンパイル・リンクすると、コマンドとして動作する実行プログラムが生成されます。(「-t」を付けないsendmailに相当)chksend.cメールデータを送信する前に、中に含まれる宛先データが正常かどうかをチェックするsocketライブラリがサポートされていれば基本的には使えるハズです(chksend.cには不要)。popmailにおけるsocketライブラリの使い方を踏襲しているので、同じ動作環境で使えると思われます。smtpsend.cは一時ファイルの確保にtmpfile関数を使っているので、その動作に依存します。getpid関数が要求するインクルードライブラリの関係で、linux以外のunix系環境では微修正が必要かもしれません。smtpsend.cとsmtpxfer.cは冒頭のプリプロセッサ変数「SMTPAUTH」を有効化してコンパイル・リンクすると、SMTP-AUTHでメールを送信します。動作仕様などコマンドラインで動作の全てが決まります。環境変数は一切参照しません。設定ファイルも存在しません。[送信メールファイル]という書式になります。直後に認証用の「アカウント」と「パスワード」を入れる必要があります。(配信エラー等に際してのエラーメールの送信先で、メールヘッダにも「Return-Path:」として記載されるのが通例)いずれも一般には固定的情報ですが、シェルのエイリアス機能などを利用して自動的にコマンドラインに与えることを想定しています。「-v」はデバッグ用のオプションなので、通常は指定しないでください。smtpsendはメールヘッダ中の「To:」「Cc:」「Bcc:」から宛先を抽出し、そこへ送るよう指示しつつ「直接送信先」へメールを送信します。「Bcc:」の削除は行いません(「直接送信先」が削除するという前提)。メールヘッダに「Date:」「From:」「Message-Id:」が含まれない場合は追加します。「From:」の内容は「Envelope-From」に従い、「Message-Id:」は発信時刻・プロセスID・「自ホスト名」から生成します。(MS-DOSのgetpid関数はセグメントアドレスを返すので、何回実行しても同じプロセスIDになります。)メールヘッダ中の「To:」「Cc:」「Bcc:」からの宛先抽出に際して、不正な記述も無理矢理に解釈してしまうので、事前にchksendで記述が正常かどうか確認することを強く推奨します。>」で挟み、その前後に「実名情報」を付加した書式にしか対応していません(「実名情報」が空でも問題無い)。規約上は他にも正当な書式がありますが、事実上見かけないので無視しています。文末のバグ情報も参照してください。送信に際して、本文やメールヘッダ内情報(Subject:など)のコード変換は一切行いません。別にコード変換のコマンドを準備して、その出力をパイプで引き渡すことを想定しています。コード変換のコマンドは環境依存が強いので公開していません。(部分的には「unixのmailxと共に使うユーティリティ」が参考になるかもしれません。)smtpxferはメールヘッダの解釈を一切行わず、指定された宛先へ送るよう指示しつつ「直接送信先」へメールを送信します。「Date:」「From:」「Message-Id:」の追加も行いません。受信したメールを全く加工せずに他へ転送することを想定しています。SMTP-AUTH対応でコンパイルした場合、コマンドラインの情報に基づいてユーザ認証を行います。PLAINのみに対応しています。一応の動作確認はしていますが、あまり使い込んでいないので、御承知おきください。2018年7月23日に、SMTP-AUTH対応時にオペランドの不足を正しくチェックできないバグを修正しました。宛先アドレスの「実名情報」に「引用符で囲まれた“,”(カンマ)」が含まれている場合にアドレスを正しく分離できないバグがあります。chksendで事前検査して宛先を書き換えることで対応しているため、修正していません。