| 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。 |
返値 : |
コンテキストのオプション。 |