libmilter/mfapi.h

libmilter/mfapi.h — libmilter互換API

概要

#define             SMFI_VERSION
#define             SM_LM_VRS_MAJOR                     (version)
#define             SM_LM_VRS_MINOR                     (version)
#define             SM_LM_VRS_PLVL                      (version)
#define             MI_SUCCESS
#define             MI_FAILURE
typedef             SMFICTX;
typedef             SMFICTX_PTR;
typedef             smfiDesc_str;
typedef             smfiDesc_ptr;
typedef             sfsistat;
#define             bool
#define             true
#define             false
sfsistat            xxfi_connect                        (SMFICTX *context,
                                                         char *host_name,
                                                         _SOCK_ADDR *address);
sfsistat            xxfi_helo                           (SMFICTX *context,
                                                         char *fqdn);
sfsistat            xxfi_envfrom                        (SMFICTX *context,
                                                         char **arguments);
sfsistat            xxfi_envrcpt                        (SMFICTX *context,
                                                         char **arguments);
sfsistat            xxfi_header                         (SMFICTX *context,
                                                         char *name,
                                                         char *value);
sfsistat            xxfi_eoh                            (SMFICTX *context);
sfsistat            xxfi_body                           (SMFICTX *context,
                                                         unsigned char *data,
                                                         size_t data_size);
sfsistat            xxfi_eom                            (SMFICTX *context);
sfsistat            xxfi_abort                          (SMFICTX *context);
sfsistat            xxfi_close                          (SMFICTX *context);
sfsistat            xxfi_unknown                        (SMFICTX *context,
                                                         const char *command);
sfsistat            xxfi_data                           (SMFICTX *context);
sfsistat            xxfi_negotiate                      (SMFICTX *context,
                                                         unsigned long  actions,
                                                         unsigned long  steps,
                                                         unsigned long  unused0,
                                                         unsigned long  unused1,
                                                         unsigned long *actions_output,
                                                         unsigned long *steps_output,
                                                         unsigned long *unused0_output,
                                                         unsigned long *unused1_output);
int                 smfi_opensocket                     (bool remove_socket);
int                 smfi_register                       (struct smfiDesc description);
int                 smfi_main                           (void);
int                 smfi_setbacklog                     (int backlog);
int                 smfi_setdbg                         (int level);
int                 smfi_settimeout                     (int timeout);
int                 smfi_setconn                        (char *connection_spec);
int                 smfi_stop                           (void);
int                 smfi_version                        (unsigned int *major,
                                                         unsigned int *minor,
                                                         unsigned int *patch_level);
#define             SMFIF_ADDHDRS
#define             SMFIF_CHGBODY
#define             SMFIF_MODBODY
#define             SMFIF_ADDRCPT
#define             SMFIF_DELRCPT
#define             SMFIF_CHGHDRS
#define             SMFIF_QUARANTINE
#define             SMFIF_CHGFROM
#define             SMFIF_ADDRCPT_PAR
#define             SMFIF_SETSYMLIST
#define             SMFIS_CONTINUE
#define             SMFIS_REJECT
#define             SMFIS_DISCARD
#define             SMFIS_ACCEPT
#define             SMFIS_TEMPFAIL
#define             SMFIS_NOREPLY
#define             SMFIS_SKIP
#define             SMFIS_ALL_OPTS
#define             SMFIM_CONNECT
#define             SMFIM_HELO
#define             SMFIM_ENVFROM
#define             SMFIM_ENVRCPT
#define             SMFIM_DATA
#define             SMFIM_EOM
#define             SMFIM_EOH
#define             SMFIP_NOCONNECT
#define             SMFIP_NOHELO
#define             SMFIP_NOMAIL
#define             SMFIP_NORCPT
#define             SMFIP_NOBODY
#define             SMFIP_NOHDRS
#define             SMFIP_NOEOH
#define             SMFIP_NR_HDR
#define             SMFIP_NOHREPL
#define             SMFIP_NOUNKNOWN
#define             SMFIP_NODATA
#define             SMFIP_SKIP
#define             SMFIP_RCPT_REJ
#define             SMFIP_NR_CONN
#define             SMFIP_NR_HELO
#define             SMFIP_NR_MAIL
#define             SMFIP_NR_RCPT
#define             SMFIP_NR_DATA
#define             SMFIP_NR_UNKN
#define             SMFIP_NR_EOH
#define             SMFIP_NR_BODY
#define             SMFIP_HDR_LEADSPC
char*               smfi_getsymval                      (SMFICTX *context,
                                                         char *name);
int                 smfi_setreply                       (SMFICTX *context,
                                                         char *return_code,
                                                         char *extended_code,
                                                         char *message);
int                 smfi_setmlreply                     (SMFICTX *context,
                                                         const char *return_code,
                                                         const char *extended_code,
                                                         ...);
int                 smfi_addheader                      (SMFICTX *context,
                                                         char *name,
                                                         char *value);
int                 smfi_chgheader                      (SMFICTX *context,
                                                         char *name,
                                                         int index,
                                                         char *value);
int                 smfi_insheader                      (SMFICTX *context,
                                                         int index,
                                                         char *name,
                                                         char *value);
int                 smfi_chgfrom                        (SMFICTX *context,
                                                         char *mail,
                                                         char *arguments);
int                 smfi_addrcpt                        (SMFICTX *context,
                                                         char *recipient);
int                 smfi_addrcpt_par                    (SMFICTX *context,
                                                         char *recipient,
                                                         char *arguments);
int                 smfi_delrcpt                        (SMFICTX *context,
                                                         char *recipient);
int                 smfi_progress                       (SMFICTX *context);
int                 smfi_replacebody                    (SMFICTX *context,
                                                         unsigned char *new_body,
                                                         int new_body_size);
int                 smfi_quarantine                     (SMFICTX *context,
                                                         char *reason);
int                 smfi_setpriv                        (SMFICTX *context,
                                                         void *data);
