MilterClientContext
3
milter managerライブラリ

# MilterClientContext

milterプロトコルを処理します。

## 概要

    #define             MILTER_CLIENT_CONTEXT_ERROR
    enum                MilterClientContextError;
    enum                MilterClientContextState;
                        MilterClientContext;
    GQuark              milter_client_context_error_quark   (void);
    MilterClientContext * milter_client_context_new         (MilterClient *client);
    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,
                                                             GError **error);
    gboolean            milter_client_context_delete_header (MilterClientContext *context,
                                                             const gchar *name,
                                                             guint32 index,
                                                             GError **error);
    gboolean            milter_client_context_change_from   (MilterClientContext *context,
                                                             const gchar *from,
                                                             const gchar *parameters,
                                                             GError **error);
    gboolean            milter_client_context_add_recipient (MilterClientContext *context,
                                                             const gchar *recipient,
                                                             const gchar *parameters,
                                                             GError **error);
    gboolean            milter_client_context_delete_recipient
                                                            (MilterClientContext *context,
                                                             const gchar *recipient,
                                                             GError **error);
    gboolean            milter_client_context_replace_body  (MilterClientContext *context,
                                                             const gchar *body,
                                                             gsize body_size,
                                                             GError **error);
    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);

## オブジェクト階層

      GObject
       +----MilterAgent
             +----MilterProtocolAgent
                   +----MilterClientContext

## 実装されたインターフェイス

MilterClientContextはMilterErrorEmittableとMilterFinishedEmittableを実装しています。

## プロパティ

      "client"                   MilterClient*         : Read / Write / Construct Only
      "message-result"           MilterMessageResult*  : Read / Write
      "option"                   MilterOption*         : Read / Write
      "packet-buffer-size"       guint                 : Read / Write
      "quarantine-reason"        gchar*                : Read / Write
      "state"                    MilterClientContextState  : Read / Write
      "status"                   MilterStatus          : Read / Write

## シグナル

      "abort"                                          : Run Last
      "abort-response"                                 : Run Last
      "body"                                           : Run Last
      "body-response"                                  : Run Last
      "connect"                                        : Run Last
      "connect-response"                               : Run Last
      "data"                                           : Run Last
      "data-response"                                  : Run Last
      "define-macro"                                   : Run Last
      "end-of-header"                                  : Run Last
      "end-of-header-response"                         : Run Last
      "end-of-message"                                 : Run Last
      "end-of-message-response"                        : Run Last
      "envelope-from"                                  : Run Last
      "envelope-from-response"                         : Run Last
      "envelope-recipient"                             : Run Last
      "envelope-recipient-response"                    : Run Last
      "header"                                         : Run Last
      "header-response"                                : Run Last
      "helo"                                           : Run Last
      "helo-response"                                  : Run Last
      "message-processed"                              : Run Last
      "negotiate"                                      : Run Last
      "negotiate-response"                             : Run Last
      "timeout"                                        : Run Last
      "unknown"                                        : Run Last
      "unknown-response"                               : Run Last

## 説明

`MilterClientContext`は1つのmilterプロトコルセッションを処理します。これは`MilterClientContext`インスタンスは各milterプロトコルセッション毎に生成されるということです。

各milterプロトコルコマンドを処理するために、`MilterClientContext`のシグナルに接続します。`MilterClientContext`にはmilterプロトコルのイベントに対応したシグナルがあります。

xxfi_negotiate

  "negotiate"

xxfi_connect

  "connect"

xxfi_helo

  "helo"

xxfi_envfrom

  "envelope-from"

xxfi_envrcpt

  "envelope-recipient"

xxfi_data

  "data"

xxfi_unknown

  "unknown"

xxfi_header

  "header"

xxfi_eoh

  "end-of-header"

xxfi_body

  "body"

xxfi_eom

  "end-of-message"

xxfi_abort

  "abort"。

  NOTE: You will need to check whether the current state is message processing or not. You can use `MILTER_CLIENT_CONTEXT_STATE_IN_MESSAGE_PROCESSING` for it.

xxfi_close

  "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,
                       const gchar *chunk, gsize length,
                       gpointer user_data)
    {
        g_print("end-of-message\n");
        return MILTER_STATUS_CONTINUE;
    }

    static MilterStatus
    cb_abort (MilterClientContext *context, MilterClientContextState state,
              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
    }

## 詳細

### MILTER_CLIENT_CONTEXT_ERROR

    #define MILTER_CLIENT_CONTEXT_ERROR           (milter_client_context_error_quark())

MilterClientContextのエラー用のGErrorクォークを取得するために使われます。

### enum MilterClientContextError

    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,
        MILTER_CLIENT_CONTEXT_ERROR_EMPTY
    } MilterClientContextError;

`MilterClientContext`の関数呼び出し中に発生するエラーを識別します。

`MILTER_CLIENT_CONTEXT_ERROR_INVALID_CODE`

  `milter_client_context_set_reply()`で指定されたステータスコードが不正であることを示します。

`MILTER_CLIENT_CONTEXT_ERROR_IO_ERROR`

  milterプロトコルデータの読み書き時に発生した入出力エラーを示します。

`MILTER_CLIENT_CONTEXT_ERROR_NULL`

  予期しない場所で`NULL`が渡されたことを示します。

`MILTER_CLIENT_CONTEXT_ERROR_INVALID_STATE`

  現在の`MilterClientContextState`で予期しない操作が要求されたことを示します。

`MILTER_CLIENT_CONTEXT_ERROR_INVALID_ACTION`

  コンテキストの`MilterActionFlags`で予期しない操作が要求されたことを示します。

`MILTER_CLIENT_CONTEXT_ERROR_EMPTY`

