単純SMTPクライアント

 別稿でも述べたように、戸田は確たる意図に基づいて「unix系OS上の原始的なメール環境」を使い続けており、POPサーバへアクセスしにいくメール環境も自作ソフトで実現しています。 一方、メール送信はunix伝統標準の「mailx」や「mail」で雛形を作ってエディタで編集し、sendmail/postfixのコマンドモード(非デーモンモード)で送っていました。 しかし、将来的にサーバ機能を有しない環境から直接メールを送信する必要が生じる可能性も高いので、sendmail/postfixのような高度な機能を有さない単純なSMTPクライアントを作って運用してみました。 そして、安定的に動作していると認められるに至ったので、公表することにしました。

「単純SMTPクライアント」のダウンロード

構成・動作環境

 独立に動作する3つのプログラムで構成されており、各々単独でコンパイル・リンクすると、コマンドとして動作する実行プログラムが生成されます。

smtpsend.c
メールデータとして与えられたファイルの内容から宛先を抽出し、それに従ってメールを送信する (「sendmail -t」に相当)
smtpxfer.c
メールデータとして与えられたファイルを、そのまま指定された宛先にメールとして送信する (「-t」を付けないsendmailに相当)
chksend.c
メールデータを送信する前に、中に含まれる宛先データが正常かどうかをチェックする

 socketライブラリがサポートされていれば基本的には使えるハズです(chksend.cには不要)。 popmailにおけるsocketライブラリの使い方を踏襲しているので、同じ動作環境で使えると思われます。 なお、smtpsend.cは一時ファイルの確保にtmpfile関数を使っているので、その動作に依存します。 また、getpid関数が要求するインクルードライブラリの関係で、linux以外のunix系環境では微修正が必要かもしれません。

 smtpsend.cとsmtpxfer.cは冒頭のプリプロセッサ変数「SMTPAUTH」を有効化してコンパイル・リンクすると、SMTP-AUTHでメールを送信します。

動作仕様など

 コマンドラインで動作の全てが決まります。 環境変数は一切参照しません。 設定ファイルも存在しません。 ソースファイルのファイル名をそのままコマンド名とした場合、

smtpsend [-v] 直接送信先 自ホスト名 発信者名 [送信メールファイル]
smtpxfer [-v] 直接送信先 自ホスト名 発信者名 宛先 [送信メールファイル]
chksend [送信メールファイル]
という書式になります。 SMTP-AUTH対応でコンパイルした場合、「直接送信先」の直後に認証用の「アカウント」と「パスワード」を入れる必要があります。

直接送信先
「リレーホスト=relay host」のこと (メールを直接送るSMTPサーバで、宛先に基づいてMXデータを検索して次の送信先を決定する作業は、このサーバに任せる)
自ホスト名
「直接送信先」への接続に際して名乗るホスト名 (通常、最初に付加されるReceived:ヘッダに、このホスト名がIPアドレスおよびIPアドレスから逆引きしたホスト名と共に記録される)
発信者名
「Envelope-From」のこと (配信エラー等に際してのエラーメールの送信先で、メールヘッダにも「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対応でコンパイルした場合、コマンドラインの情報に基づいてユーザ認証を行います。 AUTH PLAINのみに対応しています。 一応の動作確認はしていますが、あまり使い込んでいないので、御承知おきください。

2018年7月23日に、SMTP-AUTH対応時にオペランドの不足を正しくチェックできないバグを修正しました。

宛先アドレスの「実名情報」に「引用符で囲まれた“,”(カンマ)」が含まれている場合にアドレスを正しく分離できないバグがあります。 chksendで事前検査して宛先を書き換えることで対応しているため、修正していません。


2018年7月20日初稿/2019年7月31日最終改訂
戸田孝の雑学資料室へ戻る
Copyright © 2018 by TODA, Takashi