void*               smfi_getpriv                        (SMFICTX *context);
int                 smfi_setsymlist                     (SMFICTX *context,
                                                         int state,
                                                         char *macros);

説明

libmilter/mfapi.hはSendmailのlibmilter互換APIを提供します。Sendmailのlibmilterの代わりにこのライブラリを使用することができます。milter.orgのAPIドキュメントもみてください。

詳細

SMFI_VERSION

#  define SMFI_VERSION	0x01000001

libmilterのバージョン番号。


SM_LM_VRS_MAJOR()

#define SM_LM_VRS_MAJOR(version)	(((version) & 0x7f000000) >> 24)

versionからメジャーバージョン番号を取りだします。

version :

バージョン番号。

SM_LM_VRS_MINOR()

#define SM_LM_VRS_MINOR(version)	(((version) & 0x007fff00) >> 8)

versionからマイナーバージョン番号を取りだします。

version :

バージョン番号。

SM_LM_VRS_PLVL()

#define SM_LM_VRS_PLVL(version)		((version) & 0x0000007f)

versionからパッチレベルを取りだします。

version :

バージョン番号。

MI_SUCCESS

#define MI_SUCCESS	0

操作が成功したことを示します。


MI_FAILURE

#define MI_FAILURE	(-1)

操作が失敗したことを示します。


SMFICTX

typedef struct smfi_str  SMFICTX;

milterセッションの情報を持っています。SMFICTXは各milterセッション毎に作成されます。SMFICTXはlibmilter APIの中でもっとも重要なオブジェクトです。


SMFICTX_PTR

typedef struct smfi_str *SMFICTX_PTR;

SMFICTXのポインタ型。


smfiDesc_str

typedef struct smfiDesc smfiDesc_str;

milterの情報を持っています。smfi_register()smfiDesc_str使います。


smfiDesc_ptr

typedef struct smfiDesc	*smfiDesc_ptr;

smfiDesc_strのポインタ型です。


sfsistat

typedef int sfsistat;

コールバックが返す応答ステータスを示します。

利用可能な応答ステータスは以下のどれかです。


bool

#      define bool int

真偽値型。


true

#      define true 1

真の値。


false

#      define false 0

偽の値。


xxfi_connect ()

sfsistat            xxfi_connect                        (SMFICTX *context,
                                                         char *host_name,
                                                         _SOCK_ADDR *address);

各milterセッションの最初に呼ばれるコールバック。

すべての利用可能な応答ステータスは以下の通りです。

SMFIS_CONTINUE

現在の接続に対する処理を続行します。

SMFIS_REJECT

現在の接続を拒否します。

SMFIS_ACCEPT

これ以上処理を続けずに、現在の接続を受け入れます。

SMFIS_TEMPFAIL

現在の接続を一時的な障害が発生したとして拒否します。(つまり、SMTPでは4xxのステータスコードになります。)

SMFIS_NOREPLY

MTAに返答しません。milterはSMFIP_NR_CONNフラグをsmfiDesc::xxfi_flagsに設定していなければいけません。

milter.orgのxxfi_connectも見てください。

context :

現在のmilterセッションのコンテキスト。

host_name :

SMTPクライアントのホスト名。

address :

SMTPクライアントのアドレス。

返値 :

応答ステータス。

xxfi_helo ()

sfsistat            xxfi_helo                           (SMFICTX *context,
                                                         char *fqdn);

このコールバックはSMTPの"HELO"/"EHLO"コマンドのときに呼ばれます。

すべての利用可能な応答ステータスは以下の通りです。

SMFIS_CONTINUE

現在の接続に対する処理を続行します。

SMFIS_REJECT

現在の接続を拒否します。

SMFIS_ACCEPT

これ以上処理を続けずに、現在の接続を受け入れます。

SMFIS_TEMPFAIL

現在の接続を一時的な障害が発生したとして拒否します。(つまり、SMTPでは4xxのステータスコードになります。)

SMFIS_NOREPLY

MTAに返答しません。milterはsmfiDesc::xxfi_flagsにSMFIP_NR_HELOフラグを設定しなければいけません。

milter.orgの xxfi_heloも見てください。

context :

現在のmilterセッションのコンテキスト。

fqdn :

SMTPの"HELO"/"EHLO"コマンドでのFQDN。

返値 :

応答ステータス。

xxfi_envfrom ()

sfsistat            xxfi_envfrom                        (SMFICTX *context,
                                                         char **arguments);

このコールバックはSMTPの"MAIL FROM"コマンドのときに呼ばれます。

すべての利用可能な応答ステータスは以下の通りです。

SMFIS_CONTINUE

現在のメッセージに対する処理を続けます。

SMFIS_REJECT

現在の差出人とメッセージを拒否します。新しい差出人が指定されるかもしれません。

SMFIS_DISCARD

現在のメッセージを受け入れて、だまって破棄します。

SMFIS_ACCEPT

これ以上処理を続けずに、現在のメッセージを受け入れます。

SMFIS_TEMPFAIL

現在の差出人とメッセージを一時的な障害が発生したとして拒否します。(つまり、SMTPでは4xxのステータスコードになります。)新しい差出人が指定されるかもしれません。

SMFIS_NOREPLY

MTAに返答しません。milterはsmfiDesc::xxfi_flagsにSMFIP_NR_MAILフラグを設定しなければいけません。

milter.orgの xxfi_envfromも見てください。

context :

現在のmilterセッションのコンテキスト。

arguments :

SMTPの"MAIL FROM"コマンドの引数。最初の要素は差出人のアドレスです。NULL終端しています。

返値 :

応答ステータス。

xxfi_envrcpt ()

sfsistat            xxfi_envrcpt                        (SMFICTX *context,
                                                         char **arguments);

このコールバックはSMTPの"RCPT TO"コマンドのときに呼ばれます。

すべての利用可能な応答ステータスは以下の通りです。

SMFIS_CONTINUE

現在のメッセージに対する処理を続けます。

SMFIS_REJECT

現在の宛先を拒否します。現在のメッセージの処理は続きます。

SMFIS_DISCARD

