Top | ![]() |
![]() |
![]() |
![]() |
MilterClient * | client | Read / Write / Construct Only |
MilterMessageResult * | message-result | Read / Write |
MilterOption * | option | Read / Write |
guint | packet-buffer-size | Read / Write |
gchar * | quarantine-reason | Read / Write |
MilterClientContextState | state | Read / Write |
MilterStatus | status | Read / Write |
#define | MILTER_CLIENT_CONTEXT_ERROR |
enum | MilterClientContextError |
enum | MilterClientContextState |
GEnum ├── MilterClientContextError ╰── MilterClientContextState GObject ╰── MilterAgent ╰── MilterProtocolAgent ╰── MilterClientContext
MilterClientContext
は1つのmilterプロトコルセッションを処理します。これはMilterClientContext
インスタンスは各milterプロトコルセッション毎に生成されるということです。
各milterプロトコルコマンドを処理するために、MilterClientContext
のシグナルに接続します。MilterClientContext
にはmilterプロトコルのイベントに対応したシグナルがあります。
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.
以下はシグナルに接続する例です。すべてのシグナルに接続して、各シグナルハンドラはイベント名を表示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 |
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 } |
#define MILTER_CLIENT_CONTEXT_STATE_IN_MESSAGE_PROCESSING(state)
MilterClientContext *
milter_client_context_new (MilterClient *client
);
Creates a new context object. Normally, context object is
created by MilterClient
and passed by
“connection-established” signal.
gboolean milter_client_context_feed (MilterClientContext *context
,const gchar *chunk
,gsize size
,GError **error
);
Feeds a chunk to the context
. You can use it for testing
or debugging.
context |
||
chunk |
the string to be fed to |
|
size |
the size of |
|
error |
エラーを受け取る場所のアドレス、または |
gpointer
milter_client_context_get_private_data
(MilterClientContext *context
);
Gets the private data of the context
.
void milter_client_context_set_private_data (MilterClientContext *context
,gpointer data
,GDestroyNotify destroy
);
Sets the private data of the context
. data
is
destroyed by destroy
when data
is unset. data
is unset
when new private data is set or context
is destroyed.
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も見てください。
gchar *
milter_client_context_format_reply (MilterClientContext *context
);
milter_client_context_set_reply()
で指定された現在のエラー応答コードを整形します。エラー応答コードが設定されていない場合は、NULL
を返します。
gboolean milter_client_context_add_header (MilterClientContext *context
,const gchar *name
,const gchar *value
,GError **error
);
Adds a header to the current message's header list. This function can be called in “end-of-message” signal.
milter.orgの smfi_addheaderも見てください。
FIXME: MILTER_ACTION_ADD_HEADERS
について書くこと。
gboolean milter_client_context_insert_header (MilterClientContext *context
,guint32 index
,const gchar *name
,const gchar *value
,GError **error
);
Inserts a header into the current message's header lists
at index
. This function can be called in
“end-of-message” signal. See also
smfi_insheader on milter.org.
FIXME: MILTER_ACTION_ADD_HEADERSについて書くこと。
gboolean milter_client_context_change_header (MilterClientContext *context
,const gchar *name
,guint32 index
,const gchar *value
,GError **error
);
Changes a header that is located at index
in headers
that all of them are named name
. If value
is NULL
, the
header is deleted. This function can be
called in “end-of-message” signal.
milter.orgの smfi_chgheaderも見てください。
FIXME: MILTER_ACTION_CHANGE_HEADERSについて書くこと。
gboolean milter_client_context_delete_header (MilterClientContext *context
,const gchar *name
,guint32 index
,GError **error
);
Deletes a header that is located at index
in headers
that all of them are named name
. This function can be
called in “end-of-message” signal.
This function works same as
milter_client_context_change_header()
with NULL
as
value
.
FIXME: MILTER_ACTION_CHANGE_HEADERSについて書くこと。
context |
||
name |
ヘッダ名。 |
|
index |
the index of headers that all of them are named
|
|
error |
エラーを受け取る場所のアドレス、または |
gboolean milter_client_context_change_from (MilterClientContext *context
,const gchar *from
,const gchar *parameters
,GError **error
);
Changes the envelope from address of the current message.
ESMTP's 'MAIL FROM' parameter can be set by
parameters
. parameters
may be NULL
. This function can be
called in “end-of-message” signal.
See also smfi_chgfrom
on milter.org.
FIXME: MILTER_ACTION_CHANGE_FROMについて書くこと。
gboolean milter_client_context_add_recipient (MilterClientContext *context
,const gchar *recipient
,const gchar *parameters
,GError **error
);
Adds a new envelope recipient address to the current
message. ESMTP's 'RCPT TO' parameter can be set by
parameters
. parameters
may be NULL
. This function can
be called in “end-of-message”
signal. See also smfi_addrcpt
and smfi_addrcpt_par
on milter.org.
FIXME: MILTER_ACTION_ADD_RECIPIENTとMILTER_ACTION_ADD_ENVELOPE_RECIPIENT_WITH_PARAMETERSについて書くこと。
gboolean milter_client_context_delete_recipient (MilterClientContext *context
,const gchar *recipient
,GError **error
);
Removes a envelope recipient that named recipient
. This
function can be called in
“end-of-message” signal. See also
smfi_delrcpt
on milter.org.
FIXME: MILTER_ACTION_DELETE_RECIPIENTについて書くこと。
gboolean milter_client_context_replace_body (MilterClientContext *context
,const gchar *body
,gsize body_size
,GError **error
);
Replaces the body of the current message with body
. This
function can be called in
“end-of-message” signal. See also
smfi_replacebody
on milter.org.
FIXME: MILTER_ACTION_CHANGE_BODYについて書くこと。
gboolean
milter_client_context_progress (MilterClientContext *context
);
Notifies the MTA that this milter is still in progress. This function can be called in “end-of-message” signal. See also smfi_progress on milter.org.
gboolean milter_client_context_quarantine (MilterClientContext *context
,const gchar *reason
);
Quarantines the current message with reason
. This
function can be called in
“end-of-message” signal. See also
smfi_quarantine
on milter.org.
FIXME: MILTER_ACTION_QUARANTINEについて書くこと。
void milter_client_context_set_timeout (MilterClientContext *context
,guint timeout
);
Sets the timeout by seconds. If MTA doesn't responses in
timeout
seconds, “timeout”
signal is emitted. See also
smfi_settimeout
on milter.org.
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_quarantine_reason (MilterClientContext *context
,const gchar *reason
);
Sets the quarantine reason.
const gchar *
milter_client_context_get_quarantine_reason
(MilterClientContext *context
);
Gets the quarantine reason.
MilterClientContextState
milter_client_context_get_last_state (MilterClientContext *context
);
Gets the last state. It's one of start, negotiate, connect, helo, envelope-from, envelope-recipient, data, unknown, header, end-of-header, body and end-of-message.
void milter_client_context_set_status (MilterClientContext *context
,MilterStatus status
);
Sets the current status.
MilterStatus
milter_client_context_get_status (MilterClientContext *context
);
現在の状態を取得します。
void milter_client_context_set_option (MilterClientContext *context
,MilterOption *option
);
現在のコンテキストのオプションを取得します。
MilterOption *
milter_client_context_get_option (MilterClientContext *context
);
コンテキストに接続しているサーバのソケットアドレスを取得します。
void milter_client_context_set_socket_address (MilterClientContext *context
,MilterGenericSocketAddress *address
);
Sets the socket address of connected server for the context.
MilterGenericSocketAddress *
milter_client_context_get_socket_address
(MilterClientContext *context
);
MilterMessageResult *
milter_client_context_get_message_result
(MilterClientContext *context
);
Gets the message result of context
.
void milter_client_context_set_message_result (MilterClientContext *context
,MilterMessageResult *result
);
Sets the message result of context
.
void
milter_client_context_reset_message_related_data
(MilterClientContext *context
);
Resets message related data of context
.
Normally, you don't need to call this function.
guint
milter_client_context_get_n_processing_sessions
(MilterClientContext *context
);
Returns number of the current processing sessions.
void milter_client_context_set_packet_buffer_size (MilterClientContext *context
,guint size
);
Sets the packet buffer size for the context. Packets on end-of-message are buffered until the buffer size is full. Packet buffering is for performance.
guint
milter_client_context_get_packet_buffer_size
(MilterClientContext *context
);
Gets the packet buffer size for the context.
void milter_client_context_set_mail_transaction_shelf_value (MilterClientContext *context
,const gchar *key
,const gchar *value
);
Sets the string for the mail_transaction_shelf.
const gchar * milter_client_context_get_mail_transaction_shelf_value (MilterClientContext *context
,const gchar *key
);
Gets the string for the mail_transaction_shelf.
GHashTable *
milter_client_context_get_mail_transaction_shelf
(MilterClientContext *context
);
Gets the mail_transaction_shelf. This is a mail-transaction scope storage.
void
milter_client_context_clear_mail_transaction_shelf
(MilterClientContext *context
);
Remove all keys and values from mail_transaction_shelf.
void milter_client_context_mail_transaction_shelf_foreach (MilterClientContext *context
,GHFunc func
,gpointer user_data
);
A wrapper for g_hash_table_foreach()
.
#define MILTER_CLIENT_CONTEXT_ERROR (milter_client_context_error_quark())
MilterClientContextのエラー用のGErrorクォークを取得するために使われます。
MilterClientContext
の関数呼び出し中に発生するエラーを識別します。
|
||
milterプロトコルデータの読み書き時に発生した入出力エラーを示します。 |
||
予期しない場所で |
||
現在の |
||
コンテキストの |
||
MilterClientContext
の状態を識別します。
不正な状態。 |
||
はじまったばかり。 |
||
ネゴシエーションを開始。 |
||
ネゴシエーション応答を受信した |
||
接続情報を送信しました。 |
||
接続情報への応答を受信した。 |
||
HELOコマンドの開始。 |
||
HELOコマンドへの応答を受信した。 |
||
MAIL FROMコマンド開始。 |
||
MAIL FROMコマンドへの応答を受信した。 |
||
RCPT TOコマンドの開始。 |
||
RCPT TOコマンドへの応答を受信した。 |
||
DATAコマンドの開始。 |
||
DATAコマンドへの応答を受信した。 |
||
未知のSMTPコマンドの受信。 |
||
未知のSMTPコマンドへの応答を受信した。 |
||
ヘッダを送信した。 |
||
ヘッダへの応答を受信した。 |
||
すべてのヘッダを送信した。 |
||
ヘッダ終了への応答を受信した。 |
||
本体のかたまりの送信。 |
||
本体への応答を受信した。 |
||
すべての本文を送信した。 |
||
メッセージ終了への応答を受信した。 |
||
正常終了の開始。 |
||
正常終了への応答を受信した。 |
||
異常終了の開始。 |
||
異常終了への応答を受信した。 |
||
終了した。 |
“message-result”
property “message-result” MilterMessageResult *
クライアントコンテキストのメッセージの処理結果。
Flags: Read / Write
“packet-buffer-size”
property“packet-buffer-size” guint
クライアントコンテキストのパケットバッファサイズ。
Flags: Read / Write
デフォルト値: 0
“quarantine-reason”
property“quarantine-reason” gchar *
クライアントコンテキストの隔離理由。
Flags: Read / Write
デフォルト値: NULL
“state”
property“state” MilterClientContextState
クライアントコンテキストの状態。
Flags: Read / Write
デフォルト値: MILTER_CLIENT_CONTEXT_STATE_INVALID
“status”
property“status” MilterStatus
クライアントコンテキストのステータス。
Flags: Read / Write
デフォルト値: MILTER_STATUS_DEFAULT
“abort”
signalMilterStatus user_function (MilterClientContext *context, MilterClientContextState Returns, gpointer user_data)
Flags: Run Last
“abort-response”
signalvoid user_function (MilterClientContext *context, MilterStatus status, gpointer user_data)
Flags: Run Last
“body”
signalMilterStatus user_function (MilterClientContext *context, gchar *chunk, guint64 size, gpointer user_data)
Flags: Run Last
“body-response”
signalvoid user_function (MilterClientContext *context, MilterStatus status, gpointer user_data)
Flags: Run Last
“connect”
signalMilterStatus user_function (MilterClientContext *context, gchar *host_name, gpointer address, guint address_size, gpointer user_data)
Flags: Run Last
“connect-response”
signalvoid user_function (MilterClientContext *context, MilterStatus status, gpointer user_data)
Flags: Run Last
“data”
signalMilterStatus user_function (MilterClientContext *context, gpointer user_data)
Flags: Run Last
“data-response”
signalvoid user_function (MilterClientContext *context, MilterStatus status, gpointer user_data)
Flags: Run Last
“define-macro”
signalvoid user_function (MilterClientContext *context, MilterCommand command, gpointer macros, gpointer user_data)
Flags: Run Last
“end-of-header”
signalMilterStatus user_function (MilterClientContext *context, gpointer user_data)
Flags: Run Last
“end-of-header-response”
signalvoid user_function (MilterClientContext *context, MilterStatus status, gpointer user_data)
Flags: Run Last
“end-of-message”
signalMilterStatus user_function (MilterClientContext *context, gchar *Returns, guint64 arg2, gpointer user_data)
Flags: Run Last
“end-of-message-response”
signalvoid user_function (MilterClientContext *context, MilterStatus status, gpointer user_data)
Flags: Run Last
“envelope-from”
signalMilterStatus user_function (MilterClientContext *context, gchar *from, gpointer user_data)
Flags: Run Last
“envelope-from-response”
signalvoid user_function (MilterClientContext *context, MilterStatus status, gpointer user_data)
Flags: Run Last
“envelope-recipient”
signalMilterStatus user_function (MilterClientContext *context, gchar *recipient, gpointer user_data)
Flags: Run Last
“envelope-recipient-response”
signalvoid user_function (MilterClientContext *context, MilterStatus status, gpointer user_data)
Flags: Run Last
“header”
signalMilterStatus user_function (MilterClientContext *context, gchar *name, gchar *value, gpointer user_data)
Flags: Run Last
“header-response”
signalvoid user_function (MilterClientContext *context, MilterStatus status, gpointer user_data)
Flags: Run Last
“helo”
signalMilterStatus user_function (MilterClientContext *context, gchar *fqdn, gpointer user_data)
Flags: Run Last
“helo-response”
signalvoid user_function (MilterClientContext *context, MilterStatus status, gpointer user_data)
Flags: Run Last
“message-processed”
signalvoid user_function (MilterClientContext *milterclientcontext, MilterMessageResult *arg1, gpointer user_data)
Flags: Run Last
“negotiate”
signalMilterStatus user_function (MilterClientContext *context, MilterOption *option, MilterMacrosRequests *macros_requests, gpointer user_data)
Flags: Run Last
“negotiate-response”
signalvoid user_function (MilterClientContext *context, MilterOption *option, MilterMacrosRequests *macros_requests, MilterStatus status, gpointer user_data)
Flags: Run Last
“timeout”
signalvoid user_function (MilterClientContext *context, gpointer user_data)
Flags: Run Last
“unknown”
signalMilterStatus user_function (MilterClientContext *context, gchar *command, gpointer user_data)
Flags: Run Last
“unknown-response”
signalvoid user_function (MilterClientContext *context, MilterStatus status, gpointer user_data)
Flags: Run Last