### enum MilterClientContextState

    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`の状態を識別します。

`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`

  HELOコマンドの開始。

`MILTER_CLIENT_CONTEXT_STATE_HELO_REPLIED`

  HELOコマンドへの応答を受信した。

`MILTER_CLIENT_CONTEXT_STATE_ENVELOPE_FROM`

  MAIL FROMコマンド開始。

`MILTER_CLIENT_CONTEXT_STATE_ENVELOPE_FROM_REPLIED`

  MAIL FROMコマンドへの応答を受信した。

`MILTER_CLIENT_CONTEXT_STATE_ENVELOPE_RECIPIENT`

  RCPT TOコマンドの開始。

`MILTER_CLIENT_CONTEXT_STATE_ENVELOPE_RECIPIENT_REPLIED`

  RCPT TOコマンドへの応答を受信した。

`MILTER_CLIENT_CONTEXT_STATE_DATA`

  DATAコマンドの開始。

`MILTER_CLIENT_CONTEXT_STATE_DATA_REPLIED`

  DATAコマンドへの応答を受信した。

`MILTER_CLIENT_CONTEXT_STATE_UNKNOWN`

  未知のSMTPコマンドの受信。

`MILTER_CLIENT_CONTEXT_STATE_UNKNOWN_REPLIED`

  未知のSMTPコマンドへの応答を受信した。

`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`

  終了した。

### MilterClientContext

    typedef struct _MilterClientContext MilterClientContext;

### milter_client_context_error_quark ()

    GQuark              milter_client_context_error_quark   (void);

### milter_client_context_new ()

    MilterClientContext * milter_client_context_new         (MilterClient *client);

新しいコンテキストオブジェクトの生成。通常は、コンテキストオブジェクトは`MilterClient`が生成し、"connection-established"シグナルで渡されます。

`client` :

  context用の`MilterClient`オブジェクト。

返値 :

  新しい`MilterClientContext`オブジェクト。

### milter_client_context_feed ()

    gboolean            milter_client_context_feed          (MilterClientContext *context,
                                                             const gchar *chunk,
                                                             gsize size,
                                                             GError **error);

`context`に入力を与えます。テストやデバッグに使えます。

`context` :

  `MilterClientContext`。

`chunk` :

  `context`への入力。

`size` :

  `chunk`のサイズ。

`error` :

  エラーを受け取る場所のアドレス、または`NULL`。

返値 :

  成功時は`TRUE`。

### milter_client_context_get_private_data ()

    gpointer            milter_client_context_get_private_data
                                                            (MilterClientContext *context);

`context`のプライベートなデータ。

`context` :

  `MilterClientContext`。

返値 :

  `milter_client_context_set_private_data()`で設定したプライベートなデータ、あるいは`NULL`。

### milter_client_context_set_private_data ()

    void                milter_client_context_set_private_data
                                                            (MilterClientContext *context,
                                                             gpointer data,
                                                             GDestroyNotify destroy);

`context`のプライベートなデータを設定します。`data`は`destroy`で破棄されます。`data`が破棄されるのは、新しいプライベートなデータが設定されたときか、`context`が破棄されたときです。

`context` :

  `MilterClientContext`。

`data` :

  プライベートなデータ。

`destroy` :

  `data`の破棄関数、あるいは`NULL`。

### milter_client_context_set_reply ()

    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も見てください。

`context` :

  `MilterClientContext`。

`code` :

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

`extended_code` :

  拡張応答コード（RFC 1893/2034）、あるいは`NULL`。

`message` :

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

`error` :

  エラーを受け取る場所のアドレス、または`NULL`。

返値 :

  成功時は`TRUE`。

### milter_client_context_format_reply ()

    gchar *             milter_client_context_format_reply  (MilterClientContext *context);

`milter_client_context_set_reply()`で指定された現在のエラー応答コードを整形します。エラー応答コードが設定されていない場合は、`NULL`を返します。

`context` :

  `MilterClientContext`。

返値 :

  整形された応答コード、あるいは`NULL`。

### milter_client_context_add_header ()

    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`について書くこと。

`context` :

  `MilterClientContext`。

`name` :

  ヘッダ名。

`value` :

  ヘッダ値。

`error` :

  エラーを受け取る場所のアドレス、または`NULL`。

返値 :

  成功時は`TRUE`。

### milter_client_context_insert_header ()

    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について書くこと。

`context` :

  `MilterClientContext`。

`index` :

  挿入する位置。

`name` :

  ヘッダ名。

`value` :

  ヘッダ値。

`error` :

  エラーを受け取る場所のアドレス、または`NULL`。

返値 :

  成功時は`TRUE`。

### milter_client_context_change_header ()

    gboolean            milter_client_context_change_header (MilterClientContext *context,
                                                             const gchar *name,
                                                             guint32 index,
                                                             const gchar *value,
                                                             GError **error);

名前が`name`のヘッダのうち、`index`のヘッダを変更します。`value`が`NULL`ならヘッダは削除されます。"end-of-message"シグナルの中で呼ぶことができます。

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

FIXME: MILTER_ACTION_CHANGE_HEADERSについて書くこと。

`context` :

  `MilterClientContext`。

`name` :

  ヘッダ名。

`index` :

  名前が`name`のヘッダの位置。（1ベース）FIXME: 0ベースに変更する？

`value` :

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

`error` :

  エラーを受け取る場所のアドレス、または`NULL`。

返値 :

  成功時は`TRUE`。

### milter_client_context_delete_header ()

    gboolean            milter_client_context_delete_header (MilterClientContext *context,
                                                             const gchar *name,
                                                             guint32 index,
                                                             GError **error);