現在のメッセージを受け入れて、だまって破棄します。

SMFIS_ACCEPT

現在の宛先を受け入れます。

SMFIS_TEMPFAIL

現在の宛先を一時的な障害が発生したとして拒否します。(つまり、SMTPでは4xxのステータスコードになります。)現在のメッセージの処理は継続します。

SMFIS_NOREPLY

MTAに返答しません。milterはsmfiDesc::xxfi_flagsにSMFIP_NR_RCPTフラグを設定しなければいけません。

milter.orgの xxfi_envrcptも見てください。

context :

現在のmilterセッションのコンテキスト。

arguments :

SMTPの"RCPT TO"コマンドの引数。最初の要素は宛先です。NULL終端しています。

返値 :

応答ステータス。

xxfi_header ()

sfsistat            xxfi_header                         (SMFICTX *context,
                                                         char *name,
                                                         char *value);

このコールバックは各ヘッダに対して呼ばれます。もし、smfiDesc::xxfi_flagsにSMFIP_HDR_LEADSPCフラグが設定されていれば、valueはヘッダ名と値を区切る":"の後ろにあるスペースも含みます。

例:

From: from <from@example.com>
To: recipient <recipient@example.com>
Subject:a subject

SMFIP_HDR_LEADSPCあり:

"From", " from <from@example.com>"
"To", " recipient <recipient@example.com>"
"Subject", "a subject"

SMFIP_HDR_LEADSPCなし:

"From", "from <from@example.com>"
"To", "recipient <recipient@example.com>"
"Subject", "a subject"

すべての利用可能な応答ステータスは以下の通りです。

SMFIS_CONTINUE

現在のメッセージに対する処理を続けます。

SMFIS_REJECT

現在のメッセージを拒否します。

SMFIS_DISCARD

現在のメッセージを受け入れて、だまって破棄します。

SMFIS_ACCEPT

これ以上処理を続けずに、現在のメッセージを受け入れます。

SMFIS_TEMPFAIL

現在のメッセージを一時的な障害が発生したとして拒否します。(つまり、SMTPでは4xxステータスコードになります。)

SMFIS_NOREPLY

MTAに返答しません。milterはsmfiDesc::xxfi_flagsにSMFIP_NR_HDRフラグを設定しなければいけません。

milter.orgの xxfi_headerも見てください。

context :

現在のmilterセッションのコンテキスト。

name :

ヘッダ名。

value :

ヘッダ値。valueは折り返し時に挿入された空白を含むかもしれません。

返値 :

応答ステータス。

xxfi_eoh ()

sfsistat            xxfi_eoh                            (SMFICTX *context);

このコールバックはすべてのヘッダが処理されたときに呼ばれます。

すべての利用可能な応答ステータスは以下の通りです。

SMFIS_CONTINUE

現在のメッセージに対する処理を続けます。

SMFIS_REJECT

現在のメッセージを拒否します。

SMFIS_DISCARD

現在のメッセージを受け入れて、だまって破棄します。

SMFIS_ACCEPT

これ以上処理を続けずに、現在のメッセージを受け入れます。

SMFIS_TEMPFAIL

現在のメッセージを一時的な障害が発生したとして拒否します。(つまり、SMTPでは4xxステータスコードになります。)

SMFIS_NOREPLY

MTAに返答しません。milterはsmfiDesc::xxfi_flagsにSMFIP_NR_EOHフラグを設定しなければいけません。

milter.orgの xxfi_eofも見てください。

context :

現在のmilterセッションのコンテキスト。

返値 :

応答ステータス。

xxfi_body ()

sfsistat            xxfi_body                           (SMFICTX *context,
                                                         unsigned char *data,
                                                         size_t data_size);

このコールバックは本文のデータを受け取ったときに呼ばれます。このコールバックはxxfi_eoh()xxfi_eom()の間に0回以上呼ばれます。

すべての利用可能な応答ステータスは以下の通りです。

SMFIS_CONTINUE

現在のメッセージに対する処理を続けます。

SMFIS_REJECT

現在のメッセージを拒否します。

SMFIS_DISCARD

現在のメッセージを受け入れて、だまって破棄します。

SMFIS_ACCEPT

これ以上処理を続けずに、現在のメッセージを受け入れます。

SMFIS_TEMPFAIL

現在のメッセージを一時的な障害が発生したとして拒否します。(つまり、SMTPでは4xxステータスコードになります。)

SMFIS_SKIP

これ以上の本文の処理を省略します。xxfi_eom()は呼ばれます。

SMFIS_NOREPLY

MTAに返答しません。milterはsmfiDesc::xxfi_flagsにSMFIP_NR_BODYフラグを設定しなければいけません。

milter.orgの xxfi_bodyも見てください。

context :

現在のmilterセッションのコンテキスト。

data :

本文の1かたまり。

data_size :

dataのサイズ。

返値 :

応答ステータス。

xxfi_eom ()

sfsistat            xxfi_eom                            (SMFICTX *context);

このコールバックはすべてのxxfi_body()呼び出しが終わった後に呼ばれます。すべてのメッセージ変更はこのコールバックの中でだけ行えます。変更はsmfi_addheader()smfi_chgfrom()などです。

すべての利用可能な応答ステータスは以下の通りです。

SMFIS_CONTINUE

現在のメッセージに対する処理を続けます。

SMFIS_DISCARD

現在のメッセージを受け入れて、だまって破棄します。

SMFIS_ACCEPT

これ以上処理を続けずに、現在のメッセージを受け入れます。

SMFIS_TEMPFAIL

現在のメッセージを一時的な障害が発生したとして拒否します。(つまり、SMTPでは4xxステータスコードになります。)

milter.orgの xxfi_eomも見てください。

context :

現在のmilterセッションのコンテキスト。

返値 :

応答ステータス。

xxfi_abort ()

sfsistat            xxfi_abort                          (SMFICTX *context);

