diff --git a/.gitignore b/.gitignore
index 95fa523..bc6401b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -577,6 +577,8 @@
 include/htiframe.h
 include/iads.h
 include/icftypes.h
+include/imnact.h
+include/imnxport.h
 include/indexsrv.h
 include/mediaobj.h
 include/mimeinfo.h
diff --git a/include/Makefile.in b/include/Makefile.in
index 9835f09..4522d2b 100644
--- a/include/Makefile.in
+++ b/include/Makefile.in
@@ -24,6 +24,8 @@
 	htiframe.idl \
 	iads.idl \
 	icftypes.idl \
+	imnact.idl \
+	imnxport.idl \
 	indexsrv.idl \
 	mediaobj.idl \
 	mimeinfo.idl \
diff --git a/include/imnact.idl b/include/imnact.idl
new file mode 100644
index 0000000..ee2460a
--- /dev/null
+++ b/include/imnact.idl
@@ -0,0 +1,299 @@
+/*
+ * Copyright 2006 Robert Shearman for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+import "objidl.idl";
+
+interface IImnAccount;
+
+cpp_quote("#ifndef HR_E")
+cpp_quote("#define HR_E(n) MAKE_SCODE(SEVERITY_ERROR, FACILITY_INTERNET, n)")
+cpp_quote("#endif")
+cpp_quote("#ifndef HR_S")
+cpp_quote("#define HR_S(n) MAKE_SCODE(SEVERITY_SUCCESS, FACILITY_INTERNET, n)")
+cpp_quote("#endif")
+
+typedef enum tagSMTPAUTHTYPE
+{
+    SMTP_AUTH_NONE,
+    SMTP_AUTH_SICILY,
+    SMTP_AUTH_USE_POP3ORIMAP_SETTINGS,
+    SMTP_AUTH_USE_SMTP_SETTINGS,
+} SMTPAUTHTYPE;
+
+const SHORT CCHMAX_ORG_NAME = 256;
+const SHORT CCHMAX_DISPLAY_NAME = 256;
+const SHORT CCHMAX_ACCOUNT_NAME = 256;
+const SHORT CCHMAX_SERVER_NAME = 256;
+const SHORT CCHMAX_PASSWORD = 256;
+const SHORT CCHMAX_USERNAME = 256;
+const SHORT CCHMAX_EMAIL_ADDRESS = 256;
+const SHORT CCHMAX_CONNECTOID = 256;
+const SHORT CCHMAX_SEARCH_BASE = 256;
+const SHORT CCHMAX_ROOT_FOLDER = 256;
+const SHORT CCHMAX_SIGNATURE = 16;
+const SHORT CCHMAX_SERVICE = 256;
+
+[
+    object,
+    uuid(0A06BD31-166F-11D0-81B9-00C04FD85AB4),
+    pointer_default(unique)
+]
+interface IImnAdviseAccount : IUnknown
+{
+    typedef enum
+    {
+        ACCT_NEWS,
+        ACCT_MAIL,
+        ACCT_DIR_SERV,
+        ACCT_LAST
+    } ACCTTYPE;
+
+    typedef struct tagAccountContext
+    {
+        ACCTTYPE AcctType;
+        LPSTR pszAccountID;
+        LPSTR pszOldName;
+        DWORD dwServerType;
+    } ACTX;
+
+    HRESULT AdviseAccount(
+        [in]    DWORD dwAdviseType,
+        [in]    ACTX *pAcctCtx);
+}
+
+[
+    object,
+    uuid(8D0AED11-1638-11D0-81B9-00C04FD85AB4),
+    pointer_default(unique)
+]
+interface IImnAdviseMigrateServer : IUnknown
+{
+    HRESULT MigrateServer(
+        [in]    DWORD dwSrvType,
+        [in]    IImnAccount *pAccount);
+}
+
+[
+    object,
+    uuid(FD465483-1384-11D0-ABBD-0020AFDFD10A),
+    pointer_default(unique)
+]
+interface IImnEnumAccounts : IUnknown
+{
+    HRESULT GetCount(
+        [out]   ULONG *pcItems);
+
+    HRESULT SortByAccountName();
+
+    HRESULT GetNext(
+        [out]   IImnAccount **ppAccount);
+
+    HRESULT Reset();
+}
+
+[
+    object,
+    uuid(FD465481-1384-11D0-ABBD-0020AFDFD10A),
+    pointer_default(unique)
+]
+interface IImnAccountManager : IUnknown
+{
+    typedef struct tagACCTLISTINFO
+    {
+        DWORD cbSize;
+        ACCTTYPE AcctTypeInit;
+        DWORD dwAcctFlags;
+        DWORD dwFlags;
+    } ACCTLISTINFO;
+
+    HRESULT Init(
+        [in]    IImnAdviseMigrateServer *pAdviseMigrateServer);
+
+    HRESULT CreateAccountObject(
+        [in]    ACCTTYPE AcctType,
+        [out]   IImnAccount **ppAccount);
+
+    HRESULT Enumerate(
+        [in]    DWORD dwSrvTypes,
+        [out]   IImnEnumAccounts **ppEnumAccounts);
+
+    HRESULT GetAccountCount(
+        [in]    ACCTTYPE AcctType,
+        [out]   ULONG *pcServers);
+
+    HRESULT FindAccount(
+        [in]    DWORD dwPropTag,
+        [in]    LPCSTR pszSearchData,
+        [out]   IImnAccount **ppAccount);
+
+    HRESULT GetDefaultAccountName(
+        [in]    ACCTTYPE AcctType,
+        [in,ref] LPSTR pszAccount,
+        [in]    ULONG cchMax);
+
+    HRESULT ProcessNotification(
+        [in]    UINT uMsg,
+        [in]    WPARAM wParam,
+        [in]    LPARAM lParam);
+
+    HRESULT ValidateDefaultSendAccount();
+
+    HRESULT AccountListDialog(
+        [in]    HWND hwnd,
+        [in]    ACCTLISTINFO *pinfo);
+
+    HRESULT Advise(
+        [in]    IImnAdviseAccount *pAdviseAccount,
+        [out]   DWORD *pdwConnection);
+
+    HRESULT Unadvise(
+        [in]    DWORD dwConnection);
+
+    HRESULT GetUniqueAccountName(
+        [in]    LPSTR szName,
+        [in]    UINT cch);
+
+    HRESULT InitEx(
+        [in]    IImnAdviseMigrateServer *pAdviseMigrateServer,
+        [in]    DWORD dwFlags);
+}
+
+[
+    object,
+    uuid(C43DFC6F-62BB-11D2-A727-00C04F79E7C8),
+    pointer_default(unique)
+]
+interface IImnAccountManager2 : IImnAccountManager
+{
+    HRESULT InitUser(
+        [in]    IImnAdviseMigrateServer *pAdviseMigrateServer,
+        [in]    REFGUID rguidID,
+        [in]    DWORD dwFlags);
+
+    HRESULT GetIncompleteAccount(
+        [in]    ACCTTYPE AcctType,
+        [in,ref] LPSTR pszAccountId,
+        [in]    ULONG cchMax);
+
+    HRESULT SetIncompleteAccount(
+        [in]    ACCTTYPE AcctType,
+        [in]    LPCSTR pszAccountId);
+}
+
+[
+    object,
+    uuid(FD465484-1384-11D0-ABBD-0020AFDFD10A),
+    pointer_default(unique)
+]
+interface IPropertyContainer : IUnknown
+{
+    typedef enum
+    {
+        TYPE_ERROR = 1000,
+        TYPE_DWORD,
+        TYPE_LONG,
+        TYPE_WORD,
+        TYPE_SHORT,
+        TYPE_BYTE,
+        TYPE_CHAR,
+        TYPE_FILETIME,
+        TYPE_STRING,
+        TYPE_BINARY,
+        TYPE_FLAGS,
+        TYPE_STREAM,
+        TYPE_WSTRING,
+        TYPE_BOOL,
+        TYPE_PASS,
+        TYPE_LAST
+    } PROPTYPE;
+
+cpp_quote("#ifdef WINE_NO_UNICODE_MACROS")
+cpp_quote("#undef GetProp")
+cpp_quote("#undef SetProp")
+cpp_quote("#endif")
+
+    HRESULT GetProp(
+        [in]    DWORD dwPropTag,
+        [in,size_is(*pcb),ref] BYTE *pb,
+        [in]    ULONG *pcb);
+
+    HRESULT GetPropDw(
+        [in]    DWORD dwPropTag,
+        [out]   DWORD *pdw);
+
+    HRESULT GetPropSz(
+        [in]    DWORD dwPropTag,
+        [in,ref] LPSTR psz,
+        [in]    ULONG cchMax);
+
+    HRESULT SetProp(
+        [in]    DWORD dwPropTag,
+        [in,size_is(cb)] BYTE *pb,
+        [in]    ULONG cb);
+
+    HRESULT SetPropDw(
+        [in]    DWORD dwPropTag,
+        [in]    DWORD dw);
+
+    HRESULT SetPropSz(
+        [in]    DWORD dwPropTag,
+        [in]    LPSTR psz);
+}
+
+[
+    object,
+    uuid(FD465482-1384-11D0-ABBD-0020AFDFD10A),
+    pointer_default(unique)
+]
+interface IImnAccount : IPropertyContainer
+{
+    HRESULT Exist();
+
+    HRESULT SetAsDefault();
+
+    HRESULT Delete();
+
+    HRESULT SaveChanges();
+
+    HRESULT GetAccountType(
+        [out]   ACCTTYPE *pAcctType);
+
+    HRESULT GetServerTypes(
+        [out]   DWORD *pdwSrvTypes);
+
+    HRESULT ShowProperties(
+        [in]    HWND hwnd,
+        [in]    DWORD dwFlags);
+
+    HRESULT ValidateProperty(
+        [in]    DWORD dwPropTag,
+        [in,size_is(cb)] BYTE *pb,
+        [in]    ULONG cb);
+
+    HRESULT DoWizard(
+        [in]    HWND hwnd,
+        [in]    DWORD dwFlags);
+
+    HRESULT DoImportWizard(
+        [in]    HWND hwnd,
+        [in]    CLSID clsid,
+        [in]    DWORD dwFlags);
+}
+
+cpp_quote("HRESULT WINAPI HrCreateAccountManager(IImnAccountManager **ppAccountManager);")
+cpp_quote("HRESULT WINAPI ValidEmailAddress(LPSTR lpAddress);")
diff --git a/include/imnxport.idl b/include/imnxport.idl
new file mode 100644
index 0000000..50f3e4e
--- /dev/null
+++ b/include/imnxport.idl
@@ -0,0 +1,699 @@
+/*
+ * Copyright 2006 Robert Shearman for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+import "imnact.idl";
+
+interface IInternetTransport;
+interface ISMTPTransport;
+interface IPOP3Transport;
+
+/* CLSIDs */
+
+cpp_quote("DEFINE_GUID(CLSID_IInternetMessageUrl, 0xca30cc91, 0xb1b3, 0x11d0, 0x85, 0xd0, 0x00, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
+cpp_quote("DEFINE_GUID(CLSID_ISMTPTransport, 0xfd853ce6, 0x7f86, 0x11d0, 0x82, 0x52, 0x00, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
+cpp_quote("DEFINE_GUID(CLSID_IPOP3Transport, 0xfd853ce7, 0x7f86, 0x11d0, 0x82, 0x52, 0x00, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
+cpp_quote("DEFINE_GUID(CLSID_INNTPTransport, 0xfd853ce8, 0x7f86, 0x11d0, 0x82, 0x52, 0x00, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
+cpp_quote("DEFINE_GUID(CLSID_IRASTransport, 0xfd853ce9, 0x7f86, 0x11d0, 0x82, 0x52, 0x00, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
+cpp_quote("DEFINE_GUID(CLSID_IRangeList, 0xfd853cea, 0x7f86, 0x11d0, 0x82, 0x52, 0x00, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
+cpp_quote("DEFINE_GUID(CLSID_IIMAPTransport, 0xfd853ceb, 0x7f86, 0x11d0, 0x82, 0x52, 0x00, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
+cpp_quote("DEFINE_GUID(CLSID_IHTTPMailTransport, 0x5a580c11, 0xe5eb, 0x11d1, 0xa8, 0x6e, 0x00, 0x00, 0xf8, 0x08, 0x4f, 0x96);")
+cpp_quote("DEFINE_GUID(CLSID_IPropFindRequest, 0xbb847b8a, 0x054a, 0x11d2, 0xa8, 0x94, 0x00, 0x00, 0xf8, 0x08, 0x4f, 0x96);")
+cpp_quote("DEFINE_GUID(CLSID_IPropPatchRequest, 0xea678830, 0x235d, 0x11d2, 0xa8, 0xb6, 0x00, 0x00, 0xf8, 0x08, 0x4f, 0x96);")
+
+/* Error Codes */
+
+cpp_quote("#ifndef HR_E")
+cpp_quote("#define HR_E(n) MAKE_SCODE(SEVERITY_ERROR, FACILITY_INTERNET, n)")
+cpp_quote("#endif")
+cpp_quote("#ifndef HR_S")
+cpp_quote("#define HR_S(n) MAKE_SCODE(SEVERITY_SUCCESS, FACILITY_INTERNET, n)")
+cpp_quote("#endif")
+
+/* General Error Codes */
+cpp_quote("#define IXP_E_LOAD_SICILY_FAILED     HR_E(0xCC00)")
+cpp_quote("#define IXP_E_INVALID_CERT_CN        HR_E(0xCC01)")
+cpp_quote("#define IXP_E_INVALID_CERT_DATE      HR_E(0xCC02)")
+cpp_quote("#define IXP_E_ALREADY_CONNECTED      HR_E(0xCC03)")
+cpp_quote("#define IXP_E_CONN                   HR_E(0xCC04)")
+cpp_quote("#define IXP_E_NOT_CONNECTED          HR_E(0xCC05)")
+cpp_quote("#define IXP_E_CONN_SEND              HR_E(0xCC06)")
+cpp_quote("#define IXP_E_WOULD_BLOCK            HR_E(0xCC07)")
+cpp_quote("#define IXP_E_INVALID_STATE          HR_E(0xCC08)")
+cpp_quote("#define IXP_E_CONN_RECV              HR_E(0xCC09)")
+cpp_quote("#define IXP_E_INCOMPLETE             HR_E(0xCC0A)")
+cpp_quote("#define IXP_E_BUSY                   HR_E(0xCC0B)")
+cpp_quote("#define IXP_E_NOT_INIT               HR_E(0xCC0C)")
+cpp_quote("#define IXP_E_CANT_FIND_HOST         HR_E(0xCC0D)")
+cpp_quote("#define IXP_E_FAILED_TO_CONNECT      HR_E(0xCC0E)")
+cpp_quote("#define IXP_E_CONNECTION_DROPPED     HR_E(0xCC0F)")
+cpp_quote("#define IXP_E_INVALID_ADDRESS        HR_E(0xCC10)")
+cpp_quote("#define IXP_E_INVALID_ADDRESS_LIST   HR_E(0xCC11)")
+cpp_quote("#define IXP_E_SOCKET_READ_ERROR      HR_E(0xCC12)")
+cpp_quote("#define IXP_E_SOCKET_WRITE_ERROR     HR_E(0xCC13)")
+cpp_quote("#define IXP_E_SCOKET_INIT_ERROR      HR_E(0xCC14)")
+cpp_quote("#define IXP_E_SOCKET_CONNECT_ERROR   HR_E(0xCC15)")
+cpp_quote("#define IXP_E_INVALID_ACCOUNT        HR_E(0xCC16)")
+cpp_quote("#define IXP_E_USER_CANCEL            HR_E(0xCC17)")
+cpp_quote("#define IXP_E_SICILY_LOGON_FAILED    HR_E(0xCC18)")
+cpp_quote("#define IXP_E_TIMEOUT                HR_E(0xCC19)")
+cpp_quote("#define IXP_E_SECURE_CONNECT_FAILED  HR_E(0xCC1A)")
+
+/* SMTP Failure Statuses */
+cpp_quote("#define IXP_E_SMTP_RESPONSE_ERROR            HR_E(0xCC60)")
+cpp_quote("#define IXP_E_SMTP_UNKNOWN_RESPONSE_CODE     HR_E(0xCC61)")
+cpp_quote("#define IXP_E_SMTP_500_SYNTAX_ERROR          HR_E(0xCC62)")
+cpp_quote("#define IXP_E_SMTP_501_PARAM_SYNTAX          HR_E(0xCC63)")
+cpp_quote("#define IXP_E_SMTP_502_COMMAND_NOTIMPL       HR_E(0xCC64)")
+cpp_quote("#define IXP_E_SMTP_503_COMMAND_SEQ           HR_E(0xCC65)")
+cpp_quote("#define IXP_E_SMTP_504_COMMAND_PARAM_NOTIMPL HR_E(0xCC66)")
+cpp_quote("#define IXP_E_SMTP_421_NOT_AVAILABLE         HR_E(0xCC67)")
+cpp_quote("#define IXP_E_SMTP_450_MAILBOX_BUSY          HR_E(0xCC68)")
+cpp_quote("#define IXP_E_SMTP_550_MAILBOX_NOT_FOUND     HR_E(0xCC69)")
+cpp_quote("#define IXP_E_SMTP_451_ERROR_PROCESSING      HR_E(0xCC6A)")
+cpp_quote("#define IXP_E_SMTP_551_USER_NOT_LOCAL        HR_E(0xCC6B)")
+cpp_quote("#define IXP_E_SMTP_452_NO_SYSTEM_STORAGE     HR_E(0xCC6C)")
+cpp_quote("#define IXP_E_SMTP_552_STORAGE_OVERFLOW      HR_E(0xCC6D)")
+cpp_quote("#define IXP_E_SMTP_553_MAILBOX_NAME_SYNTAX   HR_E(0xCC6E)")
+cpp_quote("#define IXP_E_SMTP_554_TRANSACT_FAILED       HR_E(0xCC6F)")
+
+/* SMTP Success Statuses */
+cpp_quote("#define IXP_E_SMTP_211_SYSTEM_STATUS         HR_S(0xCC70)")
+cpp_quote("#define IXP_E_SMTP_214_HELP_MESSAGE          HR_S(0xCC71)")
+cpp_quote("#define IXP_E_SMTP_220_READY                 HR_S(0xCC72)")
+cpp_quote("#define IXP_E_SMTP_221_CLOSING               HR_S(0xCC73)")
+cpp_quote("#define IXP_E_SMTP_250_MAIL_ACTION_OKAY      HR_S(0xCC74)")
+cpp_quote("#define IXP_E_SMTP_251_FORWARDING_MAIL       HR_S(0xCC75)")
+cpp_quote("#define IXP_E_SMTP_354_START_MAIL_INPUT      HR_S(0xCC76)")
+cpp_quote("#define IXP_E_SMTP_CONTINUE                  HR_S(0xCC77)")
+cpp_quote("#define IXP_E_SMTP_334_AUTH_READY_RESPONSE   HR_S(0xCC78)")
+cpp_quote("#define IXP_E_SMTP_245_AUTH_SUCCESS          HR_S(0xCC79)")
+
+/* More SMTP Failure Statuses */
+cpp_quote("#define IXP_E_SMTP_REJECTED_SENDER           HR_E(0xCC78)")
+cpp_quote("#define IXP_E_SMTP_REJECTED_RECIPIENTS       HR_E(0xCC79)")
+cpp_quote("#define IXP_E_SMTP_NO_SENDER                 HR_E(0xCC7A)")
+cpp_quote("#define IXP_E_SMTP_NO_RECIPIENTS             HR_E(0xCC7B)")
+cpp_quote("#define IXP_E_SMTP_530_STARTTLS_REQUIRED     HR_E(0xCC7C)")
+cpp_quote("#define IXP_E_SMTP_NO_STARTTLS_SUPPORT       HR_E(0xCC7D)")
+cpp_quote("#define IXP_E_SMTP_NO_DSN_SUPPORT            HR_E(0xCC7E)")
+cpp_quote("#define IXP_E_SMTP_454_STARTTLS_FAILED       HR_E(0xCC7F)")
+
+const SHORT CCHMAX_DOMAIN = 256;
+const SHORT CCHMAX_PHONE_NUMBER = 128;
+
+const DWORD DEFAULT_IMAP_PORT = 143;
+const DWORD DEFAULT_POP3_PORT = 110;
+const DWORD DEFAULT_SMTP_PORT = 25;
+const DWORD DEFAULT_NNTP_PORT = 119;
+
+typedef enum tagINETADDRTYPE
+{
+    ADDR_TO,
+    ADDR_FROM,
+    ADDR_DSN_NEVER = 16,
+    ADDR_DSN_SUCCESS = 32,
+    ADDR_DSN_FAILURE = 64,
+    ADDR_DSN_DELAY = 128
+} INETADDRTYPE;
+
+const DWORD ADDR_TOFROM_MASK = 0x1;
+const DWORD ADDR_DSN_MASK = 0xf0;
+
+typedef enum tagDSNRET
+{
+    DSNRET_DEFAULT,
+    DSNRET_HDRS,
+    DSNRET_FULL,
+} DSNRET;
+
+typedef struct tagINETADDR
+{
+    INETADDRTYPE addrtype;
+    CHAR szEmail[CCHMAX_EMAIL_ADDRESS];
+} INETADDR, *LPINETADDR;
+
+typedef struct tagINETADDRLIST
+{
+    ULONG cAddress;
+    LPINETADDR prgAddress;
+} INETADDRLIST, *LPINETADDRLIST;
+
+typedef enum tagRASCONNTYPE
+{
+    RAS_CONNECT_LAN,
+    RAS_CONNECT_MANUAL,
+    RAS_CONNECT_RAS
+} RASCONNTYPE;
+
+typedef enum tagHTTPMAILPROPTYPE
+{
+    HTTPMAIL_PROP_INVALID,
+    HTTPMAIL_PROP_ADBAR,
+    HTTPMAIL_PROP_CONTACTS,
+    HTTPMAIL_PROP_INBOX,
+    HTTPMAIL_PROP_OUTBOX,
+    HTTPMAIL_PROP_SENDMSG,
+    HTTPMAIL_PROP_SENTITEMS,
+    HTTPMAIL_PROP_DELETEDITEMS,
+    HTTPMAIL_PROP_DRAFTS,
+    HTTPMAIL_PROP_MSGFOLDERROOT,
+    HTTPMAIL_PROP_SIG,
+    HTTPMAIL_PROP_LAST
+} HTTPMAILPROPTYPE;
+
+typedef enum tagHTTPMAILSPECIALFOLDER
+{
+    HTTPMAIL_SF_NONE,
+    HTTPMAIL_SF_UNRECOGNIZED,
+    HTTPMAIL_SF_INBOX,
+    HTTPMAIL_SF_DELETEDITEMS,
+    HTTPMAIL_SF_DRAFTS,
+    HTTPMAIL_SF_OUTBOX,
+    HTTPMAIL_SF_SENTITEMS,
+    HTTPMAIL_SF_CONTACTS,
+    HTTPMAIL_SF_CALENDAR,
+    HTTPMAIL_SF_MSNPROMO,
+    HTTPMAIL_SF_LAST
+} HTTPMAILSPECIALFOLDER;
+
+typedef enum tagHTTPMAILCONTACTTYPE
+{
+    HTTPMAIL_CT_CONTACT,
+    HTTPMAIL_CT_GROUP,
+    HTTPMAIL_CT_LAST
+} HTTPMAILCONTACTTYPE;
+
+const DWORD DAVNAMESPACE_UNKNOWN = 0xFFFFFFFF;
+const DWORD DAVNAMESPACE_DAV = 0;
+const DWORD DAVNAMESPACE_HOTMAIL = 1;
+const DWORD DAVNAMESPACE_HTTPMAIL = 2;
+const DWORD DAVNAMESPACE_MAIL = 3;
+const DWORD DAVNAMESPACE_CONTACTS = 4;
+
+cpp_quote("#define ISF_SMTP_USEIPFORHELO        0x01")
+cpp_quote("#define ISF_ALWAYSPROMPTFORPASSWORD  0x02")
+/* for SMTP - send EHLO and use STARTTLS if available: */
+cpp_quote("#define ISF_SSLONSAMEPORT            0x04")
+cpp_quote("#define ISF_QUERYDSNSUPPORT          0x08")
+/* for SMTP - send EHLO and use AUTH if available: */
+cpp_quote("#define ISF_QUERYAUTHSUPPORT         0x10")
+
+typedef struct INETSERVER
+{
+    CHAR szAccount[CCHMAX_ACCOUNT_NAME];
+    CHAR szUserName[CCHMAX_USERNAME];
+    CHAR szPassword[CCHMAX_PASSWORD];
+    CHAR szServerName[CCHMAX_SERVER_NAME];
+    CHAR szConnectoid[CCHMAX_CONNECTOID];
+    RASCONNTYPE rasconntype;
+    DWORD dwPort;
+    BOOL fSSL;
+    BOOL fTrySicily;
+    DWORD dwTimeout;
+    DWORD dwFlags;
+} INETSERVER, *LPINETSERVER;
+
+typedef enum tagIXPTYPE
+{
+    IXP_NNTP,
+    IXP_SMTP,
+    IXP_POP3,
+    IXP_IMAP,
+    IXP_RAS,
+    IXP_HTTPMail
+} IXPTYPE;
+
+typedef enum tagIXPSTATUS
+{
+    IXP_FINDINGHOST,
+    IXP_CONNECTING,
+    IXP_SECURING,
+    IXP_CONNECTED,
+    IXP_AUTHORIZING,
+    IXP_AUTHRETRY,
+    IXP_AUTHORIZED,
+    IXP_DISCONNECTING,
+    IXP_DISCONNECTED,
+    IXP_LAST
+} IXPSTATUS;
+
+const DWORD DEPTH_INFINITY = 0xFFFFFFFE;
+
+typedef DWORD MEMBERINFOFLAGS;
+
+const MEMBERINFOFLAGS HTTP_MEMBERINFO_COMMONPROPS = 0x0;
+const MEMBERINFOFLAGS HTTP_MEMBERINFO_FOLDERPROPS = 0x1;
+const MEMBERINFOFLAGS HTTP_MEMBERINFO_MESSAGEPROPS = 0x2;
+const MEMBERINFOFLAGS HTTP_MEMBERINFO_ALLPROPS = HTTP_MEMBERINFO_FOLDERPROPS | HTTP_MEMBERINFO_MESSAGEPROPS;
+
+typedef DWORD IMAP_MSGFLAGS;
+
+const IMAP_MSGFLAGS IMAP_MSG_NOFLAGS = 0x00;
+const IMAP_MSGFLAGS IMAP_MSG_ANSWERED = 0x01;
+const IMAP_MSGFLAGS IMAP_MSG_FLAGGED = 0x02;
+const IMAP_MSGFLAGS IMAP_MSG_DELETED = 0x04;
+const IMAP_MSGFLAGS IMAP_MSG_SEEN = 0x08;
+const IMAP_MSGFLAGS IMAP_MSG_DRAFT = 0x10;
+const IMAP_MSGFLAGS IMAP_MSG_ALLFLAGS = 0x1f;
+
+[
+    object,
+    uuid(CA30F3FF-C9AC-11D1-9A3A-00C04FA309D4),
+    local
+]
+interface ITransportCallbackService : IUnknown
+{
+    HRESULT GetParentWindow(
+        [in]    DWORD dwReserved,
+        [out]   HWND *phwndParent);
+
+    HRESULT GetAccount(
+        [out]   LPDWORD pdwServerType,
+        [out]   IImnAccount **ppAccount);
+}
+
+[
+    object,
+    uuid(0DF2C7E1-3435-11D0-81D0-00C04FD85AB4),
+    local
+]
+interface ITransportCallback : IUnknown
+{
+    typedef struct tagIXPRESULT
+    {
+        HRESULT hrResult;
+        LPSTR pszResponse;
+        UINT uiServerError;
+        HRESULT hrServerError;
+        DWORD dwSocketError;
+        LPSTR pszProblem;
+    } IXPRESULT, *LPIXPRESULT;
+
+    typedef enum tagCMDTYPE
+    {
+        CMD_SEND,
+        CMD_RESP
+    } CMDTYPE;
+
+    HRESULT OnTimeout(
+        [in,out]    DWORD *pdwTimeout,
+        [in]        IInternetTransport *pTransport);
+
+    HRESULT OnLogonPrompt(
+        [in,out]    LPINETSERVER pInetServer,
+        [in]        IInternetTransport *pTransport);
+
+    INT OnPrompt(
+        [in]    HRESULT hrError,
+        [in]    LPCSTR pszText,
+        [in]    LPCSTR pszCaption,
+        [in]    UINT uType,
+        [in]    IInternetTransport *pTransport);
+
+    HRESULT OnStatus(
+        [in]    IXPSTATUS ixpstatus,
+        [in]    IInternetTransport *pTransport);
+
+    HRESULT OnError(
+        [in]    IXPSTATUS ixpstatus,
+        [in]    LPIXPRESULT pResult,
+        [in]    IInternetTransport *pTransport);
+
+    HRESULT OnCommand(
+        [in]    CMDTYPE cmdtype,
+        [in]    LPSTR pszLine,
+        [in]    HRESULT hrResponse,
+        [in]    IInternetTransport *pTransport);
+}
+
+[
+    object,
+    uuid(1F636C01-364E-11D0-81D3-00C04FD85AB4),
+    local
+]
+interface IInternetTransport : IUnknown
+{
+    const boolean iitAUTHENTICATE = TRUE;
+    const boolean iitDONT_AUTHENTICATe = FALSE;
+    const boolean iitENABLE_ONCOMMAND = TRUE;
+    const boolean iitDISABLE_ONCOMMAND = FALSE;
+
+    typedef enum tagIXPISSTATE
+    {
+        IXP_IS_CONNECTED,
+        IXP_IS_BUSY,
+        IXP_IS_READY,
+        IXP_IS_AUTHENTICATED
+    } IXPISSTATE;
+
+    HRESULT GetServerInfo(
+        [in,out]    LPINETSERVER pInetServer);
+
+    IXPTYPE GetIXPType();
+
+    HRESULT IsState(
+        [in]    IXPISSTATE isstate);
+
+    HRESULT InetServerFromAccount(
+        [in]        IImnAccount *pAccount,
+        [in,out]    LPINETSERVER pInetServer);
+
+    HRESULT Connect(
+        [in]    LPINETSERVER pInetServer,
+        [in]    boolean fAuthenticate,
+        [in]    boolean fCommandLogging);
+
+    HRESULT HandsOffCallback();
+
+    HRESULT Disconnect();
+
+    HRESULT DropConnection();
+
+    HRESULT GetStatus(
+        [out]   IXPSTATUS *pCurrentStatus);
+}
+
+[
+    object,
+    uuid(1F636C02-364E-11D0-81D3-00C04FD85AB4),
+    local
+]
+interface ISMTPCallback : ITransportCallback
+{
+    typedef enum tagSMTPCOMMAND
+    {
+        SMTP_NONE,
+        SMTP_BANNER,
+        SMTP_CONNECTED,
+        SMTP_SEND_MESSAGE,
+        SMTP_AUTH,
+        SMTP_EHLO,
+        SMTP_HELO,
+        SMTP_MAIL,
+        SMTP_RCPT,
+        SMTP_RSET,
+        SMTP_QUIT,
+        SMTP_DATA,
+        SMTP_DOT,
+        SMTP_SEND_STREAM,
+        SMTP_CUSTOM
+    } SMTPCOMMAND;
+
+    typedef struct tagSMTPSTREAM
+    {
+        DWORD cbIncrement;
+        DWORD cbCurrent;
+        DWORD cbTotal;
+    } SMTPSTREAM, *LPSMTPSTREAM;
+
+    typedef struct tagSMTPRESPONSE
+    {
+        SMTPCOMMAND command;
+        BOOL fDone;
+        IXPRESULT rIxpResult;
+        ISMTPTransport *pTransport;
+
+        [switch_type(SMTPCOMMAND), switch_is(command)]
+        union
+        {
+        [case(SMTP_SEND_STREAM)]    SMTPSTREAM rStreamInfo;
+        [default];
+        };
+    } SMTPRESPONSE, *LPSMTPRESPONSE;
+
+    HRESULT OnResponse(
+        [in] LPSMTPRESPONSE pResponse);
+}
+
+[
+    object,
+    uuid(0DF2C7E2-3435-11D0-81D0-00C04FD85AB4),
+    local
+]
+interface ISMTPTransport : IInternetTransport
+{
+    typedef struct tagSMTPMESSAGE
+    {
+        ULONG cbSize;
+        LPSTREAM pstmMsg;
+        INETADDRLIST rAddressList;
+    } SMTPMESSAGE, *LPSMTPMESSAGE;
+
+    HRESULT InitNew(
+        [in]    LPSTR pszLogFilePath,
+        [in]    ISMTPCallback *pCallback);
+
+cpp_quote("#ifdef WINE_NO_UNICODE_MACROS")
+cpp_quote("#undef SendMessage")
+cpp_quote("#endif")
+
+    HRESULT SendMessage(
+        [in]    LPSMTPMESSAGE pMessage);
+
+    HRESULT CommandMAIL(
+        [in]    LPSTR pszEmailFrom);
+
+    HRESULT CommandRCPT(
+        [in]    LPSTR pszEmailTo);
+
+    HRESULT CommandEHLO();
+
+    HRESULT CommandHELO();
+
+    HRESULT CommandAUTH(
+        [in]    LPSTR pszAuthType);
+
+    HRESULT CommandQUIT();
+
+    HRESULT CommandRSET();
+
+    HRESULT CommandDATA();
+
+    HRESULT CommandDOT();
+
+    HRESULT SendDataStream(
+        [in]    IStream *pStream,
+        [in]    ULONG cbSize);
+}
+
+[
+    object,
+    uuid(0DF2C7EC-3435-11D0-81D0-00C04FD85AB4),
+    local
+]
+interface ISMTPTransport2 : ISMTPTransport
+{
+    typedef struct tagSMTPMESSAGE2
+    {
+        SMTPMESSAGE smtpMsg;
+        LPSTR pszDSNENVID;
+        DSNRET dsnRet;
+        DWORD dwReserved;
+        DWORD dwReserved2;
+    } SMTPMESSAGE2, *LPSMTPMESSAGE2;
+
+    HRESULT SetWindow();
+
+    HRESULT ResetWindow();
+
+    HRESULT SendMessage2(
+        [in]    LPSMTPMESSAGE2 pMessage);
+
+    HRESULT CommandRCPT2(
+        [in]    LPSTR pszEmailTo,
+        [in]    INETADDRTYPE atDSN);
+}
+
+/* FIXME: IDAVNamespaceArbiter, IPropPatchRequest, IPropFindRequest, IPropFindMultiResponse, IPropFindResponse, IHTTPMailCallback, IHTTPMailTransport */
+
+[
+    object,
+    uuid(0DF2C7E3-3435-11D0-81D0-00C04FD85AB4),
+    local
+]
+interface IPOP3Callback : ITransportCallback
+{
+    typedef enum tagPOP3COMMAND
+    {
+        POP3_NONE,
+        POP3_BANNER,
+        POP3_CONNECTED,
+        POP3_USER,
+        POP3_PASS,
+        POP3_AUTH,
+        POP3_UIDL,
+        POP3_STAT,
+        POP3_LIST,
+        POP3_DELE,
+        POP3_RETR,
+        POP3_TOP,
+        POP3_NOOP,
+        POP3_QUIT,
+        POP3_RSET,
+        POP3_CUSTOM
+    } POP3COMMAND;
+
+    typedef struct tagPOP3RETR
+    {
+        BOOL fHeader;
+        BOOL fBody;
+        DWORD dwPopId;
+        DWORD cbSoFar;
+        LPSTR pszLines;
+        ULONG cbLines;
+    } POP3RETR, *LPPOP3RETR;
+
+    typedef struct tagPOP3TOP
+    {
+        BOOL fHeader;
+        BOOL fBody;
+        DWORD dwPopId;
+        DWORD cPreviewLines;
+        DWORD cbSoFar;
+        LPSTR pszLines;
+        ULONG cbLines;
+    } POP3TOP, *LPPOP3TOP;
+
+    typedef struct tagPOP3LIST
+    {
+        DWORD dwPopId;
+        DWORD cbSize;
+    } POP3LIST, *LPPOP3LIST;
+
+    typedef struct tagPOP3UIDL
+    {
+        DWORD dwPopId;
+        LPSTR pszUidl;
+    } POP3UIDL, *LPPOP3UIDL;
+
+    typedef struct tagPOP3STAT
+    {
+        DWORD cMessages;
+        DWORD cbMessages;
+    } POP3STAT, *LPPOP3STAT;
+
+    typedef struct tagPOP3RESPONSE
+    {
+        POP3COMMAND command;
+        BOOL fDone;
+        IXPRESULT rIxpResult;
+        IPOP3Transport *pTransport;
+        BOOL fValidInfo;
+        [switch_type(POP3COMMAND), switch_is(command)]
+        union
+        {
+        [case(POP3_UIDL)] POP3UIDL rUidlInfo;
+        [case(POP3_STAT)] POP3STAT rStatInfo;
+        [case(POP3_LIST)] POP3LIST rListInfo;
+        [case(POP3_DELE)] DWORD dwPopId;
+        [case(POP3_RETR)] POP3RETR rRetrInfo;
+        [case(POP3_TOP)]  POP3TOP rTopInfo;
+        [default];
+        };
+    } POP3RESPONSE, *LPPOP3RESPONSE;
+
+    HRESULT OnResponse(
+        [in]    LPPOP3RESPONSE pResponse);
+}
+
+[
+    object,
+    uuid(0DF2C7E4-3435-11D0-81D0-00C04FD85AB4),
+    local
+]
+interface IPOP3Transport : IInternetTransport
+{
+    typedef enum tagPOP3CMDTYPE
+    {
+        POP3CMD_GET_POPID,
+        POP3CMD_GET_MARKED,
+        POP3CMD_GET_ALL
+    } POP3CMDTYPE;
+
+    typedef enum tagPOP3MARKTYPE
+    {
+        POP3_MARK_FOR_TOP = 0x01,
+        POP3_MARK_FOR_RETR = 0x02,
+        POP3_MARK_FOR_DELE = 0x04,
+        POP3_MARK_FOR_UIDL = 0x08,
+        POP3_MARK_FOR_LIST = 0x10
+    } POP3MARKTYPE;
+
+    HRESULT InitNew(
+        [in]    LPSTR pszLogFilePath,
+        [in]    IPOP3Callback *pCallback);
+
+    HRESULT MarkItem(
+        [in]    POP3MARKTYPE marktype,
+        [in]    DWORD dwPopId,
+        [in]    boolean fMarked);
+
+    HRESULT CommandAUTH(
+        [in]    LPSTR pszAuthType);
+
+    HRESULT CommandUSER(
+        [in]    LPSTR pszUserName);
+
+    HRESULT CommandPASS(
+        [in]    LPSTR pszPassword);
+
+    HRESULT CommandLIST(
+        [in]    POP3CMDTYPE cmdtype,
+        [in]    DWORD dwPopId);
+
+    HRESULT CommandTOP(
+        [in]    POP3CMDTYPE cmdtype,
+        [in]    DWORD dwPopId,
+        [in]    DWORD cPreviewLines);
+
+    HRESULT CommandQUIT();
+
+    HRESULT CommandSTAT();
+
+    HRESULT CommandNOOP();
+
+    HRESULT CommandRSET();
+
+    HRESULT CommandUIDL(
+        [in]    POP3CMDTYPE cmdtype,
+        [in]    DWORD dwPopId);
+
+    HRESULT CommandDELE(
+        [in]    POP3CMDTYPE cmdtype,
+        [in]    DWORD dwPopId);
+
+    HRESULT CommandRETR(
+        [in]    POP3CMDTYPE cmdtype,
+        [in]    DWORD dwPopId);
+}
+
+/* FIXME: INNTPCallback, INNTPTransport */
+
+/* FIXME: IRangeList */
+
+/* FIXME: IIMAPCallback, IIMAPTransport */
+
+#if 0
+cpp_quote("HRESULT WINAPI CreateRASTransport(IRASTransport **ppTransport);")
+cpp_quote("HRESULT WINAPI CreateNNTPTransport(INNTPTransport **ppTransport);")
+cpp_quote("HRESULT WINAPI CreateIMAPTransport(IIMAPTransport **ppTransport);")
+cpp_quote("HRESULT WINAPI CreateIMAPTransport2(IIMAPTransport2 **ppTransport);")
+cpp_quote("HRESULT WINAPI CreateRangeList(IRangeList **ppRangeList);")
+#endif
+cpp_quote("HRESULT WINAPI CreateSMTPTransport(ISMTPTransport **ppTransport);")
+cpp_quote("HRESULT WINAPI CreatePOP3Transport(IPOP3Transport **ppTransport);")