名前が`name`のヘッダのうち、`index`のヘッダを削除します。"end-of-message"シグナルの中で呼ぶことができます。`milter_client_context_change_header()`の`value`を`NULL`で呼んだときと同じ動作です。

FIXME: MILTER_ACTION_CHANGE_HEADERSについて書くこと。

`context` :

  `MilterClientContext`。

`name` :

  ヘッダ名。

`index` :

  名前が`name`のヘッダの位置。（1ベース）FIXME: 0ベースに変更する？

`error` :

  エラーを受け取る場所のアドレス、または`NULL`。

返値 :

  成功時は`TRUE`。

### milter_client_context_change_from ()

    gboolean            milter_client_context_change_from   (MilterClientContext *context,
                                                             const gchar *from,
                                                             const gchar *parameters,
                                                             GError **error);

現在のメッセージの送信ドレスを変更します。`parameters`でESMTPの'MAIL FROM'コマンドのパラメタを設定できます。`parameters`は`NULL`でもかまいません。"end-of-message"シグナルの中で呼ぶことができます。milter.orgのsmfi_chgfromも見てください。

FIXME: MILTER_ACTION_CHANGE_FROMについて書くこと。

`context` :

  `MilterClientContext`。

`from` :

  新しい送信アドレス。

`parameters` :

  ESMTPの'MAIL FROM'パラメタ。`NULL`も可。

`error` :

  エラーを受け取る場所のアドレス、または`NULL`。

返値 :

  成功時は`TRUE`。

### milter_client_context_add_recipient ()

    gboolean            milter_client_context_add_recipient (MilterClientContext *context,
                                                             const gchar *recipient,
                                                             const gchar *parameters,
                                                             GError **error);