このコールバックは xxfi_envfrom()からxxfi_eom()の間のどこかのタイミングで呼び出される可能性があります。このコールバックはmilter内部でエラーが発生し、かつ、メッセージ処理が完了していないときだけ実行されます。例えば、milterがSMFIS_ACCEPTSMFIS_REJECTSMFIS_DISCARDSMFIS_TEMPFAILを返しているときはこのコールバックは呼ばれません。

milterがxxfi_envfrom()からxxfi_eom()の間にメッセージのために割り当てたリソースがある場合は、このコールバックの中で解放してください。しかし、接続用に割り当てられたリソースは解放しないで下さい。そのリソースはxxfi_close()で解放してください。

すべての利用可能な応答ステータスは以下の通りです。

SMFIS_CONTINUE

現在のメッセージに対する処理を続けます。

SMFIS_DISCARD

現在のメッセージを受け入れて、だまって破棄します。

SMFIS_ACCEPT

これ以上処理を続けずに、現在のメッセージを受け入れます。

SMFIS_TEMPFAIL

現在のメッセージを一時的な障害が発生したとして拒否します。(つまり、SMTPでは4xxステータスコードになります。)

milter.orgの xxfi_abortも見てください。

context :

現在のmilterセッションのコンテキスト。

返値 :

応答ステータス。

xxfi_close ()

sfsistat            xxfi_close                          (SMFICTX *context);

このコールバックは各milterセッションの最後に呼ばれます。milterがセッション中で割り当てたリソースはこのコールバックの中で解放してください。

すべての応答ステータスは無視されます。SMFIS_CONTINUEを使って下さい。

milter.orgの xxfi_closeも見てください。

context :

現在のmilterセッションのコンテキスト。

返値 :

応答ステータス。

xxfi_unknown ()

sfsistat            xxfi_unknown                        (SMFICTX *context,
                                                         const char *command);

このコールバックは未知のSMTPコマンドまたは未実装のSMTPコマンドが送られてきた場合に呼ばれます。

すべての利用可能な応答ステータスは以下の通りです。

SMFIS_REJECT

現在のメッセージを拒否します。

SMFIS_TEMPFAIL

現在のメッセージを一時的な障害が発生したとして拒否します。(つまり、SMTPでは4xxステータスコードになります。)

SMFIS_NOREPLY

MTAに返答しません。milterはsmfiDesc::xxfi_flagsにSMFIP_NR_UNKNフラグを設定しなければいけません。

MTAは、未知のSMTPコマンドまたは未実装のSMTPコマンドは常に拒否することに中してください。

milter.orgの xxfi_unknownも見てください。

context :

現在のmilterセッションのコンテキスト。

command :

未知のSMTPコマンド。

返値 :

応答ステータス。

xxfi_data ()

sfsistat            xxfi_data                           (SMFICTX *context);

このコールバックはSMTPの"DATA"コマンドのときに呼ばれます。

すべての利用可能な応答ステータスは以下の通りです。

SMFIS_CONTINUE

現在のメッセージに対する処理を続けます。

SMFIS_REJECT

現在のメッセージを拒否します。

SMFIS_DISCARD

現在のメッセージを受け入れて、だまって破棄します。

SMFIS_ACCEPT

現在の宛先を受け入れます。

SMFIS_TEMPFAIL

現在のメッセージを一時的な障害が発生したとして拒否します。(つまり、SMTPでは4xxステータスコードになります。)

SMFIS_NOREPLY

MTAに返答しません。milterはsmfiDesc::xxfi_flagsにSMFIP_NR_DATAフラグを設定しなければいけません。

milter.orgの xxfi_dataも見てください。

context :

現在のmilterセッションのコンテキスト。

返値 :

応答ステータス。

xxfi_negotiate ()

sfsistat            xxfi_negotiate                      (SMFICTX *context,
                                                         unsigned long  actions,
                                                         unsigned long  steps,
                                                         unsigned long  unused0,
                                                         unsigned long  unused1,
                                                         unsigned long *actions_output,
                                                         unsigned long *steps_output,
                                                         unsigned long *unused0_output,
                                                         unsigned long *unused1_output);

このコールバックはMTAからネゴシエーション要求があったときに呼ばれます。MTAから受け取ったactionsstepsを変更したい場合は、actions_outputsteps_outputを設定して、SMFIS_CONTINUEを返してください。もし、actionsstepsの両方を変更しない場合は、たんにSMFIS_ALL_OPTSを返してください。

すべての利用可能な応答ステータスは以下の通りです。

SMFIS_ALL_OPTS

すべての利用可能なアクションとステップを有効にします。

SMFIS_REJECT

現在のセッションを拒否します。

SMFIS_CONTINUE

actions_outputsteps_outputを使って、現在のセッションの処理を継続します。

milter.orgの xxfi_negotiateも見てください。

context :

現在のmilterセッションのコンテキスト。

actions :

MTAから受け取ったアクション。

steps :

MTAから提案されたmilterプロトコルの実行ステップ。

unused0 :

使われません。

unused1 :

使われません。

actions_output :

MTAに要求するアクション。

steps_output :

MTAに要求するmilterプロトコルの実行ステップ。

unused0_output :

使われません。

unused1_output :

使われません。

返値 :

応答ステータス。

smfi_opensocket ()

int                 smfi_opensocket                     (bool remove_socket);

MTAからの接続されるソケットを作成します。

通常は、smfi_opensocket()を明示的に呼ぶ必要はありません。ソケットはsmfi_main()の中で暗黙的に作られます。

失敗条件は以下の通りです。

  • smfi_register()の呼び出しに成功していない。

  • smfi_setconn()の呼び出しに成功していない。

  • 接続指定がUNIXドメインソケットでremove_socketが真のとき、smfi_opensocket()が既存のUNIXドメインソケットの削除に失敗した場合。

  • smfi_opensocket()が新しいソケットの作成に失敗した場合。

milter.orgの smfi_opensocketも見てください。

remove_socket :

新しいソケットを作る前に、既存のUNIXドメインソケットを削除しようとするかどうか。

返値 :

成功した場合はMI_SUCCESS、そうでない場合はMI_FAILURE

