![]() |
![]() |
![]() |
milter managerリファレンスマニュアル | ![]() |
---|---|---|---|---|
#define MILTER_CLIENT_CONTEXT_ERROR enum MilterClientContextError; enum MilterClientContextState; MilterClientContext; GQuark milter_client_context_error_quark (void); MilterClientContext* milter_client_context_new (void); gboolean milter_client_context_feed (MilterClientContext *context, const gchar *chunk, gsize size, GError **error); gpointer milter_client_context_get_private_data (MilterClientContext *context); void milter_client_context_set_private_data (MilterClientContext *context, gpointer data, GDestroyNotify destroy); gboolean milter_client_context_set_reply (MilterClientContext *context, guint code, const gchar *extended_code, const gchar *message, GError **error); gchar* milter_client_context_format_reply (MilterClientContext *context); gboolean milter_client_context_add_header (MilterClientContext *context, const gchar *name, const gchar *value, GError **error); gboolean milter_client_context_insert_header (MilterClientContext *context, guint32 index, const gchar *name, const gchar *value, GError **error); gboolean milter_client_context_change_header (MilterClientContext *context, const gchar *name, guint32 index, const gchar *value); gboolean milter_client_context_delete_header (MilterClientContext *context, const gchar *name, guint32 index); gboolean milter_client_context_change_from (MilterClientContext *context, const gchar *from, const gchar *parameters); gboolean milter_client_context_add_recipient (MilterClientContext *context, const gchar *recipient, const gchar *parameters); gboolean milter_client_context_delete_recipient (MilterClientContext *context, const gchar *recipient); gboolean milter_client_context_replace_body (MilterClientContext *context, const gchar *body, gsize body_size); gboolean milter_client_context_progress (MilterClientContext *context); gboolean milter_client_context_quarantine (MilterClientContext *context, const gchar *reason); void milter_client_context_set_timeout (MilterClientContext *context, guint timeout); guint milter_client_context_get_timeout (MilterClientContext *context); void milter_client_context_set_state (MilterClientContext *context, MilterClientContextState state); MilterClientContextState milter_client_context_get_state (MilterClientContext *context); void milter_client_context_set_option (MilterClientContext *context, MilterOption *option); MilterOption* milter_client_context_get_option (MilterClientContext *context);
MilterClientContext
は1つのmilterプロトコルセッションを処理します。これはMilterClientContext
インスタンスは各milterプロトコルセッション毎に生成されるということです。
各milterプロトコルコマンドを処理するために、MilterClientContext
のシグナルに接続します。MilterClientContext
にはmilterプロトコルのイベントに対応したシグナルがあります。
"finished" |
以下はシグナルに接続する例です。すべてのシグナルに接続して、各シグナルハンドラはイベント名を表示します。
static MilterStatus cb_negotiate (MilterClientContext *context, MilterOption *option, gpointer user_data) { g_print("negotiate\n"); return MILTER_STATUS_ALL_OPTIONS; } static MilterStatus cb_connect (MilterClientContext *context, const gchar *host_name, const struct sockaddr *address, socklen_t address_length, gpointer user_data) { g_print("connect\n"); return MILTER_STATUS_CONTINUE; } static MilterStatus cb_helo (MilterClientContext *context, const gchar *fqdn, gpointer user_data) { g_print("helo\n"); return MILTER_STATUS_CONTINUE; } static MilterStatus cb_envelope_from (MilterClientContext *context, const gchar *from, gpointer user_data) { g_print("envelope-from\n"); return MILTER_STATUS_CONTINUE; } static MilterStatus cb_envelope_recipient (MilterClientContext *context, const gchar *to, gpointer user_data) { g_print("envelope-recipient\n"); return MILTER_STATUS_CONTINUE; } static MilterStatus cb_data (MilterClientContext *context, gpointer user_data) { g_print("data\n"); return MILTER_STATUS_CONTINUE; } static MilterStatus cb_header (MilterClientContext *context, const gchar *name, const gchar *value, gpointer user_data) { g_print("header\n"); return MILTER_STATUS_CONTINUE; } static MilterStatus cb_end_of_header (MilterClientContext *context, gpointer user_data) { g_print("end-of-header\n"); return MILTER_STATUS_CONTINUE; } static MilterStatus cb_body (MilterClientContext *context, const gchar *chunk, gsize length, gpointer user_data) { g_print("body\n"); return MILTER_STATUS_CONTINUE; } static MilterStatus cb_end_of_message (MilterClientContext *context, gpointer user_data) { g_print("end-of-message\n"); return MILTER_STATUS_CONTINUE; } static MilterStatus cb_abort (MilterClientContext *context, gpointer user_data) { g_print("abort\n"); return MILTER_STATUS_CONTINUE; } static MilterStatus cb_unknown (MilterClientContext *context, const gchar *command, gpointer user_data) { g_print("unknown\n"); return MILTER_STATUS_CONTINUE; } static void setup_context_signals (MilterClientContext *context) { #define CONNECT(name) \ g_signal_connect(context, name, G_CALLBACK(cb_ ## name), NULL) CONNECT(negotiate); CONNECT(connect); CONNECT(helo); CONNECT(envelope_from); CONNECT(envelope_recipient); CONNECT(data); CONNECT(header); CONNECT(end_of_header); CONNECT(body); CONNECT(end_of_message); CONNECT(abort); CONNECT(unknown); #undef CONNECT }
#define MILTER_CLIENT_CONTEXT_ERROR (milter_client_context_error_quark())
MilterClientContextのエラー用のGErrorクォークを取得するために使われます。
typedef enum { MILTER_CLIENT_CONTEXT_ERROR_INVALID_CODE, MILTER_CLIENT_CONTEXT_ERROR_IO_ERROR, MILTER_CLIENT_CONTEXT_ERROR_NULL, MILTER_CLIENT_CONTEXT_ERROR_INVALID_STATE, MILTER_CLIENT_CONTEXT_ERROR_INVALID_ACTION } MilterClientContextError;
MilterClientContext
の関数呼び出し中に発生するエラーを識別します。
milter_client_context_set_reply() で指定されたステータスコードが不正であることを示します。 |
|
milterプロトコルデータの読み書き時に発生した入出力エラーを示します。 | |
予期しない場所でNULL が渡されたことを示します。 |
|
現在のMilterClientContextState で予期しない操作が要求されたことを示します。 |
|
コンテキストのMilterActionFlags で予期しない操作が要求されたことを示します。 |
typedef enum { MILTER_CLIENT_CONTEXT_STATE_INVALID, MILTER_CLIENT_CONTEXT_STATE_START, MILTER_CLIENT_CONTEXT_STATE_NEGOTIATE, MILTER_CLIENT_CONTEXT_STATE_NEGOTIATE_REPLIED, MILTER_CLIENT_CONTEXT_STATE_CONNECT, MILTER_CLIENT_CONTEXT_STATE_CONNECT_REPLIED, MILTER_CLIENT_CONTEXT_STATE_HELO, MILTER_CLIENT_CONTEXT_STATE_HELO_REPLIED, MILTER_CLIENT_CONTEXT_STATE_ENVELOPE_FROM, MILTER_CLIENT_CONTEXT_STATE_ENVELOPE_FROM_REPLIED, MILTER_CLIENT_CONTEXT_STATE_ENVELOPE_RECIPIENT, MILTER_CLIENT_CONTEXT_STATE_ENVELOPE_RECIPIENT_REPLIED, MILTER_CLIENT_CONTEXT_STATE_DATA, MILTER_CLIENT_CONTEXT_STATE_DATA_REPLIED, MILTER_CLIENT_CONTEXT_STATE_UNKNOWN, MILTER_CLIENT_CONTEXT_STATE_UNKNOWN_REPLIED, MILTER_CLIENT_CONTEXT_STATE_HEADER, MILTER_CLIENT_CONTEXT_STATE_HEADER_REPLIED, MILTER_CLIENT_CONTEXT_STATE_END_OF_HEADER, MILTER_CLIENT_CONTEXT_STATE_END_OF_HEADER_REPLIED, MILTER_CLIENT_CONTEXT_STATE_BODY, MILTER_CLIENT_CONTEXT_STATE_BODY_REPLIED, MILTER_CLIENT_CONTEXT_STATE_END_OF_MESSAGE, MILTER_CLIENT_CONTEXT_STATE_END_OF_MESSAGE_REPLIED, MILTER_CLIENT_CONTEXT_STATE_QUIT, MILTER_CLIENT_CONTEXT_STATE_QUIT_REPLIED, MILTER_CLIENT_CONTEXT_STATE_ABORT, MILTER_CLIENT_CONTEXT_STATE_ABORT_REPLIED, MILTER_CLIENT_CONTEXT_STATE_FINISHED } MilterClientContextState;
MilterClientContext
の状態を識別します。
不正な状態。 | |
はじまったばかり。 | |
ネゴシエーションを開始。 | |
ネゴシエーション応答を受信した | |
接続情報を送信しました。 | |
接続情報への応答を受信した。 | |
HELOコマンドの開始。 | |
HELOコマンドへの応答を受信した。 | |
MAIL FROMコマンド開始。 | |
MAIL FROMコマンドへの応答を受信した。 | |
RCPT TOコマンドの開始。 | |
RCPT TOコマンドへの応答を受信した。 | |
DATAコマンドの開始。 | |
DATAコマンドへの応答を受信した。 | |
未知のSMTPコマンドの受信。 | |
未知のSMTPコマンドへの応答を受信した。 | |
ヘッダを送信した。 | |
ヘッダへの応答を受信した。 | |
すべてのヘッダを送信した。 | |
ヘッダ終了への応答を受信した。 | |
本体のかたまりの送信。 | |
本体への応答を受信した。 | |
すべての本文を送信した。 | |
メッセージ終了への応答を受信した。 | |
正常終了の開始。 | |
正常終了への応答を受信した。 | |
異常終了の開始。 | |
異常終了への応答を受信した。 | |
終了した。 |
MilterClientContext* milter_client_context_new (void);
新しいコンテキストオブジェクトの生成。通常は、コンテキストオブジェクトはMilterClient
が生成し、"connection-established"シグナルで渡されます。
返値 : |
新しいMilterClientContext オブジェクト。 |
gboolean milter_client_context_feed (MilterClientContext *context, const gchar *chunk, gsize size, GError **error);
context
に入力を与えます。テストやデバッグに使えます。
|
MilterClientContext 。 |
|
context への入力。 |
|
chunk のサイズ。 |
|
エラーを受け取る場所のアドレス、またはNULL 。 |
返値 : |
成功時はTRUE 。 |
gpointer milter_client_context_get_private_data (MilterClientContext *context);
context
のプライベートなデータ。
|
MilterClientContext 。 |
返値 : |
milter_client_context_set_private_data() で設定したプライベートなデータ、あるいはNULL 。 |
void milter_client_context_set_private_data (MilterClientContext *context, gpointer data, GDestroyNotify destroy);
context
のプライベートなデータを設定します。data
はdestroy
で破棄されます。data
が破棄されるのは、新しいプライベートなデータが設定されたときか、context
が破棄されたときです。
|
MilterClientContext 。 |
|
プライベートなデータ。 |
|
data の破棄関数、あるいはNULL 。 |
gboolean milter_client_context_set_reply (MilterClientContext *context, guint code, const gchar *extended_code, const gchar *message, GError **error);
エラー応答コードを設定します。MILTER_REPLY_TEMPORARY_FAILURE
のときは4xx code
を使います。MILTER_REPLY_REJECT
のときは5xx code
を使います。
milter.orgの smfi_setreplyも見てください。
|
MilterClientContext 。 |
|
3桁のSMTPエラー応答コード。(RFC 2821)4xxと5xxだけが使えます。 |
|
拡張応答コード(RFC 1893/2034)、あるいはNULL 。 |
|
SMTP応答のテキスト部分またはNULL 。 |
|
エラーを受け取る場所のアドレス、またはNULL 。 |
返値 : |
成功時はTRUE 。 |
gchar* milter_client_context_format_reply (MilterClientContext *context);
milter_client_context_set_reply()
で指定された現在のエラー応答コードを整形します。エラー応答コードが設定されていない場合は、NULL
を返します。
|
MilterClientContext 。 |
返値 : |
整形された応答コード、あるいはNULL 。 |
gboolean milter_client_context_add_header (MilterClientContext *context, const gchar *name, const gchar *value, GError **error);
現在のメッセージのヘッダリストにヘッダを追加します。この関数は"end-of-message"シグナルの中で呼ぶことができます。
milter.orgの smfi_addheaderも見てください。
FIXME: MILTER_ACTION_ADD_HEADERS
について書くこと。
|
MilterClientContext 。 |
|
ヘッダ名。 |
|
ヘッダ値。 |
|
エラーを受け取る場所のアドレス、またはNULL 。 |
返値 : |
成功時はTRUE 。 |
gboolean milter_client_context_insert_header (MilterClientContext *context, guint32 index, const gchar *name, const gchar *value, GError **error);
現在のメッセージのヘッダリストのindex
にヘッダを追加します。"end-of-message"シグナルの中で呼ぶことができます。milter.orgの smfi_insheaderも見てください。
FIXME: MILTER_ACTION_ADD_HEADERSについて書くこと。
|
MilterClientContext 。 |
|
挿入する位置。 |
|
ヘッダ名。 |
|
ヘッダ値。 |
|
エラーを受け取る場所のアドレス、またはNULL 。 |
返値 : |
成功時はTRUE 。 |
gboolean milter_client_context_change_header (MilterClientContext *context, const gchar *name, guint32 index, const gchar *value);
名前がname
のヘッダのうち、index
のヘッダを変更します。value
がNULL
ならヘッダは削除されます。"end-of-message"シグナルの中で呼ぶことができます。
milter.orgの smfi_chgheaderも見てください。
FIXME: MILTER_ACTION_CHANGE_HEADERSについて書くこと。
|
MilterClientContext 。 |
|
ヘッダ名。 |
|
名前がname のヘッダの位置。(1ベース)FIXME: 0ベースに変更する? |
|
ヘッダ値。ターゲットのヘッダを削除する場合はNULL を指定してください。 |
返値 : |
成功時はTRUE 。 |
gboolean milter_client_context_delete_header (MilterClientContext *context, const gchar *name, guint32 index);
名前がname
のヘッダのうち、index
のヘッダを削除します。"end-of-message"シグナルの中で呼ぶことができます。milter_client_context_change_header()
のvalue
をNULL
で呼んだときと同じ動作です。
FIXME: MILTER_ACTION_CHANGE_HEADERSについて書くこと。
|
MilterClientContext 。 |
|
ヘッダ名。 |
|
名前がname のヘッダの位置。(1ベース)FIXME: 0ベースに変更する? |
返値 : |
成功時はTRUE 。 |
gboolean milter_client_context_change_from (MilterClientContext *context, const gchar *from, const gchar *parameters);
現在のメッセージの送信ドレスを変更します。parameters
でESMTPの'MAIL FROM'コマンドのパラメタを設定できます。parameters
はNULL
でもかまいません。"end-of-message"シグナルの中で呼ぶことができます。milter.orgのsmfi_chgfromも見てください。
FIXME: MILTER_ACTION_CHANGE_FROMについて書くこと。
|
MilterClientContext 。 |
|
新しい送信アドレス。 |
|
ESMTPの'MAIL FROM'パラメタ。NULL も可。 |
返値 : |
成功時はTRUE 。 |
gboolean milter_client_context_add_recipient (MilterClientContext *context, const gchar *recipient, const gchar *parameters);
現在のメッセージに宛先アドレスを追加します。parameters
でESMTPの'RCPT TO'パラメタを設定することができます。parameters
はNULL
でもかまいません。"end-of-message"シグナルの中で呼ぶことができます。milter.orgのsmfi_addrcptとsmfi_addrcpt_parも見てください。
FIXME: MILTER_ACTION_ADD_RECIPIENTとMILTER_ACTION_ADD_ENVELOPE_RECIPIENT_WITH_PARAMETERSについて書くこと。
|
MilterClientContext 。 |
|
新しい宛先アドレス。 |
|
ESMTPの'RCPT TO'パラメタ。NULL も可。 |
返値 : |
成功時はTRUE 。 |
gboolean milter_client_context_delete_recipient (MilterClientContext *context, const gchar *recipient);
名前がrecipient
の宛先を削除します。"end-of-message"シグナルの中で呼ぶことができます。milter.orgのsmfi_delrcpt も見てください。
FIXME: MILTER_ACTION_DELETE_RECIPIENTについて書くこと。
|
MilterClientContext 。 |
|
削除する宛先アドレス。 |
返値 : |
成功時はTRUE 。 |
gboolean milter_client_context_replace_body (MilterClientContext *context, const gchar *body, gsize body_size);
現在のメッセージの本文をbody
で置き換えます。"end-of-message"シグナルの中で呼ぶことができます。milter.orgのsmfi_replacebody も見てください。
FIXME: MILTER_ACTION_CHANGE_BODYについて書くこと。
|
MilterClientContext 。 |
|
新しい本文。 |
|
body のサイズ。 |
返値 : |
成功時はTRUE 。 |
gboolean milter_client_context_progress (MilterClientContext *context);
このmilterはまだ処理中であることをMTAに通知します。"end-of-message"シグナルの中で呼ぶことができます。milter.orgのsmfi_progress も見てください。
|
MilterClientContext 。 |
返値 : |
成功時はTRUE 。 |
gboolean milter_client_context_quarantine (MilterClientContext *context, const gchar *reason);
現在のメッセージを理由reason
で隔離します。"end-of-message"シグナルの中で呼ぶことができます。milter.orgのsmfi_quarantine も見てください。
FIXME: MILTER_ACTION_QUARANTINEについて書くこと。
|
MilterClientContext 。 |
|
どうして現在のメッセージが隔離されるかの理由。 |
返値 : |
成功時はTRUE 。 |
void milter_client_context_set_timeout (MilterClientContext *context, guint timeout);
秒単位でタイムアウトを設定します。MTAがtimeout
秒以内に応答しない場合は、"timeout"シグナルが発行されます。milter.orgのsmfi_settimeout も見てください。
|
MilterClientContext 。 |
|
秒単位のタイムアウト。(既定値は7210秒) |
guint milter_client_context_get_timeout (MilterClientContext *context);
秒単位でタイムアウトを取得します。
|
MilterClientContext 。 |
返値 : |
秒単位でのタイムアウト。 |
void milter_client_context_set_state (MilterClientContext *context, MilterClientContextState state);
現在の状態を設定します。
|
MilterClientContext 。 |
|
MilterClientContextState 。 |
MilterClientContextState milter_client_context_get_state (MilterClientContext *context);
現在の状態を取得します。
|
MilterClientContext 。 |
返値 : |
現在の状態。 |
void milter_client_context_set_option (MilterClientContext *context, MilterOption *option);
現在のコンテキストのオプションを取得します。
|
MilterClientContext 。 |
|
MilterOption 。 |
MilterOption* milter_client_context_get_option (MilterClientContext *context);
コンテキストのオプションを取得します。
|
MilterClientContext 。 |
返値 : |
コンテキストのオプション。 |