現在のメッセージに宛先アドレスを追加します。`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について書くこと。

`context` :

  `MilterClientContext`。

`recipient` :

  新しい宛先アドレス。

`parameters` :

  ESMTPの'RCPT TO'パラメタ。`NULL`も可。

`error` :

  エラーを受け取る場所のアドレス、または`NULL`。

返値 :

  成功時は`TRUE`。

### milter_client_context_delete_recipient ()

    gboolean            milter_client_context_delete_recipient
                                                            (MilterClientContext *context,
                                                             const gchar *recipient,
                                                             GError **error);

名前が`recipient`の宛先を削除します。"end-of-message"シグナルの中で呼ぶことができます。milter.orgのsmfi_delrcpt も見てください。

FIXME: MILTER_ACTION_DELETE_RECIPIENTについて書くこと。

`context` :

  `MilterClientContext`。

`recipient` :

  削除する宛先アドレス。

`error` :

  エラーを受け取る場所のアドレス、または`NULL`。

返値 :

  成功時は`TRUE`。

### milter_client_context_replace_body ()

    gboolean            milter_client_context_replace_body  (MilterClientContext *context,
                                                             const gchar *body,
                                                             gsize body_size,
                                                             GError **error);

現在のメッセージの本文を`body`で置き換えます。"end-of-message"シグナルの中で呼ぶことができます。milter.orgのsmfi_replacebody も見てください。

FIXME: MILTER_ACTION_CHANGE_BODYについて書くこと。

`context` :

  `MilterClientContext`。

`body` :

  新しい本文。

`body_size` :

  `body`のサイズ。

`error` :

  エラーを受け取る場所のアドレス、または`NULL`。

返値 :

  成功時は`TRUE`。

### milter_client_context_progress ()

    gboolean            milter_client_context_progress      (MilterClientContext *context);

このmilterはまだ処理中であることをMTAに通知します。"end-of-message"シグナルの中で呼ぶことができます。milter.orgのsmfi_progress も見てください。

`context` :

  `MilterClientContext`。

返値 :

  成功時は`TRUE`。

### milter_client_context_quarantine ()

    gboolean            milter_client_context_quarantine    (MilterClientContext *context,
                                                             const gchar *reason);

現在のメッセージを理由`reason`で隔離します。"end-of-message"シグナルの中で呼ぶことができます。milter.orgのsmfi_quarantine も見てください。

FIXME: MILTER_ACTION_QUARANTINEについて書くこと。

`context` :

  `MilterClientContext`。

`reason` :

  どうして現在のメッセージが隔離されるかの理由。

返値 :

  成功時は`TRUE`。

### milter_client_context_set_timeout ()

    void                milter_client_context_set_timeout   (MilterClientContext *context,
                                                             guint timeout);

秒単位でタイムアウトを設定します。MTAが`timeout`秒以内に応答しない場合は、"timeout"シグナルが発行されます。milter.orgのsmfi_settimeout も見てください。

`context` :

  `MilterClientContext`。

`timeout` :

  秒単位のタイムアウト。（既定値は7210秒）

### milter_client_context_get_timeout ()

    guint               milter_client_context_get_timeout   (MilterClientContext *context);

秒単位でタイムアウトを取得します。

`context` :

  `MilterClientContext`。

返値 :

  秒単位でのタイムアウト。

### milter_client_context_set_state ()

    void                milter_client_context_set_state     (MilterClientContext *context,
                                                             MilterClientContextState state);

現在の状態を設定します。

This is for testing. Don't use it directory for normal use.

`context` :

  `MilterClientContext`。

`state` :

  `MilterClientContextState`。

### milter_client_context_get_state ()

    MilterClientContextState milter_client_context_get_state
                                                            (MilterClientContext *context);

現在の状態を取得します。

This is for testing. Don't use it directory for normal use.

`context` :

  `MilterClientContext`。

返値 :

  現在の状態。

### milter_client_context_set_option ()

    void                milter_client_context_set_option    (MilterClientContext *context,
                                                             MilterOption *option);

現在のコンテキストのオプションを取得します。

`context` :

  `MilterClientContext`。

`option` :

  `MilterOption`。

### milter_client_context_get_option ()

    MilterOption *      milter_client_context_get_option    (MilterClientContext *context);

コンテキストに接続しているサーバのソケットアドレスを取得します。

`context` :

  `MilterClientContext`。

返値 :

  コンテキストに接続しているサーバのソケットアドレス。

## プロパティ詳細

### `"client"`プロパティ

      "client"                   MilterClient*         : Read / Write / Construct Only

コンテキストのクライアント。

### `"message-result"`プロパティ

      "message-result"           MilterMessageResult*  : Read / Write

クライアントコンテキストのメッセージの処理結果。

### `"option"`プロパティ。

      "option"                   MilterOption*         : Read / Write

クライントコンテキストのオプション。

### `"packet-buffer-size"`プロパティ

      "packet-buffer-size"       guint                 : Read / Write

クライアントコンテキストのパケットバッファサイズ。

デフォルト値: 0

### `"quarantine-reason"`プロパティ

      "quarantine-reason"        gchar*                : Read / Write

クライアントコンテキストの隔離理由。

デフォルト値: NULL

### `"state"`プロパティ

      "state"                    MilterClientContextState  : Read / Write

クライアントコンテキストの状態。

デフォルト値: MILTER_CLIENT_CONTEXT_STATE_INVALID

### `"status"`プロパティ

      "status"                   MilterStatus          : Read / Write

クライアントコンテキストのステータス。

デフォルト値: MILTER_STATUS_DEFAULT

## シグナル詳細

### `"abort"`シグナル

    MilterStatus        user_function                      (MilterClientContext     *context,
                                                            MilterClientContextState Returns,
                                                            gpointer                 user_data)      : Run Last

このシグナルは"envelope-from"から"end-of-message"の間のどこかのタイミングで呼び出される可能性があります。このシグナルはmilter内部でエラーが発生し、かつ、メッセージ処理が完了していないときだけ実行されます。例えば、milterが`MILTER_STATUS_ACCEPT`、`MILTER_STATUS_REJECT`、`MILTER_STATUS_DISCARD`、`MILTER_STATUS_TEMPORARY_FAILURE`を返しているときは、このシグナルは発行されません。

milterが"envelope-from"から"end-of-message"の間にメッセージのために割り当てたリソースがある場合は、このシグナルの中で開放してください。しかし、接続用に割り当てたリソースは開放しないでください。そのリソースは"finished"シグナルの中で開放してください。

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

`MILTER_STATUS_CONTINUE`

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

`MILTER_STATUS_DISCARD`

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

  "abort"は発行されません。

`MILTER_STATUS_ACCEPT`

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

  "abort"は発行されません。

`MILTER_STATUS_TEMPORARY_FAILURE`

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

  "abort"は発行されません。

`MILTER_STATUS_PROGRESS`

  It means that the processing in callback is in progress and returning response status is pending. The main loop for the milter is continued.

  このステータスを返すのは、"end-of-message-response"シグナルを自分で発行するということです。そのときは、上記のどれかの`MilterStatus`を一緒に渡してください。

  This status may be used for a milter that has IO wait. (e.g. The milter may need to connect to the its server like clamav-milter) Normally, this status will not be used.

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

`context` :

  シグナルを受け取るコンテキスト。

`user_data` :

  user data set when the signal handler was connected.

返値 :

  応答ステータス。

### `"abort-response"`シグナル

    void                user_function                      (MilterClientContext *context,
                                                            MilterStatus         status,
                                                            gpointer             user_data)      : Run Last

This signal is emitted implicitly after "abort" returns a status except `MILTER_STATUS_PROGRESS`. This signal's default handler replies a response to MTA. You don't need to connect this signal.

"abort"の中で`MILTER_STATUS_PROGRESS`を返した場合、自分でこのシグナルを`context`に発行しなければいけません。

`context` :

  シグナルを受け取るコンテキスト。

`status` :

  応答ステータス。

`user_data` :

  user data set when the signal handler was connected.

### `"body"`シグナル

    MilterStatus        user_function                      (MilterClientContext *context,
                                                            gchar               *chunk,
                                                            guint64              size,
                                                            gpointer             user_data)      : Run Last

このシグナルは本文のデータを受け取ったときに呼ばれます。このシグナルは"end-of-header"から"end-of-message"の間に0回以上発行されます。

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

`MILTER_STATUS_CONTINUE`

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

`MILTER_STATUS_REJECT`

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

  "abort"は発行されません。

`MILTER_STATUS_DISCARD`

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

  "abort"は発行されません。

`MILTER_STATUS_ACCEPT`

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

  "abort"は発行されません。

`MILTER_STATUS_TEMPORARY_FAILURE`

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

  "abort"は発行されません。

`MILTER_STATUS_SKIP`

  これ以上の本文の処理を省略します。"end-of-message"が発行されます。

`MILTER_STATUS_NO_REPLY`

  MTAに返答しません。

  milterは"negotiate"ハンドラの中で`MILTER_STEP_NO_REPLY_BODY`を設定しなければいけません。

`MILTER_STATUS_PROGRESS`

  It means that the processing in callback is in progress and returning response status is pending. The main loop for the milter is continued.

  このステータスを返すのは、"body-response"シグナルを自分で発行するということです。そのときは、上記のどれかの`MilterStatus`を一緒に渡してください。

  This status may be used for a milter that has IO wait. (e.g. The milter may need to connect to the its server like clamav-milter) Normally, this status will not be used.

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

`context` :

  シグナルを受け取るコンテキスト。

`chunk` :

  本文の1かたまり。

`size` :

  `chunk`のサイズ。

`user_data` :

  user data set when the signal handler was connected.

返値 :

  応答ステータス。

### `"body-response"`シグナル

    void                user_function                      (MilterClientContext *context,
                                                            MilterStatus         status,
                                                            gpointer             user_data)      : Run Last

This signal is emitted implicitly after "body" returns a status except `MILTER_STATUS_PROGRESS`. This signal's default handler replies a response to MTA. You don't need to connect this signal.

"body"で`MILTER_STATUS_PROGRESS`を返したなら、自分でこのシグナルを`context`に発行しなければいけません。

`context` :

  シグナルを受け取るコンテキスト。

`status` :

  応答ステータス。

`user_data` :

  user data set when the signal handler was connected.

### `"connect"`シグナル

    MilterStatus        user_function                      (MilterClientContext *context,
                                                            gchar               *host_name,
                                                            gpointer             address,
                                                            guint                address_size,
                                                            gpointer             user_data)         : Run Last

This signal is emitted on SMTP client is connected to MTA.

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

`MILTER_STATUS_CONTINUE`

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

`MILTER_STATUS_REJECT`

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

  "finished"が発行されるでしょう。

`MILTER_STATUS_ACCEPT`

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

  "finished"が発行されるでしょう。

`MILTER_STATUS_TEMPORARY_FAILURE`

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

  "finished"が発行されるでしょう。

`MILTER_STATUS_NO_REPLY`

  MTAに返答しません。

  milterは"negotiate"ハンドラの中で`MILTER_STEP_NO_REPLY_CONNECT`を設定しなければいけません。

`MILTER_STATUS_PROGRESS`

  It means that the processing in callback is in progress and returning response status is pending. The main loop for the milter is continued.

  If you returns this status, you need to emit "connect-response" signal by yourself with one of the above `MilterStatus`es.

  This status may be used for a milter that has IO wait. (e.g. The milter may need to connect to the its server like clamav-milter) Normally, this status will not be used.

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

`context` :

  シグナルを受け取るコンテキスト。

`host_name` :

  接続してきたSMTPクライアントのホスト名。

`address` :

  接続してきたSMTPクライアントのアドレス。（struct sockaddr）

`address_size` :

  `address`のサイズ。（socklen_t）

`user_data` :

  user data set when the signal handler was connected.

返値 :

  応答ステータス。

### The `"connect-response"` signal

    void                user_function                      (MilterClientContext *context,
                                                            MilterStatus         status,
                                                            gpointer             user_data)      : Run Last

This signal is emitted implicitly after "connect" returns a status except `MILTER_STATUS_PROGRESS`. This signal's default handler replies a response to MTA. You don't need to connect this signal.

"abort"の中で`MILTER_STATUS_PROGRESS`を返した場合、自分でこのシグナルを`context`に発行しなければいけません。

`context` :

  シグナルを受け取るコンテキスト。

`status` :

  応答ステータス。

`user_data` :

  user data set when the signal handler was connected.

### `"data"`シグナル

    MilterStatus        user_function                      (MilterClientContext *context,
                                                            gpointer             user_data)      : Run Last

このシグナルはSMTPの"DATA"コマンドのときに発行されます。

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

`MILTER_STATUS_CONTINUE`

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

`MILTER_STATUS_REJECT`

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

  "abort"は発行されません。

`MILTER_STATUS_DISCARD`

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

  "abort"は発行されません。

`MILTER_STATUS_ACCEPT`

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

  "abort"は発行されません。

`MILTER_STATUS_TEMPORARY_FAILURE`

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

  "abort"は発行されません。

`MILTER_STATUS_NO_REPLY`

  MTAに返答しません。

  milterは"negotiate"ハンドラの中で`MILTER_STEP_NO_REPLY_DATA`を設定しなければいけません。

`MILTER_STATUS_PROGRESS`

  It means that the processing in callback is in progress and returning response status is pending. The main loop for the milter is continued.

  If you returns this status, you need to emit "data-response" signal by yourself with one of the above `MilterStatus`es.

  This status may be used for a milter that has IO wait. (e.g. The milter may need to connect to the its server like clamav-milter) Normally, this status will not be used.

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

`context` :

  シグナルを受け取るコンテキスト。

`user_data` :

  user data set when the signal handler was connected.

返値 :

  応答ステータス。

### The `"data-response"` signal

    void                user_function                      (MilterClientContext *context,
                                                            MilterStatus         status,
                                                            gpointer             user_data)      : Run Last

This signal is emitted implicitly after "data" returns a status except `MILTER_STATUS_PROGRESS`. This signal's default handler replies a response to MTA. You don't need to connect this signal.

"abort"の中で`MILTER_STATUS_PROGRESS`を返した場合、自分でこのシグナルを`context`に発行しなければいけません。

`context` :

  シグナルを受け取るコンテキスト。

`status` :

  応答ステータス。

`user_data` :

  user data set when the signal handler was connected.

### The `"define-macro"` signal

    void                user_function                      (MilterClientContext *context,
                                                            MilterCommand        command,
                                                            gpointer             macros,
                                                            gpointer             user_data)      : Run Last

This signal is emitted when macro definition is received. Normally, this signal isn't needed to be connected.

`context` :

  シグナルを受け取るコンテキスト。

`command` :

  マクロが定義されるコマンド。

`macros` :

  マクロ定義。

`user_data` :

  user data set when the signal handler was connected.

### `"end-of-header"`シグナル

    MilterStatus        user_function                      (MilterClientContext *context,
                                                            gpointer             user_data)      : Run Last

このシグナルはすべてのヘッダが処理されたときに呼ばれます。

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

`MILTER_STATUS_CONTINUE`

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

`MILTER_STATUS_REJECT`

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

  "abort"は発行されません。

`MILTER_STATUS_DISCARD`

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

  "abort"は発行されません。

`MILTER_STATUS_ACCEPT`

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

  "abort"は発行されません。

`MILTER_STATUS_TEMPORARY_FAILURE`

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

  "abort"は発行されません。

`MILTER_STATUS_NO_REPLY`

  MTAに返答しません。

  milterは"negotiate"ハンドラの中で`MILTER_STEP_NO_REPLY_END_OF_HEADER`を設定しなければいけません。

`MILTER_STATUS_PROGRESS`

  It means that the processing in callback is in progress and returning response status is pending. The main loop for the milter is continued.

  このステータスを返すのは、"end-of-header-response"シグナルを自分で発行するということです。そのときは、上記のどれかの`MilterStatus`を一緒に渡してください。

  This status may be used for a milter that has IO wait. (e.g. The milter may need to connect to the its server like clamav-milter) Normally, this status will not be used.

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

`context` :

  シグナルを受け取るコンテキスト。

`user_data` :

  user data set when the signal handler was connected.

返値 :

  応答ステータス。

### The `"end-of-header-response"` signal

    void                user_function                      (MilterClientContext *context,
                                                            MilterStatus         status,
                                                            gpointer             user_data)      : Run Last

This signal is emitted implicitly after "end-of-header" returns a status except `MILTER_STATUS_PROGRESS`. This signal's default handler replies a response to MTA. You don't need to connect this signal.

"body"で`MILTER_STATUS_PROGRESS`を返したなら、自分でこのシグナルを`context`に発行しなければいけません。

`context` :

  シグナルを受け取るコンテキスト。

`status` :

  応答ステータス。

`user_data` :

  user data set when the signal handler was connected.

### The `"end-of-message"` signal

    MilterStatus        user_function                      (MilterClientContext *context,
                                                            gchar               *Returns,
                                                            guint64              arg2,
                                                            gpointer             user_data)      : Run Last

このシグナルはすべての"body"が発行された後に発行されます。すべてのメッセージ変更はこのシグナルの中出だけ実行できます。変更は`milter_client_context_add_header()`、`milter_client_context_change_from()`などで行えます。

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

`MILTER_STATUS_CONTINUE`

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

`MILTER_STATUS_DISCARD`

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

  "abort"は発行されません。

`MILTER_STATUS_ACCEPT`

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

  "abort"は発行されません。

`MILTER_STATUS_TEMPORARY_FAILURE`

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

  "abort"は発行されません。

`MILTER_STATUS_PROGRESS`

  It means that the processing in callback is in progress and returning response status is pending. The main loop for the milter is continued.

  このステータスを返すのは、"end-of-message-response"シグナルを自分で発行するということです。そのときは、上記のどれかの`MilterStatus`を一緒に渡してください。

  This status may be used for a milter that has IO wait. (e.g. The milter may need to connect to the its server like clamav-milter) Normally, this status will not be used.

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

`context` :

  シグナルを受け取るコンテキスト。

`user_data` :

  user data set when the signal handler was connected.

返値 :

  応答ステータス。

### `"end-of-message-response"`シグナル

    void                user_function                      (MilterClientContext *context,
                                                            MilterStatus         status,
                                                            gpointer             user_data)      : Run Last

This signal is emitted implicitly after "end-of-message" returns a status except `MILTER_STATUS_PROGRESS`. This signal's default handler replies a response to MTA. You don't need to connect this signal.

"body"で`MILTER_STATUS_PROGRESS`を返したなら、自分でこのシグナルを`context`に発行しなければいけません。

`context` :

  シグナルを受け取るコンテキスト。

`status` :

  応答ステータス。

`user_data` :

  user data set when the signal handler was connected.

### `"envelope-from"`シグナル

    MilterStatus        user_function                      (MilterClientContext *context,
                                                            gchar               *from,
                                                            gpointer             user_data)      : Run Last

このシグナルはSMTPの"MAIL FROM"コマンドのときに呼ばれます。

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

`MILTER_STATUS_CONTINUE`

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

`MILTER_STATUS_REJECT`

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

  "abort"は発行されません。

`MILTER_STATUS_DISCARD`

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

  "abort"は発行されません。

`MILTER_STATUS_ACCEPT`

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

  "abort"は発行されません。

`MILTER_STATUS_TEMPORARY_FAILURE`

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

  "abort"は発行されません。

`MILTER_STATUS_NO_REPLY`

  MTAに返答しません。

  milterは"negotiate"ハンドラの中で`MILTER_STEP_NO_REPLY_BODY`を設定しなければいけません。

`MILTER_STATUS_PROGRESS`

  It means that the processing in callback is in progress and returning response status is pending. The main loop for the milter is continued.

  If you returns this status, you need to emit "envelope-from-response" signal by yourself with one of the above `MilterStatus`es.

  This status may be used for a milter that has IO wait. (e.g. The milter may need to connect to the its server like clamav-milter) Normally, this status will not be used.

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

`context` :

  シグナルを受け取るコンテキスト。

`from` :

  SMTPの"MAIL FROM"コマンドの送信アドレス。

`user_data` :

  user data set when the signal handler was connected.

返値 :

  応答ステータス。

### `"envelope-from-response"`シグナル

    void                user_function                      (MilterClientContext *context,
                                                            MilterStatus         status,
                                                            gpointer             user_data)      : Run Last

This signal is emitted implicitly after "envelope-from" returns a status except `MILTER_STATUS_PROGRESS`. This signal's default handler replies a response to MTA. You don't need to connect this signal.

"abort"の中で`MILTER_STATUS_PROGRESS`を返した場合、自分でこのシグナルを`context`に発行しなければいけません。

`context` :

  シグナルを受け取るコンテキスト。

`status` :

  応答ステータス。

`user_data` :

  user data set when the signal handler was connected.

### `"envelope-recipient"`シグナル

    MilterStatus        user_function                      (MilterClientContext *context,
                                                            gchar               *recipient,
                                                            gpointer             user_data)      : Run Last

このシグナルはSMTPの"RCPT TO"コマンドのときに発行されます。

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

`MILTER_STATUS_CONTINUE`

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

`MILTER_STATUS_REJECT`

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

  "abort"は発行されません。

`MILTER_STATUS_DISCARD`

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

  "abort"は発行されません。

`MILTER_STATUS_ACCEPT`

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

  "abort"は発行されません。

`MILTER_STATUS_TEMPORARY_FAILURE`

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

  "abort"は発行されません。

`MILTER_STATUS_NO_REPLY`

  MTAに返答しません。

  milterは"negotiate"ハンドラの中で`MILTER_STEP_NO_REPLY_CONNECT`を設定しなければいけません。

`MILTER_STATUS_PROGRESS`

  It means that the processing in callback is in progress and returning response status is pending. The main loop for the milter is continued.

  If you returns this status, you need to emit "envelope-recipient-response" signal by yourself with one of the above `MilterStatus`es.

  This status may be used for a milter that has IO wait. (e.g. The milter may need to connect to the its server like clamav-milter) Normally, this status will not be used.

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

`context` :

  シグナルを受け取るコンテキスト。

`recipient` :

  SMTPの"RCPT TO"コマンドの宛先アドレス。

`user_data` :

  user data set when the signal handler was connected.

返値 :

  応答ステータス。

### `"envelope-recipient-response"`シグナル

    void                user_function                      (MilterClientContext *context,
                                                            MilterStatus         status,
                                                            gpointer             user_data)      : Run Last

This signal is emitted implicitly after "envelope-recipient" returns a status except `MILTER_STATUS_PROGRESS`. This signal's default handler replies a response to MTA. You don't need to connect this signal.

"abort"の中で`MILTER_STATUS_PROGRESS`を返した場合、自分でこのシグナルを`context`に発行しなければいけません。

`context` :

  シグナルを受け取るコンテキスト。

`status` :

  応答ステータス。

`user_data` :

  user data set when the signal handler was connected.

### `"header"`シグナル。

    MilterStatus        user_function                      (MilterClientContext *context,
                                                            gchar               *name,
                                                            gchar               *value,
                                                            gpointer             user_data)      : Run Last

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

例:

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

`MILTER_STEP_HEADER_VALUE_WITH_LEADING_SPACE`あり:

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

`MILTER_STEP_HEADER_VALUE_WITH_LEADING_SPACE`なし:

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

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

`MILTER_STATUS_CONTINUE`

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

`MILTER_STATUS_REJECT`

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

  "abort"は発行されません。

`MILTER_STATUS_DISCARD`

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

  "abort"は発行されません。

`MILTER_STATUS_ACCEPT`

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

  "abort"は発行されません。

`MILTER_STATUS_TEMPORARY_FAILURE`

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

  "abort"は発行されません。

`MILTER_STATUS_NO_REPLY`

  MTAに返答しません。

  milterは"negotiate"ハンドラの中で`MILTER_STEP_NO_REPLY_END_OF_HEADER`を設定しなければいけません。

`MILTER_STATUS_PROGRESS`

  It means that the processing in callback is in progress and returning response status is pending. The main loop for the milter is continued.

  If you returns this status, you need to emit "header-response" signal by yourself with one of the above `MilterStatus`es.

  This status may be used for a milter that has IO wait. (e.g. The milter may need to connect to the its server like clamav-milter) Normally, this status will not be used.

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

`context` :

  シグナルを受け取るコンテキスト。

`name` :

  ヘッダ名。

`value` :

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

`user_data` :

  user data set when the signal handler was connected.

返値 :

  応答ステータス。

### `"header-response"`シグナル。

    void                user_function                      (MilterClientContext *context,
                                                            MilterStatus         status,
                                                            gpointer             user_data)      : Run Last

This signal is emitted implicitly after "header" returns a status except `MILTER_STATUS_PROGRESS`. This signal's default handler replies a response to MTA. You don't need to connect this signal.

"abort"の中で`MILTER_STATUS_PROGRESS`を返した場合、自分でこのシグナルを`context`に発行しなければいけません。

`context` :

  シグナルを受け取るコンテキスト。

`status` :

  応答ステータス。

`user_data` :

  user data set when the signal handler was connected.

### `"helo"`シグナル

    MilterStatus        user_function                      (MilterClientContext *context,
                                                            gchar               *fqdn,
                                                            gpointer             user_data)      : Run Last

このシグナルはSMTPの"HELO"/"EHLO"コマンドのときに発行されます。

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

`MILTER_STATUS_CONTINUE`

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

`MILTER_STATUS_REJECT`

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

  "finished"が発行されるでしょう。

`MILTER_STATUS_ACCEPT`

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

  "finished"が発行されるでしょう。

`MILTER_STATUS_TEMPORARY_FAILURE`

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

  "finished"が発行されるでしょう。

`MILTER_STATUS_NO_REPLY`

  MTAに返答しません。

  milterは"negotiate"ハンドラの中で`MILTER_STEP_NO_REPLY_BODY`を設定しなければいけません。

`MILTER_STATUS_PROGRESS`

  It means that the processing in callback is in progress and returning response status is pending. The main loop for the milter is continued.

  If you returns this status, you need to emit "helo-response" signal by yourself with one of the above `MilterStatus`es.

  This status may be used for a milter that has IO wait. (e.g. The milter may need to connect to the its server like clamav-milter) Normally, this status will not be used.

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

`context` :

  シグナルを受け取るコンテキスト。

`fqdn` :

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

`user_data` :

  user data set when the signal handler was connected.

返値 :

  応答ステータス。

### `"helo-response"`シグナル

    void                user_function                      (MilterClientContext *context,
                                                            MilterStatus         status,
                                                            gpointer             user_data)      : Run Last

This signal is emitted implicitly after "helo" returns a status except `MILTER_STATUS_PROGRESS`. This signal's default handler replies a response to MTA. You don't need to connect this signal.

"body"で`MILTER_STATUS_PROGRESS`を返したなら、自分でこのシグナルを`context`に発行しなければいけません。

`context` :

  シグナルを受け取るコンテキスト。

`status` :

  応答ステータス。

`user_data` :

  user data set when the signal handler was connected.

### `"message-processed"`シグナル

    void                user_function                      (MilterClientContext *milterclientcontext,
                                                            MilterMessageResult *arg1,
                                                            gpointer             user_data)                : Run Last

`milterclientcontext` :

  the object which received the signal.

`user_data` :

  user data set when the signal handler was connected.

### `"negotiate"`シグナル

    MilterStatus        user_function                      (MilterClientContext  *context,
                                                            MilterOption         *option,
                                                            MilterMacrosRequests *macros_requests,
                                                            gpointer              user_data)            : Run Last

This signal is emitted on negotiate request from MTA. If you want to modify actions (`MilterActionFlags`) and steps (`MilterStepFlags`), you modify `option`. If you want to add macros that you want to receive, you modify `macros_requests`.

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

`MILTER_STATUS_ALL_OPTIONS`

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

`MILTER_STATUS_REJECT`

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

`MILTER_STATUS_CONTINUE`

  `option`と`macros_requests`で指定されたアクション、ステップ、要求マクロリストを使って現在のセッションの処理を続けます

`MILTER_STATUS_PROGRESS`

  It means that the processing in callback is in progress and returning response status is pending. The main loop for the milter is continued.

  If you returns this status, you need to emit "negotiate-response" signal by yourself with one of the above `MilterStatus`es.

  This status may be used for a milter that has IO wait. (e.g. The milter may need to connect to the its server like clamav-milter) Normally, this status will not be used.

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

`context` :

  シグナルを受け取るコンテキスト。

`option` :

  MTAからのネゴシエーションのオプション。

`macros_requests` :

  要求マクロリスト。

`user_data` :

  user data set when the signal handler was connected.

返値 :

  応答ステータス。

### `"negotiate-response"`シグナル

    void                user_function                      (MilterClientContext  *context,
                                                            MilterOption         *option,
                                                            MilterMacrosRequests *macros_requests,
                                                            MilterStatus          status,
                                                            gpointer              user_data)            : Run Last

This signal is emitted implicitly after "negotiate" returns a status except `MILTER_STATUS_PROGRESS`. This signal's default handler replies a response to MTA. You don't need to connect this signal.

"abort"の中で`MILTER_STATUS_PROGRESS`を返した場合、自分でこのシグナルを`context`に発行しなければいけません。

`context` :

  シグナルを受け取るコンテキスト。

`option` :

  MTAからのネゴシエーションのオプション。

`macros_requests` :

  要求マクロリスト。

`status` :

  応答ステータス。

`user_data` :

  user data set when the signal handler was connected.

### The `"timeout"` signal

    void                user_function                      (MilterClientContext *context,
                                                            gpointer             user_data)      : Run Last

This signal is emitted if MTA doesn't return the next command within `milter_client_context_get_timeout()` seconds. If "timeout" is emitted, the current connection is aborted and "finished" are emitted. "abort" may be emitted before "finished" if the milter is processing a message.

`context` :

  シグナルを受け取るコンテキスト。

`user_data` :

  user data set when the signal handler was connected.

### The `"unknown"` signal

    MilterStatus        user_function                      (MilterClientContext *context,
                                                            gchar               *command,
                                                            gpointer             user_data)      : Run Last

このシグナルは未知のSMTPコマンドまたは未実装のSMTPコマンドが送られてきた場合に発行されます。

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

`MILTER_STATUS_REJECT`

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

  "abort"は発行されません。

`MILTER_STATUS_TEMPORARY_FAILURE`

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

  "abort"は発行されません。

`MILTER_STATUS_NO_REPLY`

  MTAに返答しません。

  milterは"negotiate"ハンドラの中で`MILTER_STEP_NO_REPLY_DATA`を設定しなければいけません。

`MILTER_STATUS_PROGRESS`

  It means that the processing in callback is in progress and returning response status is pending. The main loop for the milter is continued.

  If you returns this status, you need to emit "unknown-response" signal by yourself with one of the above `MilterStatus`es.

  This status may be used for a milter that has IO wait. (e.g. The milter may need to connect to the its server like clamav-milter) Normally, this status will not be used.

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

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

`context` :

  シグナルを受け取るコンテキスト。

`command` :

  未知のSMTPコマンド。

`user_data` :

  user data set when the signal handler was connected.

返値 :

  応答ステータス。

### The `"unknown-response"` signal

    void                user_function                      (MilterClientContext *context,
                                                            MilterStatus         status,
                                                            gpointer             user_data)      : Run Last

This signal is emitted implicitly after "unknown" returns a status except `MILTER_STATUS_PROGRESS`. This signal's default handler replies a response to MTA. You don't need to connect this signal.

"body"で`MILTER_STATUS_PROGRESS`を返したなら、自分でこのシグナルを`context`に発行しなければいけません。

`context` :

  シグナルを受け取るコンテキスト。

`status` :

  応答ステータス。

`user_data` :

  user data set when the signal handler was connected.