smfi_register ()

int                 smfi_register                       (struct smfiDesc description);

milterの実装をコールバックとして登録します。

失敗条件は以下の通りです。

  • 互換性のないxxfi_version。

  • 不正なxxfi_flagsの値。

milter.orgの smfi_registerも見てください。

description :

milterの説明。

返値 :

成功した場合はMI_SUCCESS、そうでない場合はMI_FAILURE

smfi_main ()

int                 smfi_main                           (void);

イベントループに入ります。milterはsmfi_main()を呼ぶ前に、smfi_register()smfi_setconn()などで初期化していなければいけません。

失敗条件は以下の通りです。

  • ソケットの作成に失敗したとき。

milter.orgの smfi_mainも見てください。

返値 :

成功した場合はMI_SUCCESS、そうでない場合はMI_FAILURE

smfi_setbacklog ()

int                 smfi_setbacklog                     (int backlog);

listen(2)で使われるmilterの接続キューの最大長を設定します。

失敗条件は以下の通りです。

  • backlog &lt;= 0.

milter.orgの smfi_setbacklogも見てください。

backlog :

処理待ちの接続キューの最大長。

返値 :

成功した場合はMI_SUCCESS、そうでない場合はMI_FAILURE

smfi_setdbg ()

int                 smfi_setdbg                         (int level);

ログレベルを設定します。levelが0ならすべてのログメッセージが抑制されます。大きい値を指定すればするほど多くのログメッセージが出力されます。

milter.orgの smfi_setdbgも見てください。

level :

ログレベル。

返値 :

常にMI_SUCCESS

smfi_settimeout ()

int                 smfi_settimeout                     (int timeout);

入出力のタイムアウト時間を秒で設定します。既定値は7210秒です。timeout == 0は待たないことを意味します。"永遠に待つ"ではありません。

milter.orgの smfi_settimeoutも見てください。

timeout :

タイムアウト値を秒で指定します。

返値 :

常にMI_SUCCESS

smfi_setconn ()

int                 smfi_setconn                        (char *connection_spec);

接続指定を設定します。

connection_specの書式は以下のいずれかです。

  • "unix:/PATH/TO/SOCKET": UNIXドメインソケット。

  • "inet:PORT"、"inet:PORT@HOST_NAME"、"inet:PORT@IP_ADDRESS": IPv4。

  • "inet6:PORT"、"inet6:PORT@HOST_NAME"、"inet6:PORT@IP_ADDRESS": IPv6。

失敗条件は以下の通りです。

  • 不正な形式。

  • connection_specNULL

milter.orgの smfi_setconnも見てください。

connection_spec :

MTAと通信するための接続指定。

返値 :

成功した場合はMI_SUCCESS、そうでない場合はMI_FAILURE

smfi_stop ()

int                 smfi_stop                           (void);

milterを中止します。これ以上の接続を受け付けませんが、処理中の接続は最後まで続けます。

milter.orgの smfi_stopも見てください。

返値 :

常にMI_SUCCESS

smfi_version ()

int                 smfi_version                        (unsigned int *major,
                                                         unsigned int *minor,
                                                         unsigned int *patch_level);

libmilterのバージョンを取得します。バージョンはビルド時のlibmilterのバージョンではなくて、実行時に使用しているバージョンです。

milter.orgの smfi_versionも見てください。

major :

メジャーバージョンを返すアドレス。

minor :

マイナーバージョンを返すアドレス。

patch_level :

パッチレベルを返すアドレス。

返値 :

常にMI_SUCCESS

SMFIF_ADDHDRS

#define SMFIF_ADDHDRS     0x00000001L

milterはsmfi_addheader()を呼ぶかもしれません。

smfiDescxxfi_negotiate()milter.orgのsmfi_registerも見てください。


SMFIF_CHGBODY

#define SMFIF_CHGBODY     0x00000002L

milterはsmfi_chgbody()を呼ぶかもしれません。

smfiDescxxfi_negotiate()milter.orgのsmfi_registerも見てください。


SMFIF_MODBODY

#define SMFIF_MODBODY     SMFIF_CHGBODY

SMFIF_CHGBODYと同じ。


SMFIF_ADDRCPT

#define SMFIF_ADDRCPT     0x00000004L

milterはsmfi_addrcpt()を呼ぶかもしれません。

smfiDescxxfi_negotiate()milter.orgのsmfi_registerも見てください。


SMFIF_DELRCPT

#define SMFIF_DELRCPT     0x00000008L

milterはsmfi_delrcpt()を呼ぶかもしれません。

smfiDescxxfi_negotiate()milter.orgのsmfi_registerも見てください。


SMFIF_CHGHDRS

#define SMFIF_CHGHDRS     0x00000010L

milterはsmfi_chgheader()を呼ぶかもしれません。

smfiDescxxfi_negotiate()milter.orgのsmfi_registerも見てください。


SMFIF_QUARANTINE

#define SMFIF_QUARANTINE  0x00000020L

milterはsmfi_quarantine()を呼ぶかもしれません。

smfiDescxxfi_negotiate()milter.orgのsmfi_registerも見てください。


SMFIF_CHGFROM

#define SMFIF_CHGFROM     0x00000040L

milterはsmfi_chgfrom()を呼ぶかもしれません。

smfiDescxxfi_negotiate()milter.orgのsmfi_registerも見てください。


SMFIF_ADDRCPT_PAR

#define SMFIF_ADDRCPT_PAR 0x00000080L

milterはsmfi_addrcpt_par()を呼ぶかもしれません。

smfiDescxxfi_negotiate()milter.orgのsmfi_registerも見てください。


SMFIF_SETSYMLIST

#define SMFIF_SETSYMLIST  0x00000100L

milterはsmfi_setsymlist()を呼ぶかもしれません。

smfiDescxxfi_negotiate()milter.orgのsmfi_registerも見てください。


SMFIS_CONTINUE

#define SMFIS_CONTINUE    0

現在の処理を継続します。

