Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

2216 lines
72 KiB

//+------------------------------------------------------------
//
// Copyright (C) 1999, Microsoft Corporation
//
// File: smtpevent.idl
//
// Contents: SMTP Server Event interfaces
//
// Description: This file contains the interface definitions for the
// SMTP Server Events.
//
//-------------------------------------------------------------
cpp_quote("#ifndef __SMTPEVENT_H__")
cpp_quote("#define __SMTPEVENT_H__")
import "unknwn.idl";
import "wtypes.idl";
import "ocidl.idl";
import "mailmsg.idl";
//+------------------------------------------------------------
//
// The SMTP Protocol events interfaces:
//
//-------------------------------------------------------------
cpp_quote("//")
cpp_quote("// Define sink return codes")
cpp_quote("//")
cpp_quote("#define EXPE_S_CONSUMED 0x00000002")
cpp_quote("//")
cpp_quote("// Define well-known status codes")
cpp_quote("//")
cpp_quote("#define EXPE_SUCCESS 0x00000000")
cpp_quote("#define EXPE_NOT_PIPELINED 0x00000000")
cpp_quote("#define EXPE_PIPELINED 0x00000001")
cpp_quote("#define EXPE_REPEAT_COMMAND 0x00000002")
cpp_quote("#define EXPE_BLOB_READY 0x00000004")
cpp_quote("#define EXPE_BLOB_DONE 0x00000008")
cpp_quote("#define EXPE_DROP_SESSION 0x00010000")
cpp_quote("#define EXPE_CHANGE_STATE 0x00020000")
cpp_quote("#define EXPE_TRANSIENT_FAILURE 0x00040000")
cpp_quote("#define EXPE_COMPLETE_FAILURE 0x00080000")
cpp_quote("#define EXPE_UNHANDLED 0xffffffff")
cpp_quote("//")
cpp_quote("// Define constants for next states")
cpp_quote("//")
cpp_quote("typedef enum _PE_STATES")
cpp_quote("{")
cpp_quote(" PE_STATE_DEFAULT = 0,")
cpp_quote(" PE_STATE_SESSION_START,")
cpp_quote(" PE_STATE_MESSAGE_START,")
cpp_quote(" PE_STATE_PER_RECIPIENT,")
cpp_quote(" PE_STATE_DATA_OR_BDAT,")
cpp_quote(" PE_STATE_SESSION_END,")
cpp_quote(" PE_STATE_MAX_STATES = PE_STATE_SESSION_END")
cpp_quote("")
cpp_quote("} PE_STATES;")
cpp_quote("//")
cpp_quote("// Define macros for checking SMTP return code classes")
cpp_quote("//")
cpp_quote("#define IsSmtpPreliminarySuccess(x) ((((x) % 100) == 1)?TRUE:FALSE)")
cpp_quote("#define IsSmtpCompleteSuccess(x) ((((x) % 100) == 2)?TRUE:FALSE)")
cpp_quote("#define IsSmtpIntermediateSuccess(x) ((((x) % 100) == 3)?TRUE:FALSE)")
cpp_quote("#define IsSmtpTransientFailure(x) ((((x) % 100) == 4)?TRUE:FALSE)")
cpp_quote("#define IsSmtpCompleteFailure(x) ((((x) % 100) == 5)?TRUE:FALSE)")
cpp_quote("//")
cpp_quote("// Define well known IServer property IDs")
cpp_quote("//")
cpp_quote("#define PE_ISERVID_DW_INSTANCE 0")
cpp_quote("#define PE_ISERVID_SZ_DEFAULTDOMAIN 1")
cpp_quote("#define PE_ISERVID_DW_CATENABLE 2")
cpp_quote("#define PE_ISERVID_DW_CATFLAGS 3")
cpp_quote("#define PE_ISERVID_DW_CATPORT 4")
cpp_quote("#define PE_ISERVID_SZ_CATUSER 5")
cpp_quote("#define PE_ISERVID_SZ_CATSCHEMA 6")
cpp_quote("#define PE_ISERVID_SZ_CATBINDTYPE 7")
cpp_quote("#define PE_ISERVID_SZ_CATPASSWORD 8")
cpp_quote("#define PE_ISERVID_SZ_CATDOMAIN 9")
cpp_quote("#define PE_ISERVID_SZ_CATNAMINGCONTEXT 10")
cpp_quote("#define PE_ISERVID_SZ_CATDSTYPE 11")
cpp_quote("#define PE_ISERVID_SZ_CATDSHOST 12")
cpp_quote("//")
cpp_quote("// Define well known ISession property IDs")
cpp_quote("//")
cpp_quote("#define ISESSION_PID_IS_SESSION_AUTHENTICATED 0")
cpp_quote("#define ISESSION_PID_AUTHENTICATED_USERNAME 1")
cpp_quote("#define ISESSION_PID_REMOTE_SERVER_NAME 2")
cpp_quote("#define ISESSION_PID_ANONYMOUS_AUTH 3")
cpp_quote("#define ISESSION_PID_MAY_RELAY 4")
cpp_quote("#define ISESSION_PID_LOCAL_IP_ADDRESS 5")
cpp_quote("#define ISESSION_PID_REMOTE_IP_ADDRESS 6")
cpp_quote("//")
cpp_quote("// Define well known ISession for outbound property IDs")
cpp_quote("//")
cpp_quote("// Route Address as returned by GetNextHop")
cpp_quote("#define ISESSION_PID_OUT_ROUTE_ADDRESS 100")
cpp_quote("// Connector Name as returned by GetNextHop")
cpp_quote("#define ISESSION_PID_OUT_CONNECTOR_NAME 101")
cpp_quote("//")
cpp_quote("// Categorizer Properties")
cpp_quote("//")
cpp_quote("#define PHAT_DSPARAMETER_ATTRIBUTE_DISPLAYNAME (DSPARAMETER_OBJECTCLASS_DL_DYNAMIC + 1)")
cpp_quote("#define PHAT_DSPARAMETER_ENDENUMMESS (PHAT_DSPARAMETER_ATTRIBUTE_DISPLAYNAME + 1)")
interface ISmtpInCallbackSink;
[
object,
local,
uuid(5F15C533-E90E-11D1-8852-00C04FA35B86),
helpstring("ISmtpInCommandContext Interface"),
pointer_default(unique)
]
interface ISmtpInCommandContext : IUnknown
{
// Query methods
HRESULT QueryCommand(
[out,size_is(*pdwSize)] LPSTR pszCommand,
[in,out] DWORD *pdwSize
);
HRESULT QueryCommandKeyword(
[out,size_is(*pdwSize)] LPSTR pszKeyword,
[in,out] DWORD *pdwSize
);
HRESULT QueryNativeResponse(
[out,size_is(*pdwSize)] LPSTR pszNativeResponse,
[in,out] DWORD *pdwSize
);
HRESULT QueryResponse(
[out,size_is(*pdwSize)] LPSTR pszResponse,
[in,out] DWORD *pdwSize
);
HRESULT QueryCommandSize(
[out] DWORD *pdwSize
);
HRESULT QueryCommandKeywordSize(
[out] DWORD *pdwSize
);
HRESULT QueryNativeResponseSize(
[out] DWORD *pdwSize
);
HRESULT QueryResponseSize(
[out] DWORD *pdwSize
);
HRESULT QueryCommandStatus(
[out] DWORD *pdwCommandStatus
);
HRESULT QuerySmtpStatusCode(
[out] DWORD *pdwSmtpStatus
);
HRESULT QueryProtocolErrorFlag(
[out] BOOL *pfProtocolError
);
// Set methods
HRESULT SetResponse(
[in,string] LPSTR pszResponse,
[in] DWORD dwSize
);
HRESULT AppendResponse(
[in,string] LPSTR pszResponse,
[in] DWORD dwSize
);
HRESULT SetNativeResponse(
[in,string] LPSTR pszNativeResponse,
[in] DWORD dwSize
);
HRESULT AppendNativeResponse(
[in,string] LPSTR pszNativeResponse,
[in] DWORD dwSize
);
HRESULT SetCommandStatus(
[in] DWORD dwCommandStatus
);
HRESULT SetSmtpStatusCode(
[in] DWORD dwSmtpStatus
);
HRESULT SetProtocolErrorFlag(
[in] BOOL fProtocolError
);
// Async completion callback
HRESULT NotifyAsyncCompletion(
[in] HRESULT hrResult
);
HRESULT SetCallback(
[in] ISmtpInCallbackSink * pICallback
);
};
[
object,
local,
uuid(5e4fc9da-3e3b-11d3-88f1-00c04fa35b86),
helpstring("ISmtpInCallbackContext Interface"),
pointer_default(unique)
]
interface ISmtpInCallbackContext : IUnknown
{
// Query methods
HRESULT QueryBlob(
[out] BYTE **ppbBlob,
[in,out] DWORD *pdwSize
);
HRESULT QueryBlobSize(
[out] DWORD *pdwSize
);
// Set methods
HRESULT SetResponse(
[in,string] LPSTR pszResponse,
[in] DWORD dwSize
);
HRESULT AppendResponse(
[in,string] LPSTR pszResponse,
[in] DWORD dwSize
);
HRESULT SetCommandStatus(
[in] DWORD dwCommandStatus
);
HRESULT SetSmtpStatusCode(
[in] DWORD dwSmtpStatus
);
};
[
object,
local,
uuid(c849b5f2-0a80-11d2-aa67-00c04fa35b82),
helpstring("ISmtpOutCommandContext Interface"),
pointer_default(unique)
]
interface ISmtpOutCommandContext : IUnknown
{
// Query methods
HRESULT QueryCommand(
[out,size_is(*pdwSize)] LPSTR pszCommand,
[in,out] DWORD *pdwSize
);
HRESULT QueryCommandKeyword(
[out,size_is(*pdwSize)] LPSTR pszKeyword,
[in,out] DWORD *pdwSize
);
HRESULT QueryNativeCommand(
[out,size_is(*pdwSize)] LPSTR pszNativeCommand,
[in,out] DWORD *pdwSize
);
HRESULT QueryCommandSize(
[out] DWORD *pdwSize
);
HRESULT QueryCommandKeywordSize(
[out] DWORD *pdwSize
);
HRESULT QueryNativeCommandSize(
[out] DWORD *pdwSize
);
HRESULT QueryCurrentRecipientIndex(
[out] DWORD *pdwRecipientIndex
);
HRESULT QueryCommandStatus(
[out] DWORD *pdwCommandStatus
);
// Set methods
HRESULT SetCommand(
[in,string] LPSTR szCommand,
[in] DWORD dwSize
);
HRESULT AppendCommand(
[in,string] LPSTR szCommand,
[in] DWORD dwSize
);
HRESULT SetCommandStatus(
[in] DWORD dwCommandStatus
);
// Async completion callback
HRESULT NotifyAsyncCompletion(
[in] HRESULT hrResult
);
HRESULT SetBlob(
[in] BYTE *pbBlob,
[in] DWORD dwSize
);
};
[
object,
local,
uuid(e38f9ad2-0a82-11d2-aa67-00c04fa35b82),
helpstring("ISmtpServerResponseContext Interface"),
pointer_default(unique)
]
interface ISmtpServerResponseContext : IUnknown
{
// Query methods
HRESULT QueryCommand(
[out,size_is(*pdwSize)] LPSTR pszCommand,
[in,out] DWORD *pdwSize
);
HRESULT QueryCommandKeyword(
[out,size_is(*pdwSize)] LPSTR pszKeyword,
[in,out] DWORD *pdwSize
);
HRESULT QueryResponse(
[out,size_is(*pdwSize)] LPSTR pszResponse,
[in,out] DWORD *pdwSize
);
HRESULT QueryCommandSize(
[out] DWORD *pdwSize
);
HRESULT QueryCommandKeywordSize(
[out] DWORD *pdwSize
);
HRESULT QueryResponseSize(
[out] DWORD *pdwSize
);
HRESULT QuerySmtpStatusCode(
[out] DWORD *pdwSmtpStatus
);
HRESULT QueryResponseStatus(
[out] DWORD *pdwResponseStatus
);
HRESULT QueryPipelinedFlag(
[out] BOOL *pfResponseIsPipelined
);
HRESULT QueryNextEventState(
[out] DWORD *pdwNextState
);
// Set methods
HRESULT SetResponseStatus(
[in] DWORD dwResponseStatus
);
HRESULT SetNextEventState(
[in] DWORD dwNextState
);
// Async completion callback
HRESULT NotifyAsyncCompletion(
[in] HRESULT hrResult
);
};
// =============================================================
//
// Inbound Protocol Event Sink Shape
//
[
object,
uuid(b2d42a0e-0d5f-11d2-aa68-00c04fa35b82),
helpstring("ISmtpInCommandSink Interface"),
pointer_default(unique)
]
interface ISmtpInCommandSink : IUnknown
{
[helpstring("OnSmtpInCommand method")]
HRESULT OnSmtpInCommand(
[in] IUnknown *pServer,
[in] IUnknown *pSession,
[in] IMailMsgProperties *pMsg,
[in] ISmtpInCommandContext *pContext
);
};
// =============================================================
//
// Outbound Command Generation Protocol Event Sink Shape
//
[
object,
uuid(cfdbb9b0-0ca0-11d2-aa68-00c04fa35b82),
helpstring("ISmtpOutCommandSink Interface"),
pointer_default(unique)
]
interface ISmtpOutCommandSink : IUnknown
{
[helpstring("OnSmtpOutCommand method")]
HRESULT OnSmtpOutCommand(
[in] IUnknown *pServer,
[in] IUnknown *pSession,
[in] IMailMsgProperties *pMsg,
[in] ISmtpOutCommandContext *pContext
);
};
// =============================================================
//
// Server Response Protocol Event Sink Shape
//
[
object,
uuid(d7e10222-0ca1-11d2-aa68-00c04fa35b82),
helpstring("ISmtpServerResponseSink Interface"),
pointer_default(unique)
]
interface ISmtpServerResponseSink : IUnknown
{
[helpstring("OnSmtpServerResponse method")]
HRESULT OnSmtpServerResponse(
[in] IUnknown *pServer,
[in] IUnknown *pSession,
[in] IMailMsgProperties *pMsg,
[in] ISmtpServerResponseContext *pContext
);
};
// =============================================================
//
// Inbound Protocol Event Callback Sink Shape
//
[
object,
uuid(0012b624-3e3c-11d3-88f1-00c04fa35b86),
helpstring("ISmtpInCallbackSink Interface"),
pointer_default(unique)
]
interface ISmtpInCallbackSink : IUnknown
{
[helpstring("OnSmtpInCallback method")]
HRESULT OnSmtpInCallback(
[in] IUnknown *pServer,
[in] IUnknown *pSession,
[in] IMailMsgProperties *pMsg,
[in] ISmtpInCallbackContext *pContext
);
};
//+------------------------------------------------------------
//
// The SMTP Mail Transport interfaces:
//
//-------------------------------------------------------------
//
// The default processing priority of the transport events:
//
cpp_quote("#define SMTP_TRANSPORT_DEFAULT_PRIORITY 16384")
//+------------------------------------------------------------
//
// Interface: IMailTransportNotify
//
// Synopsis: Used for async events
//
//
//-------------------------------------------------------------
[
object,
uuid(6E1CAA77-FCD4-11d1-9DF9-00C04FA322BA),
helpstring("IMailTransportNotify Interface"),
pointer_default(unique)
]
interface IMailTransportNotify : IUnknown
{
[local]
HRESULT Notify(
[in] HRESULT hrCompletion,
[in] PVOID pvContext);
};
//+------------------------------------------------------------
//
// Interface: IMailTransportSubmission
//
// Synopsis: Used for the SMTP_MAILTRANSPORT_ONMESSAGESUBMISSION event
//
//
//-------------------------------------------------------------
[
object,
uuid(CE681916-FF14-11d1-9DFB-00C04FA322BA),
helpstring("IMailTransportSubmission Interface"),
pointer_default(unique)
]
interface IMailTransportSubmission : IUnknown
{
[local]
HRESULT OnMessageSubmission(
[in] IMailMsgProperties *pIMailMsg,
[in] IMailTransportNotify *pINotify,
[in] PVOID pvNotifyContext);
};
//+------------------------------------------------------------
//
// Interface: IMailTransportOnPreCategorize
//
// Synopsis: Used for the SMTP_MAILTRANSPORT_PRECATEGORIZE event
//
//
//-------------------------------------------------------------
[
object,
uuid(A3ACFB0E-83FF-11d2-9E14-00C04FA322BA),
helpstring("IMailTransportOnPreCategorize Interface"),
pointer_default(unique)
]
interface IMailTransportOnPreCategorize : IUnknown
{
[local]
HRESULT OnSyncMessagePreCategorize(
[in] IMailMsgProperties *pIMailMsg,
[in] IMailTransportNotify *pINotify,
[in] PVOID pvNotifyContext);
};
//+------------------------------------------------------------
//
// Interface: IMailTransportOnPostCategorize
//
// Synopsis: Used for the SMTP_MAILTRANSPORT_POSTCATEGORIZE event
//
//
//-------------------------------------------------------------
[
object,
uuid(76719653-05A6-11d2-9DFD-00C04FA322BA),
helpstring("IMailTransportOnPostCategorize Interface"),
pointer_default(unique)
]
interface IMailTransportOnPostCategorize : IUnknown
{
[local]
HRESULT OnMessagePostCategorize(
[in] IMailMsgProperties *pIMailMsg,
[in] IMailTransportNotify *pINotify,
[in] PVOID pvNotifyContext);
};
cpp_quote("#define RESET_NEXT_HOPS 0")
cpp_quote("#define RESET_MESSAGE_TYPES 1")
//+------------------------------------------------------------
//
// Interface: IMailTransportRouterReset
//
// Synopsis: System implemented interface for resetting routes
//
//
//-------------------------------------------------------------
[
object,
uuid(A928AD12-1610-11d2-9E02-00C04FA322BA),
helpstring("IMailTransportRouterReset Interface"),
pointer_default(unique)
]
interface IMailTransportRouterReset : IUnknown
{
HRESULT ResetRoutes(
[in] DWORD dwResetType);
};
//+------------------------------------------------------------
//
// Interface: IMailTransportSetRouterReset
//
// Synopsis: Used for the SMTP_MAILTRANSPORT_ON_SET_ROUTER_RESET event
//
//
//-------------------------------------------------------------
[
object,
uuid(A928AD11-1610-11d2-9E02-00C04FA322BA),
helpstring("IMailTransportSetRouterReset Interface"),
pointer_default(unique)
]
interface IMailTransportSetRouterReset : IUnknown
{
HRESULT RegisterResetInterface(
[in] DWORD dwVirtualServerID,
[in] IMailTransportRouterReset *pIRouterReset);
};
//+------------------------------------------------------------
//
// Interface: IMessageRouter
//
// Synopsis: Sink supplied interface
//
//
//-------------------------------------------------------------
[
object,
uuid(A928AD14-1610-11d2-9E02-00C04FA322BA),
helpstring("IMessageRouter Interface"),
pointer_default(unique)
]
interface IMessageRouter : IUnknown
{
[local]
GUID GetTransportSinkID();
HRESULT GetMessageType(
[in] IMailMsgProperties *pIMailMsg,
[out] DWORD *pdwMessageType);
HRESULT ReleaseMessageType(
[in] DWORD dwMessageType,
[in] DWORD dwReleaseCount);
[local]
HRESULT GetNextHop(
[in] LPSTR pszDestinationAddressType,
[in] LPSTR pszDestinationAddress,
[in] DWORD dwMessageType,
[out] LPSTR *ppszRouteAddressType,
[out] LPSTR *ppszRouteAddress,
[out] DWORD *pdwScheduleID,
[out] LPSTR *ppszRouteAddressClass,
[out] LPSTR *ppszConnectorName,
[out] DWORD *pdwNextHopType);
[local]
HRESULT GetNextHopFree(
[in] LPSTR pszDestinationAddressType,
[in] LPSTR pszDestinationAddress,
[in] LPSTR pszConnectorName,
[in] LPSTR pszRouteAddressType,
[in] LPSTR pszRouteAddress,
[in] LPSTR pszRouteAddressClass);
HRESULT ConnectionFailed(
[in, string] LPSTR pszConnectorName);
};
//Some standard RouteAddressTypes that might be returned by GetNextHop
const LPCSTR MTI_ROUTING_ADDRESS_TYPE_NULL = NULL;
const LPCSTR MTI_ROUTING_ADDRESS_TYPE_SMTP = "SMTP";
const LPCSTR MTI_ROUTING_ADDRESS_TYPE_X400 = "X400";
const LPCSTR MTI_ROUTING_ADDRESS_TYPE_X500 = "X500";
//---[ NEXT_HOP_TYPE ]---------------------------------------------------------
//
//
// Description:
// Enum for the possible next hop types
//
//-----------------------------------------------------------------------------
typedef [v1_enum] enum {
MTI_NEXT_HOP_TYPE_SAME_VIRTUAL_SERVER,
MTI_NEXT_HOP_TYPE_PEER_SMTP1_BYPASS_CONFIG_LOOKUP,
MTI_NEXT_HOP_TYPE_EXTERNAL_SMTP,
MTI_NEXT_HOP_TYPE_UNREACHABLE,
MTI_NEXT_HOP_TYPE_CURRENTLY_UNREACHABLE,
MTI_NEXT_HOP_TYPE_PEER_SMTP2_BYPASS_CONFIG_LOOKUP
} MTI_NEXT_HOP_TYPE, *PMTI_NEXT_HOP_TYPE;
// #defines for old names for these values
#define MTI_NEXT_HOP_TYPE_REMOTE \
(MTI_NEXT_HOP_TYPE_PEER_SMTP1_BYPASS_CONFIG_LOOKUP)
#define MTI_NEXT_HOP_TYPE_RESERVED \
(MTI_NEXT_HOP_TYPE_EXTERNAL_SMTP)
//+------------------------------------------------------------
//
// Interface: IMailTransportRouterSetLinkState
//
// Synopsis: System implemented interface for allowing a
// routing sink to update the link state for features such
// as:
// - Scheduled Connections
// - Scheduled Commands
//
// If LINK_STATE_SCHED_ENABLED is being unset... a next
// scheduled connection time should be returned.
//
//
//-------------------------------------------------------------
[
object,
uuid(B870CE28-A755-11d2-A6A9-00C04FA3490A),
helpstring("IMailTransportRouterSetLinkState Interface"),
pointer_default(unique)
]
interface IMailTransportRouterSetLinkState : IUnknown
{
HRESULT SetLinkState(
[in] LPSTR szLinkDomainName,
[in] GUID guidRouterGUID,
[in] DWORD dwScheduleID,
[in] LPSTR szConnectorName,
[in] DWORD dwSetLinkState,
[in] DWORD dwUnsetLinkState,
[in] FILETIME *pftNextScheduled,
[in] IMessageRouter *pMessageRouter);
};
//+------------------------------------------------------------
//
// Interface: IMessageRouterLinkStateNotification
//
// Synopsis: Sink supplied interface that is used for notifying
// the routing sink of link state on connection acks.
//
// If LINK_STATE_SCHED_ENABLED is being unset... a next
// scheduled connection time should be returned.
//
//
//-------------------------------------------------------------
[
object,
uuid(B870CE29-A755-11d2-A6A9-00C04FA3490A),
helpstring("IMessageRouterLinkStateNotification Interface"),
pointer_default(unique)
]
interface IMessageRouterLinkStateNotification : IUnknown
{
HRESULT LinkStateNotify(
[in] LPSTR szLinkDomainName,
[in] GUID guidRouterGUID,
[in] DWORD dwScheduleID,
[in] LPSTR szConnectorName,
[in] DWORD dwLinkState,
[in] DWORD cConsecutiveFailures,
[in, out] FILETIME *pftNextScheduled,
[out] DWORD *pdwSetLinkState,
[out] DWORD *pdwUnsetLinkState);
};
//---[ eLinkInfoFlags ]--------------------------------------------------------
//
//
// Description: Flags used to describe boolean per *link* state. Used to
// decide if it is an appropriate time to make a connection. Event sinks
// can set and unset these flags to influence the connection manager.
//
//-----------------------------------------------------------------------------
typedef [v1_enum] enum
{
LINK_STATE_NO_ACTION = 0x00000000, //NULL op... setting/unsetting this has no effect on link state
LINK_STATE_RETRY_ENABLED = 0x00000001, //If NOT set, link is pending retry
LINK_STATE_SCHED_ENABLED = 0x00000002, //If NOT set, link is pending scheduled connection
LINK_STATE_CMD_ENABLED = 0x00000004, //If set, link should be activated to send a command
LINK_STATE_ADMIN_HALT = 0x00000008, //If set, admin has request no connections be made
LINK_STATE_ADMIN_FORCE_CONN = 0x00000010, //Admin has requested that a connection be made now
LINK_STATE_CONNECT_IF_NO_MSGS = 0x00000020, //Connect even if there are no messages. Link will not be deleted while this is set.
LINK_STATE_DO_NOT_DELETE = 0x00000040, //Routing is interested in this link... it should not be deleted by the transport.
LINK_STATE_CREATE_IF_NECESSARY = 0x00000080, //Create a new link if one doesn't exist
LINK_STATE_LINK_NO_LONGER_USED = 0x00000100, //Set when SMTP is done with link
LINK_STATE_TYPE_INTERNAL_SMTP = 0x00000200,
LINK_STATE_TYPE_EXTERNAL_SMTP = 0x00000400,
LINK_STATE_DO_NOT_DELETE_UNTIL_NEXT_NOTIFY = 0x00000800,
LINK_STATE_RETRY_ALL_DNS_FAILURES = 0x00001000,
LINK_STATE_RESERVED = 0xFFFF0000, //Reserved for internal use
} eLinkStateFlags;
//+------------------------------------------------------------
//
// Interface: IMailTransportRoutingEngine
//
// Synopsis: Used for the SMTP_MAILTRANSPORT_ON_GET_ROUTER_FOR_MESSAGE event
//
//
//-------------------------------------------------------------
//
// Specific error code(s) that can be returned from GetMessageRouter
//
cpp_quote("#define ROUTER_E_NOTINTERESTED MAKE_HRESULT(SEVERITY_ERROR,FACILITY_ITF,0x1000)")
[
object,
uuid(A928AD13-1610-11d2-9E02-00C04FA322BA),
helpstring("IMailTransportRoutingEngine Interface"),
pointer_default(unique)
]
interface IMailTransportRoutingEngine : IUnknown
{
[local]
HRESULT GetMessageRouter(
[in] IMailMsgProperties *pIMailMsg,
[in] IMessageRouter *pICurrentMessageRouter,
[out] IMessageRouter **ppIMessageRouter);
};
cpp_quote("#define MTE_QUEUED_OUTBOUND 1010")
cpp_quote("#define MTE_TRANSFERRED_OUTBOUND 1011")
cpp_quote("#define MTE_RECEIVED_INBOUND 1012")
cpp_quote("#define MTE_TRANSFERRED_INBOUND 1013")
cpp_quote("#define MTE_MESSAGE_REROUTED 1014")
cpp_quote("#define MTE_REPORT_TRANSFERRED_IN 1015")
cpp_quote("#define MTE_REPORT_TRANSFERRED_OUT 1016")
cpp_quote("#define MTE_REPORT_GENERATED 1017")
cpp_quote("#define MTE_REPORT_ABSORBED 1018")
cpp_quote("#define MTE_SUBMIT_MESSAGE_TO_AQ 1019")
cpp_quote("#define MTE_BEGIN_OUTBOUND_TRANSFER 1020")
cpp_quote("#define MTE_BADMAIL 1021")
cpp_quote("#define MTE_AQ_FAILURE 1022")
cpp_quote("#define MTE_LOCAL_DELIVERY 1023")
cpp_quote("#define MTE_SUBMIT_MESSAGE_TO_CAT 1024")
cpp_quote("#define MTE_BEGIN_SUBMIT_MESSAGE 1025")
cpp_quote("#define MTE_AQ_FAILED_MESSAGE 1026")
cpp_quote("#define MTE_NDR_ALL 1030")
cpp_quote("#define MTE_END_OUTBOUND_TRANSFER 1031")
[
helpstring("Interface For Message Tracking."),
local,
object,
pointer_default(unique),
uuid(1bc3580e-7e4f-11d2-94f4-00C04f79f1d6)
]
interface IMsgTrackLog : IUnknown
{
HRESULT OnSyncLogMsgTrackInfo(
[in] IUnknown *pIServer,
[in] IMailMsgProperties *pIMailMsgProp,
[in] LPMSG_TRACK_INFO pMsgTrackInfo);
};
[
helpstring("Interface For Enumerating Resolver Records."),
local,
object,
pointer_default(unique),
uuid(e5b89c52-8e0b-11d2-94f6-00C04f79f1d6)
]
interface IDnsResolverRecord : IUnknown
{
HRESULT GetItem( [in] ULONG cIndex, [out] LPSTR *ppszHostName, [out] DWORD *pAddr );
HRESULT Count( [out] DWORD *pcRecords );
};
typedef struct tagDNS_SERVER_INFO
{
GUID guidNetwork;
PVOID pipServers;
}
DNS_SERVER_INFO, *PDNS_SERVER_INFO;
[
helpstring("Interface For returning status from DNS resolver sink."),
local,
object,
pointer_default(unique),
uuid(6A417A4C-27BA-4867-A286-83E332074558)
]
interface IDnsInfoSink : IUnknown
{
HRESULT OnSyncGetDnsInfo([in] LPSTR pszHostName,
[in] LPSTR pszInstanceFQDN,
[in] DWORD dwVirtualServerId,
[out] DNS_SERVER_INFO **ppDnsServerInfo,
[out] IDnsResolverRecord **ppDnsResolverRecord);
};
[
helpstring("Interface For Getting Resolver Records and DnsServerInfo."),
local,
object,
pointer_default(unique),
uuid(4e60bfad-a179-47AC-8961-c7c1f0785ac1)
]
interface IDnsStatus : IUnknown
{
HRESULT GetDnsStatus();
};
[
helpstring("Interface For Getting Resolver Records."),
local,
object,
pointer_default(unique),
uuid(d95a4d0c-8e06-11d2-94f6-00C04f79f1d6)
]
interface IDnsResolverRecordSink : IUnknown
{
HRESULT OnSyncGetResolverRecord( [in] LPSTR pszHostName,
[in] LPSTR pszInstanceFQDN,
[in] DWORD dwVirtualServerId,
[out] IDnsResolverRecord **ppDnsResolverRecord);
};
[
helpstring("MaxMsgSize Exceeded event interface."),
local,
object,
pointer_default(unique),
uuid(b997f192-a67d-11d2-94f7-00C04f79f1d6)
]
interface ISmtpMaxMsgSize : IUnknown
{
HRESULT OnSyncMaxMsgSize( [in] IUnknown *pIUnknown,
[in] IMailMsgProperties *pIMailMsgProp,
[out] BOOL *pfShouldImposeLimit );
};
[
helpstring("Log event interface."),
local,
object,
pointer_default(unique),
uuid(35bc9ad7-7aa5-43ee-a0ab-94e1d6be99e5)
]
interface ISmtpLog : IUnknown
{
HRESULT OnSyncLog(
[in] LPSMTP_LOG_EVENT_INFO pLogEventInfo);
};
[
helpstring("Get Aux Domain Info Flags event interface."),
local,
object,
pointer_default(unique),
uuid(d038c9da-4977-491d-8b0e-97f2e546c35a)
]
interface ISmtpGetAuxDomainInfoFlags : IUnknown
{
HRESULT OnGetAuxDomainInfoFlags(
[in] IUnknown *pIServer,
[in] LPCSTR pszDomainName,
[out] DWORD *pdwDomainInfoFlags );
};
//+------------------------------------------------------------
//
// The Categorizer event interfaces:
//
//-------------------------------------------------------------
interface ICategorizerListResolve;
interface ICategorizerItemAttributes;
interface ICategorizerMailMsgs;
interface ICategorizerItem;
interface ICategorizerDomainInfo;
interface ISMTPCategorizer;
interface ISMTPCategorizerCompletion;
interface ISMTPCategorizerDLCompletion;
//
// A structure and definitions to handle the configuration of
// a virtual server (for categorizer)
//
typedef [v1_enum] enum
{
CCAT_CONFIG_INFO_FLAGS = 0x0001,
CCAT_CONFIG_INFO_ROUTINGTYPE = 0x0002,
CCAT_CONFIG_INFO_BINDDOMAIN = 0x0004,
CCAT_CONFIG_INFO_USER = 0x0008,
CCAT_CONFIG_INFO_PASSWORD = 0x0010,
CCAT_CONFIG_INFO_BINDTYPE = 0x0020,
CCAT_CONFIG_INFO_SCHEMATYPE = 0x0040,
CCAT_CONFIG_INFO_HOST = 0x0080,
CCAT_CONFIG_INFO_NAMINGCONTEXT = 0x0100,
CCAT_CONFIG_INFO_DEFAULTDOMAIN = 0x0200,
CCAT_CONFIG_INFO_PORT = 0x0400,
CCAT_CONFIG_INFO_ISMTPSERVER = 0x0800,
CCAT_CONFIG_INFO_IDOMAININFO = 0x1000,
CCAT_CONFIG_INFO_ENABLE = 0x2000,
CCAT_CONFIG_INFO_DEFAULT = 0x4000,
CCAT_CONFIG_INFO_VSID = 0x8000,
CCAT_CONFIG_INFO_ALL = 0xFFFF
} eCatConfigInfoFlags;
typedef struct _tagCCatConfigInfo {
DWORD dwCCatConfigInfoFlags; //Flags describing which fields
//are valid
DWORD dwEnable;
DWORD dwCatFlags;
LPSTR pszRoutingType;
LPSTR pszBindDomain;
LPSTR pszUser;
LPSTR pszPassword;
LPSTR pszBindType;
LPSTR pszSchemaType;
LPSTR pszHost;
LPSTR pszNamingContext;
LPSTR pszDefaultDomain;
DWORD dwPort;
ISMTPServer *pISMTPServer;
ICategorizerDomainInfo *pIDomainInfo;
DWORD dwVirtualServerID;
} CCATCONFIGINFO, *PCCATCONFIGINFO;
typedef [v1_enum] enum _CAT_ADDRESS_TYPE {
CAT_SMTP = 0, // SMTP address type
CAT_X500 = 1, // X500 address type (ex: "/DC=blah/dc=...")
CAT_X400 = 2, // X400 address type
CAT_DN = 3, // Distinguished Name
CAT_LEGACYEXDN = 4, // LegacyExchangeDN attribute
CAT_CUSTOMTYPE = 5, // Foreign address type
CAT_UNKNOWNTYPE = 6, // Not a valid input value
} CAT_ADDRESS_TYPE;
//+------------------------------------------------------------
//
// Interface: ICategorizerProperties
//
// Synopsis: Property setting/retrieval interface
//
//
//-------------------------------------------------------------
[
local,
object,
uuid(96BF3199-79D8-11d2-9E11-00C04FA322BA),
helpstring("ICategorizerProperties Interface"),
pointer_default(unique)
]
interface ICategorizerProperties : IUnknown
{
HRESULT GetStringA(
[in] DWORD dwPropId,
[in] DWORD dwcchValue,
[out, size_is(dwcchValue)] LPSTR pszValue);
HRESULT PutStringA(
[in] DWORD dwPropId,
[in, unique] LPSTR pszValue);
HRESULT GetDWORD(
[in] DWORD dwPropId,
[out] DWORD *pdwValue);
HRESULT PutDWORD(
[in] DWORD dwPropId,
[in] DWORD dwValue);
HRESULT GetHRESULT(
[in] DWORD dwPropId,
[out] HRESULT *phrValue);
HRESULT PutHRESULT(
[in] DWORD dwPropId,
[in] HRESULT hrValue);
HRESULT GetBool(
[in] DWORD dwPropId,
[out] BOOL *pfValue);
HRESULT PutBool(
[in] DWORD dwPropId,
[in] BOOL fValue);
HRESULT GetPVoid(
[in] DWORD dwPropId,
[out] PVOID *pvValue);
HRESULT PutPVoid(
[in] DWORD dwPropId,
[in] PVOID pvValue);
HRESULT GetIUnknown(
[in] DWORD dwPropId,
[out] IUnknown **pUnknown);
HRESULT PutIUnknown(
[in] DWORD dwPropId,
[in] IUnknown *pUnknown);
HRESULT GetIMailMsgProperties(
[in] DWORD dwPropId,
[out] IMailMsgProperties **ppIMsg);
HRESULT PutIMailMsgProperties(
[in] DWORD dwPropId,
[in] IMailMsgProperties *pIMsg);
HRESULT GetIMailMsgRecipientsAdd(
[in] DWORD dwPropId,
[out] IMailMsgRecipientsAdd **ppIMsgRecipientsAdd);
HRESULT PutIMailMsgRecipientsAdd(
[in] DWORD dwPropId,
[in] IMailMsgRecipientsAdd *pIMsgRecipientsAdd);
HRESULT GetICategorizerItemAttributes(
[in] DWORD dwPropId,
[out] ICategorizerItemAttributes **ppICategorizerItemAttributes);
HRESULT PutICategorizerItemAttributes(
[in] DWORD dwPropId,
[in] ICategorizerItemAttributes *pICategorizerItemAttributes);
HRESULT GetICategorizerListResolve(
[in] DWORD dwPropId,
[out] ICategorizerListResolve **ppICategorizerListResolve);
HRESULT PutICategorizerListResolve(
[in] DWORD dwPropId,
[in] ICategorizerListResolve *pICategorizerListResolve);
HRESULT GetICategorizerMailMsgs(
[in] DWORD dwPropId,
[out] ICategorizerMailMsgs **ppICategorizerMailMsgs);
HRESULT PutICategorizerMailMsgs(
[in] DWORD dwPropId,
[in] ICategorizerMailMsgs *pICategorizerMailMsgs);
HRESULT GetICategorizerItem(
[in] DWORD dwPropId,
[out] ICategorizerItem **ppICategorizerItem);
HRESULT PutICategorizerItem(
[in] DWORD dwPropId,
[in] ICategorizerItem *pICategorizerItem);
HRESULT UnSetPropId(
[in] DWORD dwPropId);
};
//+------------------------------------------------------------
//
// Interface: ICategorizerParameters
//
// Synopsis: Holds data concerning attribute names for the schema in use
//
//
//-------------------------------------------------------------
typedef [v1_enum] enum
{
DSPARAMETER_LDAPHOST = 0,
DSPARAMETER_LDAPBINDTYPE,
DSPARAMETER_LDAPDOMAIN,
DSPARAMETER_LDAPACCOUNT,
DSPARAMETER_LDAPPASSWORD,
DSPARAMETER_LDAPNAMINGCONTEXT,
DSPARAMETER_LDAPPORT,
DSPARAMETER_BATCHINGLIMIT,
DSPARAMETER_SEARCHATTRIBUTE_SMTP,
DSPARAMETER_SEARCHFILTER_SMTP,
DSPARAMETER_SEARCHATTRIBUTE_X500,
DSPARAMETER_SEARCHFILTER_X500,
DSPARAMETER_SEARCHATTRIBUTE_X400,
DSPARAMETER_SEARCHFILTER_X400,
DSPARAMETER_SEARCHATTRIBUTE_LEGACYEXDN,
DSPARAMETER_SEARCHFILTER_LEGACYEXDN,
DSPARAMETER_SEARCHATTRIBUTE_RDN,
DSPARAMETER_SEARCHFILTER_RDN,
DSPARAMETER_SEARCHATTRIBUTE_DN,
DSPARAMETER_SEARCHFILTER_DN,
DSPARAMETER_SEARCHATTRIBUTE_FOREIGNADDRESS,
DSPARAMETER_SEARCHFILTER_FOREIGNADDRESS,
DSPARAMETER_ATTRIBUTE_OBJECTCLASS,
DSPARAMETER_ATTRIBUTE_DEFAULT_SMTP,
DSPARAMETER_ATTRIBUTE_DEFAULT_X500,
DSPARAMETER_ATTRIBUTE_DEFAULT_X400,
DSPARAMETER_ATTRIBUTE_DEFAULT_DN,
DSPARAMETER_ATTRIBUTE_DEFAULT_LEGACYEXDN,
DSPARAMETER_ATTRIBUTE_FORWARD_SMTP,
DSPARAMETER_ATTRIBUTE_DL_MEMBERS,
DSPARAMETER_ATTRIBUTE_DL_DYNAMICFILTER,
DSPARAMETER_ATTRIBUTE_DL_DYNAMICBASEDN,
DSPARAMETER_OBJECTCLASS_USER,
DSPARAMETER_OBJECTCLASS_DL_X500,
DSPARAMETER_OBJECTCLASS_DL_SMTP,
DSPARAMETER_OBJECTCLASS_DL_DYNAMIC,
DSPARAMETER_ENDENUMMESS,
DSPARAMETER_INVALID
} eDSPARAMETER;
[
object,
local,
uuid(86F9DA7B-EB6E-11d1-9DF3-00C04FA322BA),
helpstring("ICategorizerParameters Interface"),
pointer_default(unique)
]
interface ICategorizerParameters : IUnknown
{
HRESULT GetDSParameterA(
[in] DWORD dwDSParameter,
[out] LPSTR *ppszValue);
HRESULT SetDSParameterA(
[in] DWORD dwDSParameter,
[in, unique] LPCSTR pszValue);
HRESULT RequestAttributeA(
[in, unique] LPCSTR pszName);
HRESULT GetAllAttributes(
[out] LPSTR **prgszAllAttributes);
HRESULT ReserveICatItemPropIds(
[in] DWORD dwNumPropIdsRequested,
[out] DWORD *pdwBeginningPropId);
HRESULT ReserveICatListResolvePropIds(
[in] DWORD dwNumPropIdsRequested,
[out] DWORD *pdwBeginningPropId);
HRESULT GetCCatConfigInfo(
[out] PCCATCONFIGINFO *ppCCatConfigInfo);
};
//+------------------------------------------------------------
//
// Interface: ICategorizerQueries
//
// Synopsis: Interface to an object that holds query strings
//
//
//-------------------------------------------------------------
[
object,
uuid(86F9DA7D-EB6E-11d1-9DF3-00C04FA322BA),
helpstring("ICategorizerQueries Interface"),
pointer_default(unique)
]
interface ICategorizerQueries : IUnknown
{
HRESULT SetQueryString(
[in, unique] LPSTR pszQueryString);
HRESULT GetQueryString(
[out] LPSTR *ppszQueryString);
};
//+------------------------------------------------------------
//
// Interface: ICategorizerMailMsgs
//
// Synopsis: Interface to hold all MailMsgs associated with a message
// categorization
//
//-------------------------------------------------------------
//
// The structure used for mailmsg enumeration
//
typedef PVOID CATMAILMSG_ENUMERATOR, *PCATMAILMSG_ENUMERATOR;
[
object,
local,
uuid(86F9DA80-EB6E-11d1-9DF3-00C04FA322BA),
helpstring("ICategorizerMailMsgs Interface"),
pointer_default(unique)
]
interface ICategorizerMailMsgs : IUnknown
{
HRESULT GetMailMsg(
[in] DWORD dwFlags,
[out] IMailMsgProperties **ppIMailMsgProperties,
[out] IMailMsgRecipientsAdd **ppIMailMsgRecipientsAdd,
[out] BOOL *pfCreated);
HRESULT ReBindMailMsg(
[in] DWORD dwFlags,
[in] IUnknown *pStoreDriver);
//
// Functions to enumerate all created mailmsg
//
HRESULT BeginMailMsgEnumeration(
[in] PCATMAILMSG_ENUMERATOR penumerator);
HRESULT GetNextMailMsg(
[in] PCATMAILMSG_ENUMERATOR penumerator,
[out] DWORD *pdwFlags,
[out] IMailMsgProperties **ppIMailMsgProperties,
[out] IMailMsgRecipientsAdd **ppIMailMsgRecipientsAdd);
HRESULT EndMailMsgEnumeration(
[in] PCATMAILMSG_ENUMERATOR penumerator);
}
//+------------------------------------------------------------
//
// Interface: ICategorizerItemAttributes
//
// Synopsis: Sink supplied interface with methods to get at object attributes
//
//
//-------------------------------------------------------------
//
// The structure used for attribute enumeration
//
typedef struct _tagAttributeEnumerator {
PVOID pvBase;
PVOID pvCurrent;
PVOID pvContext;
} ATTRIBUTE_ENUMERATOR, *PATTRIBUTE_ENUMERATOR;
[
object,
uuid(86F9DA7F-EB6E-11d1-9DF3-00C04FA322BA),
helpstring("ICategorizerItemAttributes Interface"),
pointer_default(unique)
]
interface ICategorizerItemAttributes : IUnknown
{
//
// Functions to enumerate through a specified attribute value
//
[local] HRESULT BeginAttributeEnumeration(
[in, unique] LPCSTR pszAttributeName,
[in] PATTRIBUTE_ENUMERATOR penumerator);
[local] HRESULT GetNextAttributeValue(
[in] PATTRIBUTE_ENUMERATOR penumerator,
[out] LPSTR *ppszAttributeValue);
[local] HRESULT RewindAttributeEnumeration(
[in] PATTRIBUTE_ENUMERATOR penumerator);
[local] HRESULT EndAttributeEnumeration(
[in] PATTRIBUTE_ENUMERATOR penumerator);
//
// Functions to enumerate through the available attribute names
//
[local] HRESULT BeginAttributeNameEnumeration(
[in] PATTRIBUTE_ENUMERATOR penumerator);
[local] HRESULT GetNextAttributeName(
[in] PATTRIBUTE_ENUMERATOR penumerator,
[out] LPSTR *ppszAttributeName);
[local] HRESULT EndAttributeNameEnumeration(
[in] PATTRIBUTE_ENUMERATOR penumerator);
[local] GUID GetTransportSinkID();
[local] HRESULT AggregateAttributes(
[in] ICategorizerItemAttributes *pICatItemAttr);
//
// Support to retrieve all attributes at the same time.
//
[local] HRESULT GetAllAttributeValues(
[in, unique] LPCSTR pszAttributeName,
[in] PATTRIBUTE_ENUMERATOR penumerator,
[out] LPSTR **prgpszAttributeValues);
[local] HRESULT ReleaseAllAttributeValues(
[in] PATTRIBUTE_ENUMERATOR penumerator);
//
// Count the attribute values before enumeating
//
[local] HRESULT CountAttributeValues(
[in] PATTRIBUTE_ENUMERATOR penumerator,
[out] DWORD *pdwCount);
}
//+------------------------------------------------------------
//
// Interface: ICategorizerItemRawAttributes
//
// Synopsis: Sink supplied interface with methods to get at raw object attributes
//
//
//-------------------------------------------------------------
[
object,
uuid(34C3D389-8FA7-11d2-9E16-00C04FA322BA),
helpstring("ICategorizerItemRawAttributes Interface"),
pointer_default(unique)
]
interface ICategorizerItemRawAttributes : IUnknown
{
//
// Functions to enumerate through a specified attribute value
//
[local] HRESULT BeginRawAttributeEnumeration(
[in, unique] LPCSTR pszAttributeName,
[in] PATTRIBUTE_ENUMERATOR penumerator);
[local] HRESULT GetNextRawAttributeValue(
[in] PATTRIBUTE_ENUMERATOR penumerator,
[out] DWORD *pdwcb,
[out] LPVOID *pvAttributeValue);
[local] HRESULT RewindRawAttributeEnumeration(
[in] PATTRIBUTE_ENUMERATOR penumerator);
[local] HRESULT EndRawAttributeEnumeration(
[in] PATTRIBUTE_ENUMERATOR penumerator);
//
// Count the attribute values before enumeating
//
[local] HRESULT CountRawAttributeValues(
[in] PATTRIBUTE_ENUMERATOR penumerator,
[out] DWORD *pdwCount);
}
//+------------------------------------------------------------
//
// Interface: ICategorizerItem
//
// Synopsis: A property interface with a number of well known propIDs
// (below)
//
//
//-------------------------------------------------------------
typedef [v1_enum] enum
{
ICATEGORIZERITEM_SOURCETYPE = 0,
ICATEGORIZERITEM_LDAPQUERYSTRING,
ICATEGORIZERITEM_DISTINGUISHINGATTRIBUTE,
ICATEGORIZERITEM_DISTINGUISHINGATTRIBUTEVALUE,
ICATEGORIZERITEM_IMAILMSGPROPERTIES,
ICATEGORIZERITEM_IMAILMSGRECIPIENTSADD,
ICATEGORIZERITEM_IMAILMSGRECIPIENTSADDINDEX,
ICATEGORIZERITEM_FPRIMARY,
ICATEGORIZERITEM_PARENT,
ICATEGORIZERITEM_ICATEGORIZERITEMATTRIBUTES,
ICATEGORIZERITEM_HRSTATUS,
ICATEGORIZERITEM_ICATEGORIZERLISTRESOLVE,
ICATEGORIZERITEM_ICATEGORIZERMAILMSGS,
ICATEGORIZERITEM_HRNDRREASON,
ICATEGORIZERITEM_DWLEVEL,
ICATEGORIZERITEM_FISRDNSEARCH,
ICATEGORIZERITEM_ENDENUMMESS
} eICATEGORIZERITEMPROPID;
typedef [v1_enum] enum
{
SOURCE_SENDER,
SOURCE_RECIPIENT,
SOURCE_VERIFY
} eSourceType;
[
local,
object,
uuid(86F9DA7C-EB6E-11d1-9DF3-00C04FA322BA),
helpstring("ICategorizerItem Interface"),
pointer_default(unique)
]
interface ICategorizerItem : ICategorizerProperties {};
//+------------------------------------------------------------
//
// Interface: ICategorizerAsyncContext
//
// Synopsis: Interface handed out to sinks containing async context methods
//
//
//-------------------------------------------------------------
[
object,
uuid(86F9DA7E-EB6E-11d1-9DF3-00C04FA322BA),
helpstring("ICategorizerAsyncCompletion Interface"),
pointer_default(unique)
]
interface ICategorizerAsyncContext : IUnknown
{
[local] HRESULT CompleteQuery(
[in] PVOID pvQueryContext,
[in] HRESULT hrResolutionStatus,
[in] DWORD dwcResults,
[in, size_is(dwcResults)] ICategorizerItemAttributes **rgpItemAttributes,
[in] BOOL fFinalCompletion);
}
//+------------------------------------------------------------
//
// Interface: ICategorizerListResolve
//
// Synopsis: Interface handed out to sinks that can spin off further resolves
//
//
//-------------------------------------------------------------
[
object,
uuid(960252A4-0A3A-11d2-9E00-00C04FA322BA),
helpstring("ICategorizerListResolve Interface"),
pointer_default(unique)
]
interface ICategorizerListResolve : IUnknown
{
[local] HRESULT AllocICategorizerItem(
[in] eSourceType SourceType,
[out] ICategorizerItem **ppICatItem);
[local] HRESULT ResolveICategorizerItem(
[in] ICategorizerItem *pICatItem);
[local] HRESULT SetListResolveStatus(
[in] HRESULT hrStatus);
[local] HRESULT GetListResolveStatus(
[out] HRESULT *phrStatus);
}
//+------------------------------------------------------------
//
// Interface: IMailTransportCategorize
//
// Synopsis: Interface a sink must implement in order to handle
// categorizer events
//
//
//-------------------------------------------------------------
[
object,
uuid(86F9DA7A-EB6E-11d1-9DF3-00C04FA322BA),
helpstring("IMailTransportCategorize Interface"),
pointer_default(unique)
]
interface IMailTransportCategorize : IUnknown
{
HRESULT Register(
[in] ICategorizerParameters *);
[local] HRESULT BeginMessageCategorization(
[in] ICategorizerMailMsgs *);
[local] HRESULT EndMessageCategorization(
[in] ICategorizerMailMsgs *,
[in] HRESULT hrCatStatus);
[local] HRESULT BuildQuery(
[in] ICategorizerParameters *,
[in] ICategorizerItem *);
[local] HRESULT BuildQueries(
[in] ICategorizerParameters *,
[in] DWORD dwcAddresses,
[in, size_is(dwcAddresses)] ICategorizerItem **rgpICategorizerItems,
[in] ICategorizerQueries *);
[local] HRESULT SendQuery(
[in] ICategorizerParameters *,
[in] ICategorizerQueries *,
[in] ICategorizerAsyncContext *,
[in] PVOID pvQueryContext);
[local] HRESULT SortQueryResult(
[in] ICategorizerParameters *,
[in] HRESULT hrResolutionStatus,
[in] DWORD dwcAddresses,
[in, size_is(dwcAddresses)] ICategorizerItem **rgpICategorizerItems,
[in] DWORD dwcResults,
[in, size_is(dwcResults)] ICategorizerItemAttributes **rgpICategorizerItemAttributes);
[local] HRESULT ProcessItem(
[in] ICategorizerParameters *,
[in] ICategorizerItem *);
[local] HRESULT ExpandItem(
[in] ICategorizerParameters *,
[in] ICategorizerItem *,
[in] IMailTransportNotify *,
[in] PVOID);
[local] HRESULT CompleteItem(
[in] ICategorizerParameters *,
[in] ICategorizerItem *);
};
//
// See smtpguid.h for the CLSID and Program ID of the CoCreateable
// Categorizer
//
//+------------------------------------------------------------
//
// Interface: ISMTPCategorizer
//
// Synopsis: Interface to the SMTP categorizer
//
//
//-------------------------------------------------------------
[
object,
local,
uuid(B23C35B8-9219-11d2-9E17-00C04FA322BA),
helpstring("ISMTPCategorizer Interface"),
pointer_default(unique)
]
interface ISMTPCategorizer : IUnknown
{
HRESULT ChangeConfig(
[in] PCCATCONFIGINFO pConfigInfo);
HRESULT CatMsg(
[in] IUnknown *pMsg,
[in] ISMTPCategorizerCompletion *pICompletion,
[in] LPVOID pContext);
HRESULT CatDLMsg(
[in] IUnknown *pMsg,
[in] ISMTPCategorizerDLCompletion *pICompletion,
[in] LPVOID pContext,
[in] BOOL fMatchOnly,
[in] CAT_ADDRESS_TYPE CAType,
[in] LPSTR pszAddress);
HRESULT CatCancel();
};
//+------------------------------------------------------------
//
// Interface: ISMTPCategorizerCompletion
//
// Synopsis: Async completion interface
//
//
//-------------------------------------------------------------
[
object,
local,
uuid(B23C35B9-9219-11d2-9E17-00C04FA322BA),
helpstring("ISMTPCategorizerCompletion Interface"),
pointer_default(unique)
]
interface ISMTPCategorizerCompletion : IUnknown
{
HRESULT CatCompletion(
HRESULT hr,
PVOID pContext,
IUnknown *pImsg,
IUnknown **rgpImsg);
};
//+------------------------------------------------------------
//
// Interface: ISMTPCategorizerDLCompletion
//
// Synopsis: Async completion interface
//
//
//-------------------------------------------------------------
[
object,
local,
uuid(B23C35BA-9219-11d2-9E17-00C04FA322BA),
helpstring("ISMTPCategorizerDLCompletion Interface"),
pointer_default(unique)
]
interface ISMTPCategorizerDLCompletion : IUnknown
{
HRESULT CatDLCompletion(
HRESULT hr,
PVOID pContext,
IUnknown *pImsg,
BOOL fMatch);
};
//---[ eDomainInfoFlags ]------------------------------------------------------
//
//
// Description: Flags used to describe boolean per domain properties
//
//-----------------------------------------------------------------------------
typedef [v1_enum] enum
{
//Outbound protocol property flags
DOMAIN_INFO_REMOTE = 0x00000000, //Default setting
DOMAIN_INFO_USE_SSL = 0x00000001, //Use SSL on outbound connections
DOMAIN_INFO_SEND_TURN = 0x00000002, //Send TURN on outbound connections
DOMAIN_INFO_SEND_ETRN = 0x00000004, //Send ETRN on outbound connections
DOMAIN_INFO_USE_NTLM = 0x00000008, //Use NTLM auth on outbound
DOMAIN_INFO_USE_PLAINTEXT = 0x00000010, //Use plaintext auth on outbound
DOMAIN_INFO_USE_DPA = 0x00000020, //Use DPA auth on outbound
DOMAIN_INFO_USE_KERBEROS = 0x00000040, //Use Kerberos auth on outbound
DOMAIN_INFO_USE_CHUNKING = 0x00000080, //Require binary chunking on outbound
DOMAIN_INFO_DISABLE_CHUNKING = 0x00000100, //For this specific domain disaalow CHUNKING
DOMAIN_INFO_DISABLE_BMIME = 0x00000200, //For this specific domain disallow BMIME
DOMAIN_INFO_DISABLE_DSN = 0x00000400, //For this specific domain disallow DSN
DOMAIN_INFO_DISABLE_PIPELINE = 0x00000800, //For this specific domain disallow PIPElineing
DOMAIN_INFO_USE_HELO = 0x00001000, //Send HELO instead of EHLO
//Queueing/Routing flags
DOMAIN_INFO_TURN_ONLY = 0x00010000, //Create connection only when asked (uses GetNamedConnection)
DOMAIN_INFO_ETRN_ONLY = 0x00020000, //Do no create connections until told to (uses GetNextConnection)
DOMAIN_INFO_LOCAL_DROP = 0x00040000, //Local drop domain
DOMAIN_INFO_LOCAL_MAILBOX = 0x00080000, //Local domain (no drop directory)
DOMAIN_INFO_REMOTE_SMARTHOST = 0x00100000, //Remote domain with smart host
DOMAIN_INFO_IP_RELAY = 0x00200000, //Allow Relay based on IP address
DOMAIN_INFO_AUTH_RELAY = 0x00400000, //Allow Relay based on authentication
DOMAIN_INFO_DOMAIN_RELAY = 0x00800000, //Allow Relay based on domain name
DOMAIN_INFO_ALIAS = 0x01000000, //Local alias domain
DOMAIN_INFO_TURN_ON_EMPTY = 0x02000000, //TURN works on empty conns
DOMAIN_INFO_INVALID = 0x80000000, //Used for returning "invalid" or "not found" info
} eDomainInfoFlags ;
//+------------------------------------------------------------
//
// Interface: ICategorizerDomainInfo
//
// Synopsis: An interface to retrieve above domain info flags
// describing a given SMTP domain
//
//-------------------------------------------------------------
[
object,
local,
uuid(E210EDC6-F27D-481f-9DFC-1CA840905FD9),
helpstring("ICategorizerDomainInfo Interface"),
pointer_default(unique)
]
interface ICategorizerDomainInfo : IUnknown
{
HRESULT GetDomainInfoFlags(
[in, string] LPSTR szDomainName,
[out] DWORD *pdwDomainInfoFlags);
}
//+------------------------------------------------------------
//
// Interfaces pulled in from catintrnl.idl
//
interface ICategorizerRequestedAttributes;
interface ICategorizerLdapConfig;
interface IServersListInfo;
//+------------------------------------------------------------
//
// Interface: ICategorizerParametersEx
//
// Synopsis: ICategorizerParameters plus new methods to retrieve
// requested attributes, register an interface which may be called
// to get the list of GCs from dsaccess. Also a "Get" function for
// the aforementioned interface.
//
// History:
// jstamerj 1999/07/08 14:24:56: Created
//
//-------------------------------------------------------------
[
object,
local,
uuid(E962BA1F-3FB9-11d3-80D7-00C04FA322BA),
helpstring("ICategorizerParametersEx Interface"),
pointer_default(unique)
]
interface ICategorizerParametersEx : ICategorizerParameters
{
HRESULT GetDSParameterW(
[in] DWORD dwDSParameter,
[out] LPWSTR *ppszValue);
HRESULT GetRequestedAttributes(
[out] ICategorizerRequestedAttributes **ppIRequestedAttributes);
HRESULT RegisterCatLdapConfigInterface(
[out] ICategorizerLdapConfig *pICategorizerLdapConfig);
HRESULT GetLdapConfigInterface(
[out] ICategorizerLdapConfig **ppICatLdapConfigInfo);
};
//+------------------------------------------------------------
//
// Interface: ICategorizerRequestedAttributes
//
// Synopsis: Contains a read-only method to retrieve all the requested
// attributes
//
// History:
// jstamerj 1999/07/08 14:24:56: Created
//
//-------------------------------------------------------------
[
object,
local,
uuid(CB0924E0-357B-11d3-8328-00C04FA322BA),
helpstring("ICategorizerRequestedAttributes Interface"),
pointer_default(unique)
]
interface ICategorizerRequestedAttributes : IUnknown
{
HRESULT GetAllAttributes(
[out] LPSTR **prgszAllAttributes);
HRESULT GetAllAttributesW(
[out] LPWSTR **prgszAllAttributes);
};
//+------------------------------------------------------------
//
// Interface: ICategorizerUTF8Attributes
//
// Synopsis: Methods to retrieve attributes as UTF8 strings
//
// History:
// jstamerj 1999/07/08 14:24:56: Created
//
//-------------------------------------------------------------
[
object,
local,
uuid(BEBF931D-17E0-4ec8-BC1C-CC3286D72CB7),
helpstring("ICategorizerUTF8Attributes Interface"),
pointer_default(unique)
]
interface ICategorizerUTF8Attributes : IUnknown
{
[local] HRESULT BeginUTF8AttributeEnumeration(
[in, unique] LPCSTR pszAttributeName,
[in] PATTRIBUTE_ENUMERATOR penumerator);
[local] HRESULT GetNextUTF8AttributeValue(
[in] PATTRIBUTE_ENUMERATOR penumerator,
[out] LPSTR *ppszAttributeValue);
[local] HRESULT RewindUTF8AttributeEnumeration(
[in] PATTRIBUTE_ENUMERATOR penumerator);
[local] HRESULT EndUTF8AttributeEnumeration(
[in] PATTRIBUTE_ENUMERATOR penumerator);
[local] HRESULT CountUTF8AttributeValues(
[in] PATTRIBUTE_ENUMERATOR penumerator,
[out] DWORD *pdwCount);
};
//+------------------------------------------------------------
//
// Interface: ICategorizerLdapConfig
//
// Synopsis: Contains a function that may be queried for the GCs
// on the machine as discovered by dsaccess (or as read from the
// registry by dsaccess).
//
// History:
// gpulla created
//
//-------------------------------------------------------------
[
object,
local,
uuid(27C1B2D3-1A28-4b90-BC0A-E52057D30712),
helpstring("ICategorizerLdapConfig Interface"),
pointer_default(unique)
]
interface ICategorizerLdapConfig : IUnknown
{
HRESULT GetGCServers(
[out] IServersListInfo **pIServersListInfo);
};
//+------------------------------------------------------------
//
// Interface: IServersListInfo
//
// Synopsis: Interface to an object encapsulating the list of
// GCs described above. Functions allow querying the number of
// GCs and enumerating through the GCs.
//
// History:
// gpulla created
//
//-------------------------------------------------------------
[
object,
local,
uuid(C54CEA94-E501-4f34-8704-F5881EA5CBF4),
helpstring("IServersListInfo Interface"),
pointer_default(unique)
]
interface IServersListInfo : IUnknown
{
HRESULT GetNumGC(
[out] DWORD *dwGC);
HRESULT GetItem(
[in] DWORD dwIdx,
[out] DWORD *dwPort,
[out] LPSTR *pszServerName);
};
//-----------------------------------------------------------------------------
// DSN Event Interfaces
//-----------------------------------------------------------------------------
//---[ eDSNActions ]-----------------------------------------------------------
//
//
// Description: Possible actions for DSN Generation events
//
//
//-----------------------------------------------------------------------------
typedef [v1_enum] enum
{
DSN_ACTION_FAILURE = 0x00000001, //Generate a FAILURE DSN for FAILED recips
DSN_ACTION_FAILURE_ALL = 0x00000002, //Generate a FAILURE DSN for UNDELIVERED and FAILED recips
DSN_ACTION_DELAYED = 0x00000004, //Generate a DELAY DSN for undelivered recips
DSN_ACTION_RELAYED = 0x00000008, //Generate a RELAY DSN for delivered recips
DSN_ACTION_EXPANDED = 0x00000010, //Generate a EXPANDED DSN for expanded
DSN_ACTION_DELIVERED = 0x00000020, //Generate a DELIVERED DSN for delivered recips
DSN_ACTION_TYPE_MASK = 0x0000003F, //Mask for the bits describing the type of DSN
DSN_ACTION_IGNORE_RET = 0x00000400, //Ignore RET and use Default specified
DSN_ACTION_CONTEXT_STORE= 0x00100000, //DSN is being generated because of store
DSN_ACTION_CONTEXT_CAT = 0x00200000, //DSN is being generated because of cat
DSN_ACTION_CONTEXT_MTA = 0x00400000, //DSN is being generated becuase of mta
} eDSNActions ;
//---[ eDSNRETType ]-----------------------------------------------------------
//
//
// Description: Possible DSN return types
//
//
//-----------------------------------------------------------------------------
typedef [v1_enum] enum
{
// Return the full message
DSN_RET_FULL = 1,
// Return the original headers
DSN_RET_HDRS,
// Return some of the original headers (much cheaper, but not RFC compliant)
DSN_RET_PARTIAL_HDRS,
} eDSNRETType;
//---[ eDSNProperties ]--------------------------------------------------------
//
//
// Description: Property IDs for DSN property bag
//
//
//-----------------------------------------------------------------------------
typedef [v1_enum] enum
{
//
// Status codes for DSN generation
//
DSNPROP_DW_DSNACTIONS = 1,
DSNPROP_DW_DSNOPTIONS,
DSNPROP_DW_RFC821STATUS,
DSNPROP_DW_HRSTATUS,
//
// Text to use in DSN generation text
//
DSNPROP_SZ_DEFAULTDOMAIN,
DSNPROP_SZ_REPORTINGMTA,
DSNPROP_SZ_REPORTINGMTATYPE,
DSNPROP_SZ_DSNCONTEXT, // For X-DSNContext header
//
// Preferred language
//
DSNPROP_DW_LANGID,
//
// SMTP address to receive a copy of NDRs
//
DSNPROP_SZ_COPYNDRTO,
//
// Expire time
//
DSNPROP_FT_EXPIRETIME,
//
// Custom text to insert before human readable part of DSN
//
DSNPROP_SZ_HR_TOP_CUSTOM_TEXT_A, // Ascii text
DSNPROP_SZ_HR_TOP_CUSTOM_TEXT_W, // Unicode text
//
// Custom text to insert after human readable part of DSN
//
DSNPROP_SZ_HR_BOTTOM_CUSTOM_TEXT_A, // Ascii text
DSNPROP_SZ_HR_BOTTOM_CUSTOM_TEXT_W, // Unicode text
//
// If set to TRUE, message will be copied to badmail
// (ie. an NDR an NDR was to be generated)
//
DSNPROP_F_BADMAIL_MSG,
//
// On errors, return status to aqueue here
//
DSNPROP_DW_HR_RETURN_STATUS,
//
// The return type of the original message
//
DSNPROP_DW_RET_TYPE,
//
// Value for the X-Content-Failrue header (HRESULT)
//
DSNPROP_DW_CONTENT_FAILURE,
} eDSNProperties;
//---[ eDSNOptions ]-----------------------------------------------------------
//
//
// Description:
// Options flags for DSN options passed into AQueue.
// See aqueue.idl for definiton of DSN options
// These options should be moved to smtpevent.idl
//
//-----------------------------------------------------------------------------
// typedef [v1_enum] enum
// {
// DSN_OPTIONS_DEFAULT = 0x00000000,
// DSN_OPTIONS_IGNORE_MSG_RET = 0x00000004,
// DSN_OPTIONS_SEND_DELAY_DEFAULT = 0x00000008,
// DSN_OPTIONS_SEND_DELAY_UPON_REQUEST = 0x00000010,
// DSN_OPTIONS_SEND_DELAY_NEVER = 0x00000020,
// } eDSNOptions;
interface IDSNRecipientIterator;
interface IDSNSubmission;
//+------------------------------------------------------------
//
// Interface: IDSNGenerationSink
//
// Synopsis: Sink implemented methods to control DSN generation
//
// History:
// jstamerj 2000/11/05 23:34:01: Created
//
//-------------------------------------------------------------
[
object,
uuid(3A513AB9-339D-4589-A137-D54C5F520E6F),
helpstring("IDSNGenerationSink Interface"),
pointer_default(unique)
]
interface IDSNGenerationSink : IUnknown
{
//
// Called just once after the sink is created.
// If an error is returned, sink creation fails.
//
HRESULT OnSyncSinkInit(
[in] DWORD dwVSID);
//
// DSN Event.
// Called to get the DSN recipient iterator interface.
// The recipient iterator interface returns the recipient indicies
// and DSN actions for recipents that should be in the DSN.
//
// pRecipIterIN is the system's current recipient iterator
// interface (the interface returned by the last sink called)
// Sinks can capture and aggregate pRecipIterIN if desired.
// ppRecipIterOUT is the return parameter for the sink's recip
// iterator interface. If a sink does not wish to return a
// recip iterator interface, this paramter can be left NULL. If a
// sink does return a recip iter interface in *ppIREcipIterOut,
// then the sink must add a reference count for the caller (call
// AddRef() before returning the interface).
//
HRESULT OnSyncGetDSNRecipientIterator(
[in] ISMTPServer *pISMTPServer,
[in] IMailMsgProperties *pIMsg,
[in] IMailMsgPropertyBag *pIDSNProperties,
[in] DWORD dwStartDomain,
[in] DWORD dwDSNActions,
[in] IDSNRecipientIterator *pIRecipIterIN,
[out] IDSNRecipientIterator **ppIRecipIterOUT);
//
// DSN Event.
// Called to generate DSN mailmsg(s). The new messages should be
// submitted back to SMTPSVC using IDSNSubmission.
// Sinks should complete synchronously. Sink should not use these
// interface pointers after OnSyncGenerateDSN has returned.
//
HRESULT OnSyncGenerateDSN(
[in] ISMTPServer *pISMTPServer,
[in] IDSNSubmission *pIDSNSubmission,
[in] IMailMsgProperties *pIMsg,
[in] IMailMsgPropertyBag *pIDSNProperties,
[in] IDSNRecipientIterator *pIRecipIter);
//
// Post DSN event.
// Called for created DSNs that are submitted back to the
// transport.
// Sinks should complete synchronously. Sink should not use these
// interface pointers after OnSyncPostGenerateDSN has returned.
//
HRESULT OnSyncPostGenerateDSN(
[in] ISMTPServer *pISMTPServer,
[in] IMailMsgProperties *pIMsgOrig,
[in] DWORD dwDSNAction,
[in] DWORD cRecipsDSNd,
[in] IMailMsgProperties *pIMsgDSN,
[in] IMailMsgPropertyBag *pIDSNProperties);
};
//+------------------------------------------------------------
//
// Interface: IDSNRecipientIterator
//
// Synopsis: Iterates through recipients for which a DSN should be
// generated.
//
// History:
// jstamerj 2000/11/05 23:49:01: Created
//
//-------------------------------------------------------------
[
object,
uuid(1D45C98A-56A0-4fe8-BF33-8986EEB85B63),
helpstring("IDSNRecipientIterator Interface"),
pointer_default(unique)
]
interface IDSNRecipientIterator : IUnknown
{
//
// Restart recipient iteration from the beginning
//
HRESULT HrReset();
//
// Get the next recipient for which a DSN should be generated
// This will return HRESULT_FROM_WIN32(ERROR_NO_MORE_ITEMS) to
// indicate there are no more recipients.
//
HRESULT HrGetNextRecipient(
[out] DWORD *piRecipient,
[out] DWORD *pdwDSNAction);
//
// Mark the recipient so that it will be skipped in further
// iterations (no further DSNs will be generated.
//
HRESULT HrNotifyActionHandled(
[in] DWORD iRecipient,
[in] DWORD dwDSNAction);
};
//+------------------------------------------------------------
//
// Interface: IDSNSubmission
//
// Synopsis: Callback interface for a sink to submit a DSN to the
// system DURING OnSyncGenerateDSN. This interface may not
// be used after the event has completed.
//
// History:
// jstamerj 2000/12/08 13:28:09: Created
//
//-------------------------------------------------------------
[
object,
uuid(C016B75D-CE65-496f-A2C9-B487C83C0F6B),
helpstring("IDSNSubmission Interface"),
pointer_default(unique),
local
]
interface IDSNSubmission : IUnknown
{
//
// Allocate a Bound Message
// phContent is managed by mailmsg, so the caller should not
// release this handle.
//
HRESULT HrAllocBoundMessage(
[out] IMailMsgProperties **ppMsg,
[out] PFIO_CONTEXT *phContent);
//
// Submit a DSN to the system
//
HRESULT HrSubmitDSN(
[in] DWORD dwDSNAction,
[in] DWORD cRecipsDSNd,
[in] IMailMsgProperties *pDSNMsg);
};
cpp_quote("#endif //__SMTPEVENT_H__")