各コールバック(xxfi_connect()xxfi_helo()など)とmilter.orgのコールバックの返値の説明も見てください。


SMFIS_REJECT

#define SMFIS_REJECT      1

現在処理中のターゲットを拒否します。

各コールバック(xxfi_connect()xxfi_helo()など)とmilter.orgのコールバックの返値の説明も見てください。


SMFIS_DISCARD

#define SMFIS_DISCARD     2

現在処理中のターゲットを受け入れて、だまって破棄します。

各コールバック(xxfi_envfrom()xxfi_envrcpt()など)とmiler.orgのコールバックの返値の説明も見てください。


SMFIS_ACCEPT

#define SMFIS_ACCEPT      3

現在処理中のターゲットを受け入れます。

各コールバック(xxfi_connect()xxfi_helo()など)とmilter.orgのコールバックの返値の説明も見てください。


SMFIS_TEMPFAIL

#define SMFIS_TEMPFAIL    4

現在のターゲットに対して、一時的な障害ステータスを返します。

各コールバック(xxfi_connect()xxfi_helo()など)とmilter.orgのコールバックの返値の説明も見てください。


SMFIS_NOREPLY

#define SMFIS_NOREPLY     7

MTAに返答しません。

各コールバック(xxfi_connect()xxfi_helo()など)とmilter.orgのコールバックの返値の説明も見てください。


SMFIS_SKIP

#define SMFIS_SKIP        8

残りの本文を省略します。xxfi_body()の中でだけ使えます。

milter.orgのコールバックの返値の説明も見てください。


SMFIS_ALL_OPTS

#define SMFIS_ALL_OPTS    10

MTAから受け取ったすべてのネゴシエーションオプションを使います。これはxxfi_negotiate()の中でだけ使えます。


SMFIM_CONNECT

#define SMFIM_CONNECT	  0

xxfi_connect()のプロトコル段階であることを示します。

smfi_setsymlist()も見てください。


SMFIM_HELO

#define SMFIM_HELO	  1

xxfi_helo()のプロトコル段階であることを示します。

smfi_setsymlist()も見てください。


SMFIM_ENVFROM

#define SMFIM_ENVFROM	  2

xxfi_envfrom()のプロトコル段階であることを示します。

smfi_setsymlist()も見てください。


SMFIM_ENVRCPT

#define SMFIM_ENVRCPT	  3

xxfi_envrcpt()のプロトコル段階であることを示します。

smfi_setsymlist()も見てください。


SMFIM_DATA

#define SMFIM_DATA	  4

xxfi_data()のプロトコル段階であることを示します。

smfi_setsymlist()も見てください。


SMFIM_EOM

#define SMFIM_EOM	  5

xxfi_eom()のプロトコル段階であることを示します。

smfi_setsymlist()も見てください。


SMFIM_EOH

#define SMFIM_EOH	  6

xxfi_eoh()のプロトコル段階であることを示します。

smfi_setsymlist()も見てください。


SMFIP_NOCONNECT

#define SMFIP_NOCONNECT       0x00000001L

MTAはxxfi_connect()の情報を送信しないことを示します。

このフラグはxxfi_negotiate()steps_outputで取得・設定できます。


SMFIP_NOHELO

#define SMFIP_NOHELO          0x00000002L

MTAがxxfi_helo()の情報を送信しないことを示します。

このフラグはxxfi_negotiate()steps_outputで取得・設定できます。


SMFIP_NOMAIL

#define SMFIP_NOMAIL          0x00000004L

MTAがxxfi_mail()の情報を送信しないことを示します。

このフラグはxxfi_negotiate()steps_outputで取得・設定できます。


SMFIP_NORCPT

#define SMFIP_NORCPT          0x00000008L

MTAがxxfi_rcpt()の情報を送信しないことを示します。

このフラグはxxfi_negotiate()steps_outputで取得・設定できます。


SMFIP_NOBODY

#define SMFIP_NOBODY          0x00000010L


SMFIP_NOHDRS

#define SMFIP_NOHDRS          0x00000020L

MTAがxxfi_header()の情報を送信しないことを示します。

このフラグはxxfi_negotiate()steps_outputで取得・設定できます。


SMFIP_NOEOH

#define SMFIP_NOEOH           0x00000040L

MTAがxxfi_eoh()の情報を送信しないことを示します。

このフラグはxxfi_negotiate()steps_outputで取得・設定できます。


SMFIP_NR_HDR

#define SMFIP_NR_HDR          0x00000080L

milterがxxfi_header()に返答しないことを示します。

このフラグはxxfi_negotiate()steps_outputで取得・設定できます。


SMFIP_NOHREPL

#define SMFIP_NOHREPL         SMFIP_NR_HDR

SMFIP_NR_HDRと同じ。


SMFIP_NOUNKNOWN

#define SMFIP_NOUNKNOWN       0x00000100L

MTAがxxfi_unknown()の情報を送信しないことを示します。

このフラグはxxfi_negotiate()steps_outputで取得・設定できます。


SMFIP_NODATA

#define SMFIP_NODATA          0x00000200L

MTAがxxfi_data()の情報を送信しないことを示します。

このフラグはxxfi_negotiate()steps_outputで取得・設定できます。


SMFIP_SKIP

#define SMFIP_SKIP            0x00000400L

MTAがxxfi_body()でのSMFIS_SKIPをサポートしていることを示します。

このフラグはxxfi_negotiate()steps_outputで取得・設定できます。


SMFIP_RCPT_REJ

#define SMFIP_RCPT_REJ        0x00000800L

MTAは拒否した宛先も送信し、xxfi_envrcpt()が呼び出されることを示します。

このフラグはxxfi_negotiate()steps_outputで取得・設定できます。


SMFIP_NR_CONN

#define SMFIP_NR_CONN         0x00001000L

milterがxxfi_connect()に返答しないことを示します。

このフラグはxxfi_negotiate()steps_outputで取得・設定できます。


SMFIP_NR_HELO

#define SMFIP_NR_HELO         0x00002000L

milterがxxfi_helo()に返答しないことを示します。

このフラグはxxfi_negotiate()steps_outputで取得・設定できます。


SMFIP_NR_MAIL

#define SMFIP_NR_MAIL         0x00004000L

milterがxxfi_envfrom()に返答しないことを示します。

このフラグはxxfi_negotiate()steps_outputで取得・設定できます。


SMFIP_NR_RCPT

#define SMFIP_NR_RCPT         0x00008000L

milterがxxfi_envrcpt()に返答しないことを示します。

このフラグはxxfi_negotiate()steps_outputで取得・設定できます。


SMFIP_NR_DATA

#define SMFIP_NR_DATA         0x00010000L

milterがxxfi_data()に返答しないことを示します。

このフラグはxxfi_negotiate()steps_outputで取得・設定できます。


SMFIP_NR_UNKN

#define SMFIP_NR_UNKN         0x00020000L

milterがxxfi_unknown()に返答しないことを示します。

このフラグはxxfi_negotiate()steps_outputで取得・設定できます。


SMFIP_NR_EOH

#define SMFIP_NR_EOH          0x00040000L

milterがxxfi_eoh()に返答しないことを示します。

このフラグはxxfi_negotiate()steps_outputで取得・設定できます。


SMFIP_NR_BODY

#define SMFIP_NR_BODY         0x00080000L

milterがxxfi_body()に返答しないことを示します。

このフラグはxxfi_negotiate()steps_outputで取得・設定できます。


SMFIP_HDR_LEADSPC

#define SMFIP_HDR_LEADSPC     0x00100000L

xxfi_header()コールバックが':'の後のスペース付きでヘッダの値を受けとることを示します。例はxxfi_header()を見てください。

このフラグはxxfi_negotiate()steps_outputで取得・設定できます。


smfi_getsymval ()

char*               smfi_getsymval                      (SMFICTX *context,
                                                         char *name);

現在のmilterセッションコンテキスト中でのnameというマクロ名の値を返します。smfi_getsymval()はxxfi_XXXコールバックの中で使えます。(例えば、xxfi_connect()xxfi_helo()など)

nameが"i"のように1文字でない場合は、"{if_name}"のようにかっこ("{"と"}")で囲みます。

milter.orgの smfi_getsymvalも見てください。Sendmailの既定のマクロもそのページに載っています。

context :

現在のmilterセッションのコンテキスト。

name :

マクロ名。

返値 :

もしあればnameというマクロ名の値、なければNULL

smfi_setreply ()

int                 smfi_setreply                       (SMFICTX *context,
                                                         char *return_code,
                                                         char *extended_code,
                                                         char *message);

エラー応答コードを設定します。4xx return_codeSMFIS_TEMPFAILのときに使います。5xx return_codeSMFIS_REJECTのときに使います。

失敗条件は以下の通りです。

  • return_codeが4xxでも5xxでもない。

  • extended_codeが4.x.xでも5.x.xでもない。

milter.orgの smfi_setreplyも見てください。

context :

現在のmilterセッションのコンテキスト。

return_code :

3桁のSMTPエラー応答コード。(RFC 2821)4xxと5xxだけが使えます。

extended_code :

拡張応答コード(RFC 1893/2034)またはNULL。4.x.xと5.x.xだけが使えます。

message :

SMTP応答のテキスト部分またはNULL

返値 :

成功した場合はMI_SUCCESS、そうでない場合はMI_FAILURE

smfi_setmlreply ()

int                 smfi_setmlreply                     (SMFICTX *context,
                                                         const char *return_code,
                                                         const char *extended_code,
                                                         ...);

エラー応答コードを設定します。4xx return_codeSMFIS_TEMPFAILのときに使います。5xx return_codeSMFIS_REJECTのときに使います。

失敗条件は以下の通りです。

  • return_codeが4xxでも5xxでもない。

  • extended_codeが4.x.xでも5.x.xでもない。

milter.orgの smfi_setmlreplyも見てください。

context :

現在のmilterセッションのコンテキスト。

return_code :

3桁のSMTPエラー応答コード。(RFC 2821)4xxと5xxだけが使えます。

extended_code :

拡張応答コード(RFC 1893/2034)またはNULL。4.x.xと5.x.xだけが使えます。

... :

SMTP応答のテキスト部分の一行。最後にNULLを指定すること。

返値 :

成功した場合はMI_SUCCESS、そうでない場合はMI_FAILURE

smfi_addheader ()

int                 smfi_addheader                      (SMFICTX *context,
                                                         char *name,
                                                         char *value);

現在のメッセージのヘッダリストにヘッダを追加します。smfi_addheader()xxfi_eom()の中で呼ぶことができます。

失敗条件は以下の通りです。

milter.orgの smfi_addheaderも見てください。

context :

現在のmilterセッションのコンテキスト。

name :

ヘッダ名。

value :

ヘッダ値。

返値 :

成功した場合はMI_SUCCESS、そうでない場合はMI_FAILURE

smfi_chgheader ()

int                 smfi_chgheader                      (SMFICTX *context,
                                                         char *name,
                                                         int index,
                                                         char *value);

nameという名前のヘッダのうち、index番目にあるヘッダを変更します。valueNULLならそのヘッダは削除されます。smfi_chgheader()xxfi_eom()の中で呼ぶことができます。

失敗条件は以下の通りです。

milter.orgの smfi_chgheaderも見てください。

context :

現在のmilterセッションのコンテキスト。

name :

ヘッダ名。

index :

名前がnameのすべてのヘッダの中の位置。(1ベース)

value :

ヘッダ値。ターゲットのヘッダを削除する場合はNULLを指定してください。

返値 :

成功した場合はMI_SUCCESS、そうでない場合はMI_FAILURE

smfi_insheader ()

int                 smfi_insheader                      (SMFICTX *context,
                                                         int index,
                                                         char *name,
                                                         char *value);

ヘッダのindex番目にヘッダを挿入します。smfi_insheader()xxfi_eom()の中で呼ぶことができます。

失敗条件は以下の通りです。

milter.orgの smfi_insheaderも見てください。

context :

現在のmilterセッションのコンテキスト。

index :

挿入されるヘッダの位置。0は先頭に追加するという意味になります。

name :

ヘッダ名。

value :

ヘッダ値。

返値 :

成功した場合はMI_SUCCESS、そうでない場合はMI_FAILURE

smfi_chgfrom ()

int                 smfi_chgfrom                        (SMFICTX *context,
                                                         char *mail,
                                                         char *arguments);

送信者のアドレスを変更します。smfi_chgfrom()xxfi_eom()の中で呼ぶことができます。

失敗条件は以下の通りです。

milter.orgの smfi_chgfromも見てください。

context :

現在のmilterセッションのコンテキスト。

mail :

新しい送信者のアドレス。

arguments :

ESMTPの追加の引数。

返値 :

成功した場合はMI_SUCCESS、そうでない場合はMI_FAILURE

smfi_addrcpt ()

int                 smfi_addrcpt                        (SMFICTX *context,
                                                         char *recipient);

宛先アドレスを追加します。smfi_addrcpt()xxfi_eom()の中で呼ぶことができます。

失敗条件は以下の通りです。

milter.orgの smfi_addrcptも見てください。

context :

現在のmilterセッションのコンテキスト。

recipient :

新しい宛先アドレス。

返値 :

成功した場合はMI_SUCCESS、そうでない場合はMI_FAILURE

smfi_addrcpt_par ()

int                 smfi_addrcpt_par                    (SMFICTX *context,
                                                         char *recipient,
                                                         char *arguments);

追加のESMTP引数付きで宛先アドレスを追加します。smfi_addrcpt_par()xxfi_eom()の中で呼ぶことができます。

失敗条件は以下の通りです。

milter.orgの smfi_addrcpt_parも見てください。

context :

現在のmilterセッションのコンテキスト。

recipient :

宛先アドレス。

arguments :

ESMTPの追加の引数。

返値 :

成功した場合はMI_SUCCESS、そうでない場合はMI_FAILURE

smfi_delrcpt ()

int                 smfi_delrcpt                        (SMFICTX *context,
                                                         char *recipient);

宛先のアドレスを削除します。smfi_delrcpt()xxfi_eom()の中で呼ぶことができます。

失敗条件は以下の通りです。

milter.orgの smfi_delrcptも見てください。

context :

現在のmilterセッションのコンテキスト。

recipient :

宛先アドレス。

返値 :

成功した場合はMI_SUCCESS、そうでない場合はMI_FAILURE

smfi_progress ()

int                 smfi_progress                       (SMFICTX *context);

現在の接続を維持します。smfi_progress()xxfi_eom()の中で呼ぶことができます。

失敗条件は以下の通りです。

  • xxfi_eom()以外で呼ばれた。FIXME: 未実装。

  • ネットワークエラー発生。

milter.orgの smfi_progressも見てください。

context :

現在のmilterセッションのコンテキスト。

返値 :

成功した場合はMI_SUCCESS、そうでない場合はMI_FAILURE

smfi_replacebody ()

int                 smfi_replacebody                    (SMFICTX *context,
                                                         unsigned char *new_body,
                                                         int new_body_size);

現在の本文のデータをnew_bodyで置き換えます。smfi_replacebody()xxfi_eom()の中で呼ぶことができます。

失敗条件は以下の通りです。

milter.orgの smfi_replacebodyも見てください。

context :

現在のmilterセッションのコンテキスト。

new_body :

新しい本文のデータ。

new_body_size :

new_bodyのサイズ。

返値 :

成功した場合はMI_SUCCESS、そうでない場合はMI_FAILURE

smfi_quarantine ()

int                 smfi_quarantine                     (SMFICTX *context,
                                                         char *reason);

現在のメッセージをreasonという理由で隔離します。smfi_quarantine()xxfi_eom()の中で呼ぶことができます。

失敗条件は以下の通りです。

milter.orgの smfi_quarantineも見てください。

context :

現在のmilterセッションのコンテキスト。

reason :

隔離理由。

返値 :

成功した場合はMI_SUCCESS、そうでない場合はMI_FAILURE

smfi_setpriv ()

int                 smfi_setpriv                        (SMFICTX *context,
                                                         void *data);

プライベートなデータを設定します。

失敗条件は以下の通りです。

  • contextが不正。FIXME: 未実装。

milter.orgの smfi_setprivも見てください。

context :

現在のmilterセッションのコンテキスト。

data :

プライベートなデータ。

返値 :

成功した場合はMI_SUCCESS、そうでない場合はMI_FAILURE

smfi_getpriv ()

void*               smfi_getpriv                        (SMFICTX *context);

プライベートなデータを取得します。

失敗条件は以下の通りです。

  • contextが不正。FIXME: 未実装。

milter.orgの smfi_getprivも見てください。

context :

現在のmilterセッションのコンテキスト。

返値 :

smfi_setpriv()で設定したプライベートなデータかNULL

smfi_setsymlist ()

int                 smfi_setsymlist                     (SMFICTX *context,
                                                         int state,
                                                         char *macros);

要求するマクロのリストを設定します。smfi_setsymlist()xxfi_negotiate()の中で呼ぶことができます。

失敗条件は以下の通りです。

  • stateが不正。FIXME: 未実装。

  • macrosNULLまたは空。FIXME: 未実装。

  • stateの要求マクロリストがすでに設定されている。FIXME: 未実装。

  • xxfi_negotiate()以外から呼ばれた。FIXME: 未実装。

  • ネットワークエラー発生。

milter.orgの smfi_setsymlistも見てください。

context :

現在のmilterセッションのコンテキスト。

state :

SMFIM_CONNECTのようなSMFIM_XXXとして定義された状態。

macros :

"{rcpt_mailer} {rcpt_host}"のような空白で区切られたマクロ名のリスト。

返値 :

成功した場合はMI_SUCCESS、そうでない場合はMI_FAILURE