//
//	nMail.dll ヘッダ
//	  Copyright (c) 1999-2021 Nanshiki corporation
//
//	  1999/ 9/ 1 Version 1.00
//	  2000/11/ 1 Version 1.10
//	  2008/ 7/ 1 Version 1.30
//	  2009/ 9/ 1 Version 2.00
//	  2010/ 5/12 Version 3.00
//	  2021/ 6/21 Version 4.00
//

#ifndef _NMAIL_H_
#define _NMAIL_H_

#ifndef _WINSOCKAPI_
#include <winsock.h>
#endif

#ifdef __cplusplus
extern "C" {
#endif

#define NMAIL_ATTACHMENT_TEMP_SIZE					(2000)

#define	NMAIL_SMTP_PORT								(25)		// SMTP ポート番号
#define	NMAIL_SMTP_SUBMISSION_PORT					(587)		// SMTP サブミッションポート番号
#define	NMAIL_SMTP_SSL_PORT							(465)		// SMTP over SSL ポート番号
#define	NMAIL_POP3_PORT								(110)		// POP3 ポート番号
#define	NMAIL_POP3_SSL_PORT							(995)		// POP3 over SSL ポート番号
#define	NMAIL_IMAP4_PORT							(143)		// IMAP4 ポート番号
#define	NMAIL_IMAP4_SSL_PORT						(993)		// IMAP4 over SSL ポート番号

#define	NMAIL_ERROR_SOCKET							(-1)		// 接続エラー等
#define	NMAIL_ERROR_AUTHENTICATE					(-2)		// 認証失敗
#define NMAIL_ERROR_INVALID_NO						(-3)		// メール番号が正しくない
#define NMAIL_ERROR_TIMEOUT							(-4)		// タイムアウト
#define NMAIL_ERROR_FILE_OPEN						(-5)		// 添付ファイルのオープン失敗
#define NMAIL_ERROR_PARTIAL							(-6)		// 分割ファイルが全部揃っていない
#define NMAIL_ERROR_FILE_ALREADY					(-7)		// 添付ファイルがすでに存在する
#define NMAIL_ERROR_AUTHENTICATE_NO_SUPPORT			(-8)		// 認証非対応
#define NMAIL_ERROR_MEMORY							(-9)		// 内部でのメモリ確保エラー
#define NMAIL_ERROR									(-10)		// その他のエラー
#define NMAIL_ERROR_INVALID_PARAMETER				(-11)		// パラメータ不正
#define NMAIL_ERROR_IMAP4_NO						(-12)		// IMAP4 応答 NO
#define NMAIL_ERROR_IMAP4_BAD						(-13)		// IMAP4 応答 BAD
#define NMAIL_ERROR_IMAP4_NO_NAMESPACE				(-14)		// 名前空間が存在しない
#define NMAIL_ERROR_IMAP4_NO_IDLE					(-15)		// IDLE 機能無し
#define NMAIL_ERROR_SUSPEND_ATTACHMENT_FILE			(-20)
#define NMAIL_ERROR_IMAP4_NO_RESULT					(-21)
#define NMAIL_ERROR_SSL_NO_SUPPORT					(-30)		// OS が SSL に非対応
#define NMAIL_ERROR_STARTTLS_NO_SUPPORT				(-31)		// サーバが STARTTLS に非対応
#define NMAIL_ERROR_OAUTH2_NO_CODE					(-40)		// OAUTH2 認可コード非取得
#define NMAIL_ERROR_OAUTH2_GET_CODE					(-41)		// OAUTH2 認可コード取得時エラー(リダイレクトでerrorが渡された)
#define NMAIL_ERROR_OAUTH2_NO_TOKEN					(-42)		// OAUTH2 トークンなし
#define NMAIL_ERROR_JSON_NO_VALUE					(-50)		// JSON キーに対応する値なし

#define NMAIL_HTTP_OK								(200)		// 成功
#define NMAIL_HTTP_CREATED							(201)		// 作成
#define NMAIL_HTTP_ACCEPTED							(202)		// 受理
#define NMAIL_HTTP_NO_CONTENT						(204)		// 内容なし
#define NMAIL_HTTP_RESET_CONTENT					(205)		// 内容リセット
#define NMAIL_ERROR_HTTP_BAD_REQUEST				(-400)		// リクエスト不正
#define NMAIL_ERROR_HTTP_UNAUTHORIZED				(-401)		// 要認証
#define NMAIL_ERROR_HTTP_FORBIDDEN					(-403)		// アクセス禁止
#define NMAIL_ERROR_HTTP_NOT_FOUND					(-404)		// ページ未検出
#define NMAIL_ERROR_HTTP_INTERNAL_SERVER_ERROR		(-500)		// サーバー内部エラー

#define NMAIL_ERROR_SERVICE_NOT_AVAILABLE			(-421)		// サービス利用できず
#define NMAIL_ERROR_MAILBOX_UNAVAILABLE				(-450)		// メールボックス使用不可(使用中等)
#define NMAIL_ERROR_LOCAL_ERROR						(-451)		// サーバー処理エラー
#define NMAIL_ERROR_INSUFFICIENT_SYSTEM_STORAGE		(-452)		// システム容量不足エラー
#define NMAIL_ERROR_SYNTAX_ERROR					(-500)		// コマンドの文法エラー
#define NMAIL_ERROR_PARAMETER						(-501)		// パラメータか引数の文法エラー
#define NMAIL_ERROR_COMMAND_NOT_IMPLEMENTED			(-502)		// 未実装コマンド
#define NMAIL_ERROR_BAD_SEQUENCE					(-503)		// コマンドのシーケンス異常
#define NMAIL_ERROR_SMTP_AUTHENTICATE				(-535)		// SMTP 認証失敗
#define NMAIL_ERROR_USER_UNKOWN						(-550)		// 送信先なし
#define NMAIL_ERROR_USER_NOT_LOCAL					(-551)		// ユーザーが存在しないか、転送先無し
#define NMAIL_ERROR_EXCEEDED_STORAGE_ALLOCATION		(-552)		// 容量オーバーエラー
#define NMAIL_ERROR_MAILBOX_NAME_NOT_ALLOWED		(-553)		// メールボックス名が正しくない
#define NMAIL_ERROR_RELAY_OPERATION_REJECTED		(-553)		// リレー防止エラー
#define NMAIL_ERROR_TRANSACTION_FAILED				(-554)		// トランザクション失敗

#define NMAIL_NO_ATTACHMENT_FILE					(-1)		// 添付ファイルなし
#define NMAIL_ATTACHMENT_FILE						(0)			// 添付ファイルつき(分割されていない)

#define NMAIL_SUCCESS								(1)			// 正常終了

#define NMAIL_PARTIAL_ATTACHMENT_FILE				(1)			// 分割添付ファイルを取得
#define NMAIL_GET_TEXT_ONLY							(2)			// 本文のみ取得

#define NMAIL_ADD_DATE_FIELD						(0x0001)	// ヘッダにDateフィールドを付加
#define NMAIL_ADD_MESSAGEID_FIELD					(0x0002)	// ヘッダにMessage-IDフィールドを付加
#define NMAIL_SUSPEND_ATTACHMENT_FILE				(0x0004)	// 添付ファイル送信で一時休止あり
#define NMAIL_SUSPEND_NEXT							(0x0008)	// 一時休止の二回目以降
#define NMAIL_FILE_NAME_RFC2231						(0x0010)	// 添付ファイル名を RFC2231 でエンコード
#define NMAIL_ENCODE_UTF8							(0x0020)	// メール本文を UTF-8(BASE64) で送信
#define NMAIL_SMTP_HTML								(0x0040)	// HTML メール送信
#define NMAIL_SMTP_HTML_USE_FILE					(0x0080)	// HTML パートは body ではなく、添付の html ファイルを使用する
#define NMAIL_SMTP_HTML_AUTO_PART					(0x0100)	// メールの宛先のドメインでパートの有無を判定
#define NMAIL_SMTP_HTML_NO_MIXED_PART				(0x0200)	// HTML で multipart/mixed パート無し
#define NMAIL_SMTP_HTML_SOFTBANK					(0x0200)	// HTML で multipart/mixed パート無し (softbankデコメール)
#define NMAIL_SMTP_HTML_EMOBILE						(0x0200)	// HTML で multipart/mixed パート無し (emobileデコメール)
#define NMAIL_SMTP_HTML_WILLCOM						(0x0200)	// HTML で multipart/mixed パート無し (willcomデコメール)
#define NMAIL_SMTP_HTML_NO_RELATED_PART				(0x0400)	// HTML で multipart/related パート無し
#define NMAIL_SMTP_HTML_AU							(0x0400)	// HTML で multipart/related パート無し (auデコメール)
#define NMAIL_SMTP_HTML_NO_PLAIN_PART				(0x0800)	// text/plain パート無し (デコメール系とは併用不可)
#define NMAIL_SMTP_HTML_SET_PLAIN_BODY				(0x1000)	// text/plain パートの文字列を body で指定
#define NMAIL_IMAP4_MIME_PART_SAVE_AS_FILE			(0x0800)	// IMAP4 ボディパート保存で引数のパスでファイル名も指定
#define NMAIL_IMAP4_MIME_PART_PEEK					(0x1000)	// IMAP4 ボディパート取得で既読フラグを立てない
#define NMAIL_IMAP4_MIME_PART_NO_DECODE				(0x2000)	// IMAP4 ボディパート取得でデコードしない
#define NMAIL_IMAP4_MIME_PART_HEADER				(0x4000)	// IMAP4 ボディパートのヘッダ取得
#define NMAIL_IMAP4_USE_UID							(0x8000)	// IMAP4 でメール番号でなく UID を使用する

#define NMAIL_OPTION_TIMEOUT						(0)			// タイムアウト時間
#define NMAIL_OPTION_HEADER_MAX						(1)			// ヘッダ最大値
#define NMAIL_OPTION_BODY_MAX						(2)			// 本文最大値
#define NMAIL_OPTION_ALREADY_FILE					(3)			// ファイルが存在した場合の処理
#define NMAIL_OPTION_DEBUG_MODE						(4)			// デバックモード
#define NMAIL_OPTION_CONNECT_TIMEOUT				(5)			// 接続時タイムアウト設定
#define NMAIL_OPTION_SPLIT_CHAR						(6)			// 文字列区切り文字
#define NMAIL_OPTION_SUSPEND_SIZE					(7)			// 一時休止ファイルサイズ
#define NMAIL_OPTION_SLEEP_TIME						(8)			// Sleep 時間
#define NMAIL_OPTION_FIELD_MAX						(9)			// ヘッダフィールド最大値
#define NMAIL_OPTION_SAVE_HTML						(10)		// HTML メールの HTML 部分をファイルに保存するか
#define NMAIL_OPTION_DECODE_BODY					(11)		// 本文のテキストをデコードするか
#define NMAIL_OPTION_DECODE_HEADER					(12)		// ヘッダをデコードするか
#define NMAIL_OPTION_FILENAME_MAX					(13)		// 添付ファイル名格納バッファのサイズ
#define	NMAIL_OPTION_CHANGE_CHAR					(14)		// 添付ファイル名の使用不可文字を置き換える文字
#define	NMAIL_OPTION_CHANGE_CHAR_MODE				(15)		// 添付ファイル名の文字を置き換える条件
#define	NMAIL_OPTION_SAVE_RFC822					(16)		// RFC822 をどう処理するか
#define	NMAIL_OPTION_TOP_LINE						(17)		// ヘッダ情報取得時に取得する本文行数

#define NMAIL_FILE_OVERWRITE						(0)			// ファイルが存在した場合上書き
#define NMAIL_FILE_RENAME							(1)			// ファイルが存在した場合名前を変更して保存
#define NMAIL_FILE_ALREADY_ERROR					(2)			// ファイルが存在した場合エラー

#define NMAIL_GET_ERROR_MESSAGE						(0)			// エラーメッセージ
#define NMAIL_GET_DEBUG_MESSAGE						(1)			// デバックメッセージ
#define NMAIL_GET_HTTP_HEADER_MESSAGE				(2)			// HTTP ヘッダー

#define NMAIL_DEBUG_START							(1)			// デバック開始
#define NMAIL_DEBUG_END								(0)			// デバック終了

#define NMAIL_GET_UIDL_ALL							(0)			// 全ての UIDL を得る

#define NMAIL_CONNECT_TIMEOUT_ON					(1)			// 接続時タイムアウト設定ON
#define NMAIL_CONNECT_TIMEOUT_OFF					(0)			// 接続時タイムアウト設定OFF

#define NMAIL_SMTP_AUTH_NOT_USE						(0)			// 認証なし
#define NMAIL_SMTP_AUTH_PLAIN						(1)			// PLAIN
#define NMAIL_SMTP_AUTH_LOGIN						(2)			// LOGIN
#define NMAIL_SMTP_AUTH_CRAM_MD5					(4)			// CRAM-MD5
#define NMAIL_SMTP_AUTH_DIGEST_MD5					(8)			// DIGEST-MD5
#define NMAIL_SMTP_AUTH_OAUTH2						(16)		// OAuth2

#define NMAIL_SAVE_HTML_OFF							(0)			// HTML メールの HTML 部分はファイルに保存しない
#define NMAIL_SAVE_HTML_ON							(1)			// HTML メールの HTML 部分をファイルに保存する (要 Path 指定)

#define NMAIL_DECODE_BODY_ON						(0)			// 本文は全てデコードする
#define NMAIL_DECODE_BODY_ALL_OFF					(1)			// 本文は全てデコードしない
#define NMAIL_DECODE_BODY_TEXT_OFF					(2)			// テキストパートの Content-Transfer-Encoding 指定のエンコードのみデコードしない

#define NMAIL_DECODE_HEADER_ON						(0)			// ヘッダは全てデコードする
#define NMAIL_DECODE_HEADER_OFF						(1)			// ヘッダは全てデコードしないが、行の連結は行う
#define NMAIL_DECODE_HEADER_ALL_OFF					(2)			// ヘッダは全てデコードせず、行の連結も行わない

#define NMAIL_CHANGE_SPLIT_CHAR						(0)			// 添付ファイル名中の区切り文字を変換する
#define NMAIL_CHANGE_HALF_SPACE						(1)			// 添付ファイル名中の半角スペース変換
#define NMAIL_CHANGE_FULL_SPACE						(2)			// 添付ファイル名中の全角スペース変換
#define NMAIL_CHANGE_ALL_SPACE						(3)			// 添付ファイル名中のスペース変換
#define NMAIL_CHANGE_NO_SPLIT_CHAR					(4)			// 添付ファイル名中の区切り文字を変換しない

#define NMAIL_SAVE_RFC822_OFF						(0x00)		// RFC822 パートのテキスト部分は Body に含め、Path 指定があれば添付ファイル部分は保存
#define NMAIL_SAVE_RFC822_BODY						(0x01)		// Path 指定が有れば RFC822 パートのテキスト部分をファイルに保存する
#define NMAIL_SAVE_RFC822_PART_ALL					(0x02)		// Path 指定が有れば RFC822 パートをまとめてファイルに保存する

#define NMAIL_POP3_AUTH_NORMAL						(0)			// 
#define NMAIL_POP3_AUTH_APOP						(1)			// APOP
#define NMAIL_POP3_AUTH_OAUTH2						(16)		// OAuth2

// IMAP4 認証形式
#define NMAIL_IMAP4_AUTH_PLAIN						(1)			// PLAIN
#define NMAIL_IMAP4_AUTH_LOGIN						(2)			// LOGIN
#define NMAIL_IMAP4_AUTH_CRAM_MD5					(4)			// CRAM-MD5
#define NMAIL_IMAP4_AUTH_DIGEST_MD5					(8)			// DIGEST-MD5
#define NMAIL_IMAP4_AUTH_OAUTH2						(16)		// OAuth2

// IMAP4 メールボックス
#define NMAIL_IMAP4_MAILBOX_NO_SELECT				(1)			// SELECT or EXAMINE で開けない
#define NMAIL_IMAP4_MAILBOX_NO_INFERIOUS			(2)			// 子メールボックスを作成できない
#define NMAIL_IMAP4_MAILBOX_MARKED					(4)			// メッセージが追加されている可能性がある
#define NMAIL_IMAP4_MAILBOX_UNMARKED				(8)			// メッセージが追加されていない
#define NMAIL_IMAP4_MAILBOX_CHILDREN				(16)		// 子メールボックスが存在
#define NMAIL_IMAP4_MAILBOX_NO_CHILDREN				(32)		// 子メールボックスが存在しない

// IMAP4 メールメッセージフラグ
#define NMAIL_IMAP4_MESSAGE_ANSWERED				(1)			// 返信済み
#define NMAIL_IMAP4_MESSAGE_DELETED					(2)			// 消去マーク付き
#define NMAIL_IMAP4_MESSAGE_DRAFT					(4)			// 草稿
#define NMAIL_IMAP4_MESSAGE_FLAGGED					(8)			// 重要性
#define NMAIL_IMAP4_MESSAGE_RECENT					(16)		// 到着
#define NMAIL_IMAP4_MESSAGE_SEEN					(32)		// 既読

#define NMAIL_IMAP4_ADD_MESSAGE_FLAG				(1)			// フラグ追加
#define NMAIL_IMAP4_DELETE_MESSAGE_FLAG				(2)			// フラグ削除
#define NMAIL_IMAP4_REPLACE_MESSAGE_FLAG			(3)			// フラグ置き換え

#define NMAIL_IMAP4_MAILBOX_MESSAGE					(1)			// 総メッセージ数
#define NMAIL_IMAP4_MAILBOX_RECENT					(2)			// 新着メッセージ数
#define NMAIL_IMAP4_MAILBOX_UIDNEXT					(3)			// 新しいメッセージの UID
#define NMAIL_IMAP4_MAILBOX_UIDVALIDITY				(4)			// メールボックスの UID Validity
#define NMAIL_IMAP4_MAILBOX_UNSEEN					(5)			// 未読メッセージ数

// IMAP4 検索用
#define NMAIL_IMAP4_SEARCH_ANSWERED					(1)			// 返信済み
#define NMAIL_IMAP4_SEARCH_UNANSWERED				(2)			// 返信済みでない
#define NMAIL_IMAP4_SEARCH_DELETED					(3)			// 消去マークあり
#define NMAIL_IMAP4_SEARCH_UNDELETED				(4)			// 消去マークなし
#define NMAIL_IMAP4_SEARCH_DRAFT					(5)			// 草稿フラグあり
#define NMAIL_IMAP4_SEARCH_UNDRAFT					(6)			// 草稿フラグなし
#define NMAIL_IMAP4_SEARCH_FLAGGED					(7)			// 重要性フラグあり
#define NMAIL_IMAP4_SEARCH_UNFLAGGED				(8)			// 重要性フラグなし
#define NMAIL_IMAP4_SEARCH_RECENT					(9)			// 到着フラグあり
#define NMAIL_IMAP4_SEARCH_OLD						(10)		// 到着フラグなし
#define NMAIL_IMAP4_SEARCH_SEEN						(11)		// 既読フラグあり
#define NMAIL_IMAP4_SEARCH_UNSEEN					(12)		// 既読フラグなし
#define NMAIL_IMAP4_SEARCH_NEW						(13)		// 到着フラグありかつ既読フラグなし
#define NMAIL_IMAP4_SEARCH_ALL						(14)		// 全てのメール
#define NMAIL_IMAP4_SEARCH_KEYWORD					(15)		// 指定されたキーワードあり
#define NMAIL_IMAP4_SEARCH_UNKEYWORD				(16)		// 指定されたキーワードなし
#define NMAIL_IMAP4_SEARCH_FROM						(17)		// FROM ヘッダフィールドに文字列を含む
#define NMAIL_IMAP4_SEARCH_TO						(18)		// TO ヘッダフィールドに文字列を含む
#define NMAIL_IMAP4_SEARCH_CC						(19)		// CC ヘッダフィールドに文字列を含む
#define NMAIL_IMAP4_SEARCH_BCC						(20)		// BCC ヘッダフィールドに文字列を含む
#define NMAIL_IMAP4_SEARCH_SUBJECT					(21)		// SUBJECT ヘッダフィールドに文字列を含む
#define NMAIL_IMAP4_SEARCH_SENTBEFORE				(22)		// DATEヘッダフィールドが指定された年月日以前
#define NMAIL_IMAP4_SEARCH_SENTON					(23)		// DATEヘッダフィールドが指定された年月日
#define NMAIL_IMAP4_SEARCH_SENTSINCE				(24)		// DATEヘッダフィールドが指定された年月日以降
#define NMAIL_IMAP4_SEARCH_BEFORE					(25)		// 指定された年月日以前に到着
#define NMAIL_IMAP4_SEARCH_ON						(26)		// 指定された年月日に到着
#define NMAIL_IMAP4_SEARCH_SINCE					(27)		// 指定された年月日以降に到着
#define NMAIL_IMAP4_SEARCH_HEADER					(28)		// 指定したヘッダフィールドに文字列を含む("フィールド名 文字列")
#define NMAIL_IMAP4_SEARCH_BODY						(29)		// 本文に文字列を含む
#define NMAIL_IMAP4_SEARCH_TEXT						(30)		// ヘッダおよび本文に文字列を含む
#define NMAIL_IMAP4_SEARCH_LARGER					(31)		// 指定サイズより大きなメール
#define NMAIL_IMAP4_SEARCH_SMALLER					(32)		// 指定サイズより小さなメール
#define NMAIL_IMAP4_SEARCH_UID						(33)		// 指定 UID を持つ

#define NMAIL_IMAP4_SEARCH_COMMAND					(0x0100)	// 検索文字列を直接指定する

#define NMAIL_IMAP4_SEARCH_NOT						(0x0200)	// 検索条件 NOT
#define NMAIL_IMAP4_SEARCH_OR						(0x0400)	// 検索条件 OR
#define NMAIL_IMAP4_SEARCH_AND						(0x0800)	// 検索条件 AND
#define NMAIL_IMAP4_SEARCH_FIRST					(0x1000)	// 検索条件ワークを初期化
#define NMAIL_IMAP4_SEARCH_NO_WAIT					(0x2000)	// 検索コマンド発行後すぐに戻る
#define NMAIL_IMAP4_SEARCH_CHECK					(0x4000)	// 検索結果チェック

#define NMAIL_IMAP4_NAMESPACE_PERSONAL_ALL			(0)			// 個人名前空間取得(タブ区切り)
#define NMAIL_IMAP4_NAMESPACE_OTHER_ALL				(1)			// 他人名前空間取得(タブ区切り)
#define NMAIL_IMAP4_NAMESPACE_SHARED_ALL			(2)			// 共有名前空間取得(タブ区切り)

#define NMAIL_IMAP4_NAMESPACE_PERSONAL_NO			(0x0100)	// 個人名前空間取得(指定番目)
#define NMAIL_IMAP4_NAMESPACE_OTHER_NO				(0x0200)	// 他人名前空間取得(指定番目)
#define NMAIL_IMAP4_NAMESPACE_SHARED_NO				(0x0300)	// 共有名前空間取得(指定番目)

#define NMAIL_IMAP4_NAMESPACE_PERSONAL_COUNT		(0x1000)	// 個人名前空間数
#define NMAIL_IMAP4_NAMESPACE_OTHER_COUNT			(0x2000)	// 他人名前空間数
#define NMAIL_IMAP4_NAMESPACE_SHARED_COUNT			(0x3000)	// 共有名前空間数

#define NMAIL_IMAP4_MIME_CONTENT_PART				(0)			// ボディパート番号文字列
#define NMAIL_IMAP4_MIME_CONTENT_TYPE				(1)			// Content-Type タイプ
#define NMAIL_IMAP4_MIME_CONTENT_SUBTYPE			(2)			// Content-Type サブタイプ
#define NMAIL_IMAP4_MIME_CONTENT_ID					(3)			// Content-ID
#define NMAIL_IMAP4_MIME_CONTENT_DESCRIPTION		(4)			// Content-Description
#define NMAIL_IMAP4_MIME_CONTENT_TRANSFER_ENCODING	(5)			// Content-Transfer-Encoding
#define NMAIL_IMAP4_MIME_CONTENT_FILE_NAME			(6)			// ファイル名
#define NMAIL_IMAP4_MIME_CONTENT_TYPE_AND_SUBTYPE	(7)			// Content-Type タイプ＆サブタイプ
#define NMAIL_IMAP4_MIME_CONTENT_SIZE				(8)			// ボディサイズ
#define NMAIL_IMAP4_MIME_CONTENT_LINE				(9)			// ボディ行数
#define NMAIL_IMAP4_MIME_CONTENT_PARAMETER_COUNT	(10)		// Content-Type パラメータ数
#define NMAIL_IMAP4_MIME_CONTENT_PARAMETER			(11)		// Content-Type パラメータ

#define NMAIL_MAKE_DATE_TIME_SMTP					(0x00000)	// SMTP日時文字列(RFC2822)
#define NMAIL_MAKE_DATE_IMAP4						(0x08000)	// IMAP4日付文字列(RFC2060) 検索用
#define NMAIL_MAKE_DATE_TIME_IMAP4					(0x10000)	// IMAP4日時文字列(RFC2060) 内部日付用文字列
#define NMAIL_MAKE_DATE_NOW							(0x20000)	// 現在日時
#define NMAIL_MAKE_DATE_TIMEZONE_PLUS				(0x40000)	// タイムゾーン指定 +
#define NMAIL_MAKE_DATE_TIMEZONE_MINUS				(0x80000)	// タイムゾーン指定 -
#define NMAIL_MAKE_DATE_SIZE						(32)		// 日時文字列用バッファサイズ

#define NMAIL_SSL_IGNORE_NOT_TIME_VALID				(0x0800)	// 証明書が期限切れでもエラーにしない
#define NMAIL_SSL_ALLOW_UNKNOWN_CA					(0x0400)	// 信頼されない証明書があってもエラーにしない
#define NMAIL_SSL_IGNORE_INVALID_NAME				(0x0040)	// 証明書の Common Name が渡された値(サーバ名)と一致しなくてもエラーにしない

#define NMAIL_SSL_SSL3								(0x01000)	// SSL Version 3
#define NMAIL_SSL_TLS1								(0x02000)	// TLS Version 1
#define NMAIL_SSL_STARTTLS							(0x04000)	// STARTTLS
#define NMAIL_SSL_TLS1_2							(0x10000)	// TLS Version 1.2
#define NMAIL_SSL_TLS1_3							(0x20000)	// TLS Version 1.3

#define	NMAIL_SSL_ERROR_UNTRUSTED_ROOT				(-2146762487)	// 0x800b0109 証明チェーンは正しく処理されたが、証明機関の証明書のうちの1つが信頼されていない
#define	NMAIL_SSL_ERROR_INTERNAL					(-2146893052)	// 0x80090304 内部エラー
#define	NMAIL_SSL_ERROR_ILLEGAL_MESSAGE				(-2146893018)	// 0x80090326 予期しないか、または間違った形式のデータを受信
#define	NMAIL_SSL_ERROR_EXPIRED						(-2146893016)	// 0x80090328 受信した証明書の期限切れ
#define	NMAIL_SSL_ERROR_CN_NO_MATCH					(-2146762481)	// 0x800b010f 証明書の Common Name が渡された値(サーバ名)と一致しない

#define NMAIL_OAUTH2_CODE_CHALLENGE_METHOD_PLAIN	(0x0001)	// code_challenge_method を plain とする
#define NMAIL_OAUTH2_HEADER_CLIENT_ID				(0x0002)	// client_id, client_secret をヘッダーに記述
#define NMAIL_OAUTH2_GET_REFRESH_TOKEN				(0x0010)	// refresh_token のみ取得
#define NMAIL_OAUTH2_GET_ACCESS_TOKEN				(0x0020)	// access_token のみ取得

#define	NMAIL_JSON_DECODE_ESCAPE					(0x0080)	// JSON で取得した文字列中のエスケープ文字(\n, \uXXXX 等)をデコードする

#define NMAIL_HTTP_POST_X_WWW_FORM_URLENCODE		(0x0200)	// http POST データを x-www-form-urlencoded 形式でエンコードする
#define	NMAIL_HTTP_BASE64_AUTHORIZATION_BASIC		(0x0400)	// Authorization: Basic 以降を Base64 エンコードする
#define	NMAIL_HTTP_GET								(0x1000)	// http GET
#define	NMAIL_HTTP_PUT								(0x2000)	// http PUT
#define	NMAIL_HTTP_DELETE							(0x4000)	// http DELETE

#define	NMAIL_RANDOM_STRING_ALPHANUMERIC			(0x0001)	// ランダム文字列を英数字のみとする

//	バージョンを得る
//	in:  なし
//	out: バージョン (例: 1.10 .. 110)
//
int WINAPI NMailGetVersion(VOID);

//
//	パラメータ設定
//	in:  TimeOutSec .. タイムアウト時間(秒単位)
//	     HeaderMax  .. ヘッダの最大値(バイト数)
//	     BodyMax    .. メール本文の最大値(バイト数)
//	out: なし
//
VOID WINAPI NMailSetParameter(int TimeOutSec, int HeaderMax, int BodyMax);

//
//	WinSock 初期化
//	in:  なし
//	out: TRUE .. 初期化成功
//
BOOL WINAPI NMailInitializeWinSock(VOID);

//
//	WinSock 終了
//	in:  なし
//	out: TRUE .. 正常終了
//
BOOL WINAPI NMailEndWinSock(VOID);

//
//	POP3 サーバに接続
//	in:  HostName .. POP3 ホスト名
//	out: ソケット
//	     INVALID_SOCKET でエラー
//
SOCKET WINAPI NMailPop3Connect(LPCTSTR HostName);
SOCKET WINAPI NMailPop3ConnectA(LPCSTR HostName);
SOCKET WINAPI NMailPop3ConnectW(LPCWSTR HostName);
#if _MBCS
#define NMailPop3Connect	NMailPop3ConnectA
#endif
#ifdef _UNICODE
#define NMailPop3Connect	NMailPop3ConnectW
#endif

//
//	POP3 サーバに接続(ポート番号指定)
//	in:  HostName .. POP3 ホスト名
//       PortNo   .. ポート番号
//	out: ソケット
//
SOCKET WINAPI NMailPop3ConnectPortNo(LPCTSTR HostName, int PortNo);
SOCKET WINAPI NMailPop3ConnectPortNoA(LPCSTR HostName, int PortNo);
SOCKET WINAPI NMailPop3ConnectPortNoW(LPCWSTR HostName, int PortNo);
#ifdef _MBCS
#define NMailPop3ConnectPortNo	NMailPop3ConnectPortNoA
#endif
#ifdef _UNICODE
#define NMailPop3ConnectPortNo	NMailPop3ConnectPortNoW
#endif

//
//	POP3 認証
//	in:  Socket   .. ソケット
//	     Id       .. ユーザー名
//	     Password .. パスワード
//	     APopFlag .. APOP を使用するか(True で使用する)
//	out: メール数
//	     負の数でエラー
//
int WINAPI NMailPop3Authenticate(SOCKET Socket, LPCTSTR Id, LPCTSTR Password, BOOL APopFlag);
int WINAPI NMailPop3AuthenticateA(SOCKET Socket, LPCSTR Id, LPCSTR Password, BOOL APopFlag);
int WINAPI NMailPop3AuthenticateW(SOCKET Socket, LPCWSTR Id, LPCWSTR Password, BOOL APopFlag);
#ifdef _MBCS
#define NMailPop3Authenticate	NMailPop3AuthenticateA
#endif
#ifdef _UNICODE
#define NMailPop3Authenticate	NMailPop3AuthenticateW
#endif

//
//	POP3 認証
//	in:  Socket   .. ソケット
//	     Id       .. ユーザー名
//	     Password .. パスワード
//	     Mode     .. 認証種別
//	out: メール数
//	     負の数でエラー
//
int WINAPI NMailPop3AuthenticateMode(SOCKET Socket, LPCTSTR Id, LPCTSTR Password, int Mode);
int WINAPI NMailPop3AuthenticateModeA(SOCKET Socket, LPCSTR Id, LPCSTR Password, int Mode);
int WINAPI NMailPop3AuthenticateModeW(SOCKET Socket, LPCWSTR Id, LPCWSTR Password, int Mode);
#ifdef _MBCS
#define NMailPop3AuthenticateMode	NMailPop3AuthenticateModeA
#endif
#ifdef _UNICODE
#define NMailPop3AuthenticateMode	NMailPop3AuthenticateModeW
#endif

//
//	POP3 接続終了
//	in:  Socket   .. ソケット
//	out: 負の数でエラー
//
int WINAPI NMailPop3Close(SOCKET Socket);

//
//	POP3 メールの情報を得る
//	in:  Socket   .. ソケット
//	     No       .. メール番号
//	     Subject  .. メールの題名
//	     Date     .. メールの送信日時
//	     From     .. メールの差出人
//	     SizeFlag .. TRUE ならサイズを返す
//	out: SizeFlag が TRUE ならサイズ
//	     負の数でエラー
//
int WINAPI NMailPop3GetMailStatus(SOCKET Socket, int No, LPTSTR Subject, LPTSTR Date, LPTSTR From, LPTSTR Header, BOOL SizeFlag);
int WINAPI NMailPop3GetMailStatusA(SOCKET Socket, int No, LPSTR Subject, LPSTR Date, LPSTR From, LPSTR Header, BOOL SizeFlag);
int WINAPI NMailPop3GetMailStatusW(SOCKET Socket, int No, LPWSTR Subject, LPWSTR Date, LPWSTR From, LPWSTR Header, BOOL SizeFlag);
#ifdef _MBCS
#define NMailPop3GetMailStatus	NMailPop3GetMailStatusA
#endif
#ifdef _UNICODE
#define NMailPop3GetMailStatus	NMailPop3GetMailStatusW
#endif

//
//	POP3 メールのサイズを得る
//	in:  Socket   .. ソケット
//	     No       .. メール番号
//	out: メールのサイズ
//	     負の数でエラー
//
int WINAPI NMailPop3GetMailSize(SOCKET Socket, int No);

//
//	POP3 メールを得る
//	in:  Socket   .. ソケット
//	     No       .. メール番号
//	     Subject  .. メールの題名
//	     Date     .. メールの送信日時
//	     From     .. メールの差出人
//	     Header   .. メールのヘッダ
//	     Body     .. メールの本文
//	     Path     .. 添付ファイルを保存するフォルダ
//	                 NULL で保存せず
//	     FileName .. 添付ファイル名を格納するバッファ
//	                 NULL で格納せず
//	out: メールのサイズ
//	     負の数でエラー
//
int WINAPI NMailPop3GetMail(SOCKET Socket, int No, LPTSTR Subject, LPTSTR Date, LPTSTR From, LPTSTR Header, LPTSTR Body, LPCTSTR Path, LPTSTR FileName);
int WINAPI NMailPop3GetMailA(SOCKET Socket, int No, LPSTR Subject, LPSTR Date, LPSTR From, LPSTR Header, LPSTR Body, LPCSTR Path, LPSTR FileName);
int WINAPI NMailPop3GetMailW(SOCKET Socket, int No, LPWSTR Subject, LPWSTR Date, LPWSTR From, LPWSTR Header, LPWSTR Body, LPCWSTR Path, LPWSTR FileName);
#ifdef _MBCS
#define NMailPop3GetMail	NMailPop3GetMailA
#endif
#ifdef _UNICODE
#define NMailPop3GetMail	NMailPop3GetMailW
#endif

//
//	POP3 メールを得る(分割添付ファイル対応版)
//	in:  Socket   .. ソケット
//	     No       .. メール番号
//	     Subject  .. メールの題名
//	     Date     .. メールの送信日時
//	     From     .. メールの差出人
//	     Header   .. メールのヘッダ
//	     Body     .. メールの本文
//	     Path     .. 添付ファイルを保存するフォルダ
//	     FileName .. 添付ファイル名を格納するバッファ
//	out: 負の数でエラー
//
int WINAPI NMailPop3GetMailPartial(SOCKET Socket, int No, LPTSTR Subject, LPTSTR Date, LPTSTR From, LPTSTR Header, LPTSTR Body, LPCTSTR Path, LPTSTR FileName);
int WINAPI NMailPop3GetMailPartialA(SOCKET Socket, int No, LPSTR Subject, LPSTR Date, LPSTR From, LPSTR Header, LPSTR Body, LPCSTR Path, LPSTR FileName);
int WINAPI NMailPop3GetMailPartialW(SOCKET Socket, int No, LPWSTR Subject, LPWSTR Date, LPWSTR From, LPWSTR Header, LPWSTR Body, LPCWSTR Path, LPWSTR FileName);
#ifdef _MBCS
#define NMailPop3GetMailPartial	NMailPop3GetMailPartialA
#endif
#ifdef _UNICODE
#define NMailPop3GetMailPartial	NMailPop3GetMailPartialW
#endif

//
//	POP3 メールを得る オプション付き 一時休止あり
//	in:  Socket   .. ソケット
//	     No       .. メール番号
//	     Subject  .. メールの題名
//	     Date     .. メールの送信日時
//	     From     .. メールの差出人
//	     Header   .. メールのヘッダ
//	     Body     .. メールの本文
//	     Path     .. 添付ファイルを保存するフォルダ
//	                 NULL で保存せず
//	     FileName .. 添付ファイル名を格納するバッファ
//	                 NULL で格納せず
//	     Temp     .. 一時作業エリア
//	                 NMAIL_ATTACHMENT_TEMP_SIZE 分確保しておく必要がある
//	                 NULL で nMail.DLL 内部のバッファを使用
//	     Flag     .. フラグ
//	out: メールのサイズ
//	     負の数でエラー
//
int WINAPI NMailPop3GetMailEx(SOCKET Socket, int No, LPTSTR Subject, LPTSTR Date, LPTSTR From, LPTSTR Header, LPTSTR Body, LPCTSTR Path, LPTSTR FileName, LPTSTR Temp, int Flag);
int WINAPI NMailPop3GetMailExA(SOCKET Socket, int No, LPSTR Subject, LPSTR Date, LPSTR From, LPSTR Header, LPSTR Body, LPCSTR Path, LPSTR FileName, LPSTR Temp, int Flag);
int WINAPI NMailPop3GetMailExW(SOCKET Socket, int No, LPWSTR Subject, LPWSTR Date, LPWSTR From, LPWSTR Header, LPWSTR Body, LPCWSTR Path, LPWSTR FileName, LPSTR Temp, int Flag);
#ifdef _MBCS
#define NMailPop3GetMailEx	NMailPop3GetMailExA
#endif
#ifdef _UNICODE
#define NMailPop3GetMailEx	NMailPop3GetMailExW
#endif

//
//	POP3 メールを削除
//	in:  Socket   .. ソケット
//	     No       .. メール番号
//	out: 負の数でエラー
//
int WINAPI NMailPop3DeleteMail(SOCKET Socket, int No);

//
//	POP3 メールが添付ファイル付きかチェック
//	in:  Socket   .. ソケット
//	     No       .. メール番号
//	     Id       .. 分割ファイルの ID を格納するバッファ
//	     Max      .. バッファサイズ
//	out: NMAIL_NO_ATTACHMENT_FILE    .. 添付ファイルなし
//	     NMAIL_ATTACHMENT_FILE 以上  .. 添付ファイルあり
//	                                    NMAIL_ATTACHMENT_FILE(0) で分割
//	                                    されていない添付ファイル
//	                                    1 以上の場合分割されている添付
//	                                    ファイルで数値はパート番号
//
int WINAPI NMailPop3GetAttachmentFileStatus(SOCKET Socket, int No, LPTSTR Id, int Max);
int WINAPI NMailPop3GetAttachmentFileStatusA(SOCKET Socket, int No, LPSTR Id, int Max);
int WINAPI NMailPop3GetAttachmentFileStatusW(SOCKET Socket, int No, LPWSTR Id, int Max);
#ifdef _MBCS
#define NMailPop3GetAttachmentFileStatus	NMailPop3GetAttachmentFileStatusA
#endif
#ifdef _UNICODE
#define NMailPop3GetAttachmentFileStatus	NMailPop3GetAttachmentFileStatusW
#endif

//
//	POP3 UIDL を得る
//	in:  Socket   .. ソケット
//	     No       .. メール番号
//	     Uidl     .. UIDL を格納するバッファ
//	     Max      .. バッファサイズ
//	out: 負の数でエラー
//
int WINAPI NMailPop3GetUidl(SOCKET Socket, int No, LPTSTR Uidl, int Max);
int WINAPI NMailPop3GetUidlA(SOCKET Socket, int No, LPSTR Uidl, int Max);
int WINAPI NMailPop3GetUidlW(SOCKET Socket, int No, LPWSTR Uidl, int Max);
#ifdef _MBCS
#define NMailPop3GetUidl	NMailPop3GetUidlA
#endif
#ifdef _UNICODE
#define NMailPop3GetUidl	NMailPop3GetUidlW
#endif

//
//	メールを送信
//	in:  HostName .. SMTP サーバ名
//	     To       .. 送り先
//	     Cc       .. CC
//	     Bcc      .. BCC
//	     From     .. 差出人
//	     Subject  .. 題名
//	     Body     .. メール本文
//	     Header   .. 他のヘッダ
//	     Path     .. 添付ファイル名(なければNULL)
//	     Flag     .. ヘッダにDate/Message-IDを付加するか
//	out: 負の数でエラー
//
int WINAPI NMailSmtpSendMail(LPCTSTR HostName, LPCTSTR To, LPCTSTR Cc, LPCTSTR Bcc, LPCTSTR From, LPCTSTR Subject, LPCTSTR Body, LPCTSTR Header, LPCTSTR Path, int Flag);
int WINAPI NMailSmtpSendMailA(LPCSTR HostName, LPCSTR To, LPCSTR Cc, LPCSTR Bcc, LPCSTR From, LPCSTR Subject, LPCSTR Body, LPCSTR Header, LPCSTR Path, int Flag);
int WINAPI NMailSmtpSendMailW(LPCWSTR HostName, LPCWSTR To, LPCWSTR Cc, LPCWSTR Bcc, LPCWSTR From, LPCWSTR Subject, LPCWSTR Body, LPCWSTR Header, LPCWSTR Path, int Flag);
#ifdef _MBCS
#define NMailSmtpSendMail	NMailSmtpSendMailA
#endif
#ifdef _UNICODE
#define NMailSmtpSendMail	NMailSmtpSendMailW
#endif

//
//	メールを送信
//	in:  HostName .. SMTP サーバ名
//	     To       .. 送り先
//	     Cc       .. CC
//	     Bcc      .. BCC
//	     From     .. 差出人
//	     Subject  .. 題名
//	     Body     .. メール本文
//	     Header   .. 他のヘッダ
//	     Path     .. 添付ファイル名(なければNULL)
//	     Flag     .. ヘッダにDate/Message-IDを付加するか
//	     PortNo   .. SMTP ポート番号
//	out: 負の数でエラー
//
int WINAPI NMailSmtpSendMailPortNo(LPCTSTR HostName, LPCTSTR To, LPCTSTR Cc, LPCTSTR Bcc, LPCTSTR From, LPCTSTR Subject, LPCTSTR Body, LPCTSTR Header, LPCTSTR Path, int Flag, int PortNo);
int WINAPI NMailSmtpSendMailPortNoA(LPCSTR HostName, LPCSTR To, LPCSTR Cc, LPCSTR Bcc, LPCSTR From, LPCSTR Subject, LPCSTR Body, LPCSTR Header, LPCSTR Path, int Flag, int PortNo);
int WINAPI NMailSmtpSendMailPortNoW(LPCWSTR HostName, LPCWSTR To, LPCWSTR Cc, LPCWSTR Bcc, LPCWSTR From, LPCWSTR Subject, LPCWSTR Body, LPCWSTR Header, LPCWSTR Path, int Flag, int PortNo);
#ifdef _MBCS
#define NMailSmtpSendMailPortNo	NMailSmtpSendMailPortNoA
#endif
#ifdef _UNICODE
#define NMailSmtpSendMailPortNo	NMailSmtpSendMailPortNoW
#endif

// Version 1.25
//
//	SMTP サーバに接続
//	in:  HostName .. SMTP ホスト名
//	out: ソケット
//	     INVALID_SOCKET でエラー
//
SOCKET WINAPI NMailSmtpConnect(LPCTSTR HostName);
SOCKET WINAPI NMailSmtpConnectA(LPCSTR HostName);
SOCKET WINAPI NMailSmtpConnectW(LPCWSTR HostName);
#ifdef _MBCS
#define NMailSmtpConnect	NMailSmtpConnectA
#endif
#ifdef _UNICODE
#define NMailSmtpConnect	NMailSmtpConnectW
#endif

//
//	SMTP サーバに接続(ポート番号指定)
//	in:  HostName .. SMTP ホスト名
//       PortNo   .. ポート番号
//	out: ソケット
//
SOCKET WINAPI NMailSmtpConnectPortNo(LPCTSTR HostName, int PortNo);
SOCKET WINAPI NMailSmtpConnectPortNoA(LPCSTR HostName, int PortNo);
SOCKET WINAPI NMailSmtpConnectPortNoW(LPCWSTR HostName, int PortNo);
#ifdef _MBCS
#define NMailSmtpConnectPortNo	NMailSmtpConnectPortNoA
#endif
#ifdef _UNICODE
#define NMailSmtpConnectPortNo	NMailSmtpConnectPortNoW
#endif

//
//	SMTP 認証
//	in:  Socket   .. ソケット
//	     HostName .. SMTP ホスト名
//	     Id       .. ユーザー名
//	     Password .. パスワード
//	     Mode     .. AUTH 種別
//	out: 負の数でエラー
//
int WINAPI NMailSmtpAuthenticate(SOCKET Socket, LPCTSTR HostName, LPCTSTR Id, LPCTSTR Password, int Mode);
int WINAPI NMailSmtpAuthenticateA(SOCKET Socket, LPCSTR HostName, LPCSTR Id, LPCSTR Password, int Mode);
int WINAPI NMailSmtpAuthenticateW(SOCKET Socket, LPCWSTR HostName, LPCWSTR Id, LPCWSTR Password, int Mode);
#ifdef _MBCS
#define NMailSmtpAuthenticate	NMailSmtpAuthenticateA
#endif
#ifdef _UNICODE
#define NMailSmtpAuthenticate	NMailSmtpAuthenticateW
#endif

//
//	メールを送信 ソケット指定版
//	in:  Socket   .. ソケット
//	     To       .. 送り先
//	     Cc       .. CC
//	     Bcc      .. BCC
//	     From     .. 差出人
//	     Subject  .. 題名
//	     Body     .. メール本文
//	     Header   .. 他のヘッダ
//	     Path     .. 添付ファイル名(なければNULL)
//	     Temp     .. 一時作業エリア
//	                 NMAIL_ATTACHMENT_TEMP_SIZE 分確保しておく必要がある
//	                 NULL で nMail.DLL 内部のバッファを使用
//	     Flag     .. 各種フラグ
//	out: 負の数でエラー
//	     ただし Flag で NMAIL_SUSPEND_ATTACHMENT_FILE を指定した場合に
//	     NMAIL_ERROR_SUSPEND_ATTACHMENT_FILE が帰ってきた場合は送信中に
//	     一時休止で戻ってきたことになる
//
int WINAPI NMailSmtpSendMailEx(SOCKET Socket, LPCTSTR To, LPCTSTR Cc, LPCTSTR Bcc, LPCTSTR From, LPCTSTR Subject, LPCTSTR Body, LPCTSTR Header, LPCTSTR Path, LPTSTR Temp, int Flag);
int WINAPI NMailSmtpSendMailExA(SOCKET Socket, LPCSTR To, LPCSTR Cc, LPCSTR Bcc, LPCSTR From, LPCSTR Subject, LPCSTR Body, LPCSTR Header, LPCSTR Path, LPSTR Temp, int Flag);
int WINAPI NMailSmtpSendMailExW(SOCKET Socket, LPCWSTR To, LPCWSTR Cc, LPCWSTR Bcc, LPCWSTR From, LPCWSTR Subject, LPCWSTR Body, LPCWSTR Header, LPCWSTR Path, LPSTR Temp, int Flag);
#ifdef _MBCS
#define NMailSmtpSendMailEx	NMailSmtpSendMailExA
#endif
#ifdef _UNICODE
#define NMailSmtpSendMailEx	NMailSmtpSendMailExW
#endif

//
//	SMTP 接続終了
//	in:  Socket   .. ソケット
//	out: 負の数でエラー
//
int WINAPI NMailSmtpClose(SOCKET Socket);

//
//	ヘッダが格納されているバッファから所定のフィールドを取り出す
//	in:  Field    .. フィールド値を格納するバッファ
//	     Header   .. ヘッダが格納されているバッファ
//	     Name     .. フィールド名
//	     Size     .. 格納するバッファのサイズ
//	out: TRUE     .. フィールドが存在
//
BOOL WINAPI NMailGetHeaderField(LPTSTR Field, LPCTSTR Header, LPCTSTR Name, int Size);
BOOL WINAPI NMailGetHeaderFieldA(LPSTR Field, LPCSTR Header, LPCSTR Name, int Size);
BOOL WINAPI NMailGetHeaderFieldW(LPWSTR Field, LPCWSTR Header, LPCWSTR Name, int Size);
#ifdef _MBCS
#define NMailGetHeaderField	NMailGetHeaderFieldA
#endif
#ifdef _UNICODE
#define NMailGetHeaderField	NMailGetHeaderFieldW
#endif

//
//	ヘッダの MIME エンコードをデコードする
//	in:  Destination   .. フィールド値を格納するバッファ
//	     Source        .. ヘッダが格納されているバッファ
//	     Size          .. 格納するバッファのサイズ
//
BOOL WINAPI NMailDecodeHeaderField(LPSTR Destination, LPCSTR Source, int Size);
BOOL WINAPI NMailDecodeHeaderFieldA(LPSTR Destination, LPCSTR Source, int Size);
BOOL WINAPI NMailDecodeHeaderFieldW(LPWSTR Destination, LPCWSTR Source, int Size);
#ifdef _MBCS
#define NMailDecodeHeaderField	NMailDecodeHeaderFieldA
#endif
#ifdef _UNICODE
#define NMailDecodeHeaderField	NMailDecodeHeaderFieldW
#endif


//
//	分割ファイル結合開始
//	in:  Temp        .. 一時作業エリア
//	                    NMAIL_ATTACHMENT_TEMP_SIZE 分確保しておく必要がある
//	                    NULL で nMail.DLL 内部のバッファを使用
//	     Subject     .. メールの題名
//	     Date        .. メールの送信日時
//	     From        .. メールの差出人
//	     Header      .. 展開後のヘッダを格納するバッファ
//	     Body        .. 展開後の本文を格納するバッファ
//	     Path        .. 添付ファイルを保存するフォルダ
//	     FileName    .. 添付ファイル名を格納するバッファ
//	     FirstHeader .. 最初のメールヘッダ
//	     FirstBody   .. 最初のメール本体
//	out: 負の数でエラー
//
int WINAPI NMailAttachmentFileFirst(LPSTR Temp, LPTSTR Subject, LPTSTR Date, LPTSTR From, LPTSTR Header, LPTSTR Body, LPCTSTR Path, LPTSTR FileName, LPCTSTR FirstHeader, LPCTSTR FirstBody);
int WINAPI NMailAttachmentFileFirstA(LPSTR Temp, LPSTR Subject, LPSTR Date, LPSTR From, LPSTR Header, LPSTR Body, LPCSTR Path, LPSTR FileName, LPCSTR FirstHeader, LPCSTR FirstBody);
int WINAPI NMailAttachmentFileFirstW(LPSTR Temp, LPWSTR Subject, LPWSTR Date, LPWSTR From, LPWSTR Header, LPWSTR Body, LPCWSTR Path, LPWSTR FileName, LPCWSTR FirstHeader, LPCWSTR FirstBody);
#ifdef _MBCS
#define NMailAttachmentFileFirst	NMailAttachmentFileFirstA
#endif
#ifdef _UNICODE
#define NMailAttachmentFileFirst	NMailAttachmentFileFirstW
#endif

//
//	分割ファイル結合
//	in:  Temp       .. 一時作業エリア
//	                   NMAIL_ATTACHMENT_TEMP_SIZE 分確保しておく必要がある
//	                   NULL で nMail.DLL 内部のバッファを使用
//	     NextHeader .. ２つ目以降のメールヘッダ
//	     NextBody   .. ２つ目以降のメール本体
//	out: 負の数でエラー
//
int WINAPI NMailAttachmentFileNext(LPSTR Temp, LPCTSTR NextHeader, LPCTSTR NextBody);
int WINAPI NMailAttachmentFileNextA(LPSTR Temp, LPCSTR NextHeader, LPCSTR NextBody);
int WINAPI NMailAttachmentFileNextW(LPSTR Temp, LPCWSTR NextHeader, LPCWSTR NextBody);
#ifdef _MBCS
#define NMailAttachmentFileNext	NMailAttachmentFileNextA
#endif
#ifdef _UNICODE
#define NMailAttachmentFileNext	NMailAttachmentFileNextW
#endif

//
//	分割ファイル結合(VisualBasic 用)
//
int WINAPI NMailAttachmentFileNextVB(LPSTR Temp, LPTSTR Subject, LPTSTR Date, LPTSTR From, LPTSTR Header, LPTSTR Body, LPCTSTR Path, LPTSTR FileName, LPCTSTR NextHeader, LPCTSTR NextBody);
int WINAPI NMailAttachmentFileNextVBA(LPSTR Temp, LPSTR Subject, LPSTR Date, LPSTR From, LPSTR Header, LPSTR Body, LPCSTR Path, LPSTR FileName, LPCSTR NextHeader, LPCSTR NextBody);
int WINAPI NMailAttachmentFileNextVBW(LPSTR Temp, LPWSTR Subject, LPWSTR Date, LPWSTR From, LPWSTR Header, LPWSTR Body, LPCWSTR Path, LPWSTR FileName, LPCWSTR NextHeader, LPCWSTR NextBody);
#ifdef _MBCS
#define NMailAttachmentFileNextVB	NMailAttachmentFileNextVBA
#endif
#ifdef _UNICODE
#define NMailAttachmentFileNextVB	NMailAttachmentFileNextVBW
#endif

//
//	分割ファイル結合終了
//	in:  Temp     .. 一時作業エリア
//	                 NMAIL_ATTACHMENT_TEMP_SIZE 分確保しておく必要がある
//	out: 負の数でエラー
//
int WINAPI NMailAttachmentFileClose(LPSTR Temp);

//
//	分割ファイルの情報を得る
//	in:  Header   .. ヘッダが格納されているバッファ
//	     Id       .. 分割ファイルの ID を格納するバッファ
//	     Max      .. バッファサイズ
//	out: NMAIL_NO_ATTACHMENT_FILE    .. 添付ファイルなし
//	     NMAIL_ATTACHMENT_FILE 以上  .. 添付ファイルあり
//	                                    NMAIL_ATTACHMENT_FILE(0) で分割
//	                                    されていない添付ファイル
//	                                    1 以上の場合分割されている添付
//	                                    ファイルで数値はパート番号
//
int WINAPI NMailAttachmentFileStatus(LPCTSTR Header, LPTSTR Id, int Max);
int WINAPI NMailAttachmentFileStatusA(LPCSTR Header, LPSTR Id, int Max);
int WINAPI NMailAttachmentFileStatusW(LPCWSTR Header, LPWSTR Id, int Max);
#ifdef _MBCS
#define NMailAttachmentFileStatus	NMailAttachmentFileStatusA
#endif
#ifdef _UNICODE
#define NMailAttachmentFileStatus	NMailAttachmentFileStatusW
#endif

//
//	オプション設定
//	in:  Option  .. オプション種別
//	     Value   .. オプションの値
//
BOOL WINAPI NMailSetOption(int Option, int Value);

//
//	オプション値の取得
//	in:  Option  .. オプション種別
//  out: オプションの値
//
int WINAPI NMailGetOption(int Option);

//
//	エラーメッセージを得る
//	in:  Mtype    .. メッセージ種別
//		 Message  .. メッセージを格納するバッファ
//	     Size     .. バッファサイズ
//
VOID WINAPI NMailGetMessage(int Mtype, LPTSTR Message, int Size);
VOID WINAPI NMailGetMessageA(int Mtype, LPSTR Message, int Size);
VOID WINAPI NMailGetMessageW(int Mtype, LPWSTR Message, int Size);
#ifdef _MBCS
#define NMailGetMessage	NMailGetMessageA
#endif
#ifdef _UNICODE
#define NMailGetMessage	NMailGetMessageW
#endif

//
//	現在の単位での休止回数を算出
//	in:  Path .. 添付ファイル名
//	out: 休止回数
//	     NMAIL_ERROR_FILE_OPEN .. ファイルが存在しない
//
int WINAPI NMailGetSuspendNumber(LPCTSTR Path);
int WINAPI NMailGetSuspendNumberA(LPCSTR Path);
int WINAPI NMailGetSuspendNumberW(LPCWSTR Path);
#ifdef _MBCS
#define NMailGetSuspendNumber	NMailGetSuspendNumberA
#endif
#ifdef _UNICODE
#define NMailGetSuspendNumber	NMailGetSuspendNumberW
#endif

//
//	IMAP4 サーバに接続
//	in:  HostName .. IMAP4 ホスト名
//	out: ソケット
//	     INVALID_SOCKET or NMAIL_ERROR_TIMEOUT でエラー
//
SOCKET WINAPI NMailImap4Connect(LPCTSTR HostName);
SOCKET WINAPI NMailImap4ConnectA(LPCSTR HostName);
SOCKET WINAPI NMailImap4ConnectW(LPCWSTR HostName);
#if _MBCS
#define NMailImap4Connect	NMailImap4ConnectA
#endif
#ifdef _UNICODE
#define NMailImap4Connect	NMailImap4ConnectW
#endif

//
//	IMAP4 サーバに接続(ポート番号指定)
//	in:  HostName .. IMAP4 ホスト名
//       PortNo   .. ポート番号
//	out: ソケット
//
SOCKET WINAPI NMailImap4ConnectPortNo(LPCTSTR HostName, int PortNo);
SOCKET WINAPI NMailImap4ConnectPortNoA(LPCSTR HostName, int PortNo);
SOCKET WINAPI NMailImap4ConnectPortNoW(LPCWSTR HostName, int PortNo);
#ifdef _MBCS
#define NMailImap4ConnectPortNo	NMailImap4ConnectPortNoA
#endif
#ifdef _UNICODE
#define NMailImap4ConnectPortNo	NMailImap4ConnectPortNoW
#endif

//
//	IMAP4 認証
//	in:  Socket   .. ソケット
//	     Id       .. ユーザー名
//	     Password .. パスワード
//	     Mode     .. 認証方式
//	out: エラーコード
//
int WINAPI NMailImap4Authenticate(SOCKET Socket, LPCTSTR Id, LPCTSTR Password, int Mode);
int WINAPI NMailImap4AuthenticateA(SOCKET Socket, LPCSTR Id, LPCSTR Password, int Mode);
int WINAPI NMailImap4AuthenticateW(SOCKET Socket, LPCWSTR Id, LPCWSTR Password, int Mode);
#ifdef _MBCS
#define NMailImap4Authenticate	NMailImap4AuthenticateA
#endif
#ifdef _UNICODE
#define NMailImap4Authenticate	NMailImap4AuthenticateW
#endif

//
//	IMAP4 メールボックス選択
//	in:  Socket   .. ソケット
//	     MailBox  .. メールボックス名
//	     ReadOnlyFlag .. 読み出し専用で開くか
//	out: エラーコード
//
int WINAPI NMailImap4SelectMailBox(SOCKET Socket, LPCTSTR MailBox, BOOL ReadOnlyFlag);
int WINAPI NMailImap4SelectMailBoxA(SOCKET Socket, LPCSTR MailBox, BOOL ReadOnlyFlag);
int WINAPI NMailImap4SelectMailBoxW(SOCKET Socket, LPCWSTR MailBox, BOOL ReadOnlyFlag);
#ifdef _MBCS
#define NMailImap4SelectMailBox	NMailImap4SelectMailBoxA
#endif
#ifdef _UNICODE
#define NMailImap4SelectMailBox	NMailImap4SelectMailBoxW
#endif

//
//	IMAP4 メールボックス選択終了
//	in:  Socket   .. ソケット
//	out: エラーコード
//
int WINAPI NMailImap4CloseMailBox(SOCKET Socket);

//
//	IMAP4 メールを得る
//	in:  Socket   .. ソケット
//	     No       .. メール番号
//	     Subject  .. メールの題名
//	     Date     .. メールの送信日時
//	     From     .. メールの差出人
//	     Header   .. メールのヘッダ
//	     Body     .. メールの本文
//	     Path     .. 添付ファイルを保存するフォルダ
//	     FileName .. 添付ファイル名を格納するバッファ
//	     Flag     .. フラグ
//	out: エラーコード
//
int WINAPI NMailImap4GetMail(SOCKET Socket, DWORD MailNo, LPTSTR Subject, LPTSTR Date, LPTSTR From, LPTSTR Header, LPTSTR Body, LPCTSTR Path, LPTSTR FileName, int Flag);
int WINAPI NMailImap4GetMailA(SOCKET Socket, DWORD MailNo, LPSTR Subject, LPSTR Date, LPSTR From, LPSTR Header, LPSTR Body, LPCSTR Path, LPSTR FileName, int Flag);
int WINAPI NMailImap4GetMailW(SOCKET Socket, DWORD MailNo, LPWSTR Subject, LPWSTR Date, LPWSTR From, LPWSTR Header, LPWSTR Body, LPCWSTR Path, LPWSTR FileName, int Flag);
#ifdef _MBCS
#define NMailImap4GetMail	NMailImap4GetMailA
#endif
#ifdef _UNICODE
#define NMailImap4GetMail	NMailImap4GetMailW
#endif

//
//	IMAP4 メールボックスリストアップ
//	in:  Socket        .. ソケット
//	     Refer         .. 検索する場所
//	     MailBox       .. ワイルドカード(メールボックス名)
//	     SubscribeFlag .. 購読済みメールボックスのみ検索するか
//	out: メールボックス数
//	     負の数でエラーコード
//
int WINAPI NMailImap4GetMailBoxList(SOCKET Socket, LPCTSTR Refer, LPCTSTR MailBox, BOOL SubscribeFlag);
int WINAPI NMailImap4GetMailBoxListA(SOCKET Socket, LPCSTR Refer, LPCSTR MailBox, BOOL SubscribeFlag);
int WINAPI NMailImap4GetMailBoxListW(SOCKET Socket, LPCWSTR Refer, LPCWSTR MailBox, BOOL SubscribeFlag);
#ifdef _MBCS
#define NMailImap4GetMailBox	NMailImap4GetMailBoxListA
#endif
#ifdef _UNICODE
#define NMailImap4GetMailBox	NMailImap4GetMailBoxListW
#endif

//
//	IMAP4 メールボックスリストアップ情報取得
//	in:  Socket      .. ソケット
//	     ListNo      .. メールボックスリスト番号
//		 MailBoxFlag .. メールボックスフラグを格納する変数へのポインタ
//	     Separate    .. メールボックス区切り文字を格納するバッファ
//	     MailBox     .. メールボックス名を格納するバッファ
//	     Size        .. メールボックス名を格納するバッファのサイズ
//	out: エラーコード
//
int WINAPI NMailImap4GetMailBoxListStatus(SOCKET Socket, int ListNo, int *MailBoxFlag, LPTSTR Separate, LPTSTR MailBox, int Size);
int WINAPI NMailImap4GetMailBoxListStatusA(SOCKET Socket, int ListNo, int *MailBoxFlag, LPSTR Separate, LPSTR MailBox, int Size);
int WINAPI NMailImap4GetMailBoxListStatusW(SOCKET Socket, int ListNo, int *MailBoxFlag, LPWSTR Separate, LPWSTR MailBox, int Size);
#ifdef _MBCS
#define NMailImap4GetMailBoxListStatus	NMailImap4GetMailBoxListStatusA
#endif
#ifdef _UNICODE
#define NMailImap4GetMailBoxListStatus	NMailImap4GetMailBoxListStatusW
#endif

//
//	IMAP4 メールのサイズを得る
//	in:  Socket   .. ソケット
//	     MailNo   .. メール番号
//	     Flag     .. フラグ(UID)
//	out: メールのサイズ
//	     負の数でエラー
//
int WINAPI NMailImap4GetMailSize(SOCKET Socket, DWORD MailNo, int Flag);

//
//	IMAP4 メールの情報を得る
//	in:  Socket      .. ソケット
//	     MaiNo       .. メール番号
//	     Subject     .. メールの題名
//	     Date        .. メールの送信日時
//	     From        .. メールの差出人
//	     Header      .. ヘッダ
//	     MessageFlag .. メッセージフラグを格納する変数
//	     Flag        .. フラグ(UID)
//	out: エラーコード
//
int WINAPI NMailImap4GetMailStatus(SOCKET Socket, DWORD MailNo, LPTSTR Subject, LPTSTR Date, LPTSTR From, LPTSTR Header, int *MessageFlag, int Flag);
int WINAPI NMailImap4GetMailStatusA(SOCKET Socket, DWORD MailNo, LPSTR Subject, LPSTR Date, LPSTR From, LPSTR Header, int *MessageFlag, int Flag);
int WINAPI NMailImap4GetMailStatusW(SOCKET Socket, DWORD MailNo, LPWSTR Subject, LPWSTR Date, LPWSTR From, LPWSTR Header, int *MessageFlag, int Flag);
#ifdef _MBCS
#define NMailImap4GetMailStatus	NMailImap4GetMailStatusA
#endif
#ifdef _UNICODE
#define NMailImap4GetMailStatus	NMailImap4GetMailStatusW
#endif

//
//	IMAP4 メールを削除(削除フラグを付加するだけ)
//	in:  Socket   .. ソケット
//	     MailNo   .. メール番号
//	     Flag     .. フラグ(UID)
//	out: エラーコード
//
int WINAPI NMailImap4DeleteMail(SOCKET Socket, DWORD MailNo, int Flag);

//
//	IMAP4 メール削除を実行
//	in:  Socket   .. ソケット
//	out: エラーコード
//
int WINAPI NMailImap4ExpungeMail(SOCKET Socket);

//
//	IMAP4 メールメッセージフラグ変更
//	in:  Socket      .. ソケット
//	     MailNo      .. メール番号
//	     MessageFlag .. フラグ種別
//	     Command     .. 追加/削除
//	     Flag     .. フラグ(UID)
//	out: エラーコード
//
int WINAPI NMailImap4ChangeMessageFlag(SOCKET Socket, DWORD MailNo, int MessageFlag, int Command, int Flag);

//
//	IMAP4 メールボックス作成
//	in:  Socket   .. ソケット
//	     MailBox  .. 作成するメールボックス名
//	out: エラーコード
//
int WINAPI NMailImap4CreateMailBox(SOCKET Socket, LPCTSTR MailBox);
int WINAPI NMailImap4CreateMailBoxA(SOCKET Socket, LPCSTR MailBox);
int WINAPI NMailImap4CreateMailBoxW(SOCKET Socket, LPCWSTR MailBox);
#ifdef _MBCS
#define NMailImap4CreateMailBox	NMailImap4CreateMailBoxA
#endif
#ifdef _UNICODE
#define NMailImap4CreateMailBox	NMailImap4CreateMailBoxW
#endif

//
//	IMAP4 メールボックス削除
//	in:  Socket   .. ソケット
//	     MailBox  .. 削除するメールボックス名
//	out: エラーコード
//
int WINAPI NMailImap4DeleteMailBox(SOCKET Socket, LPCTSTR MailBox);
int WINAPI NMailImap4DeleteMailBoxA(SOCKET Socket, LPCSTR MailBox);
int WINAPI NMailImap4DeleteMailBoxW(SOCKET Socket, LPCWSTR MailBox);
#ifdef _MBCS
#define NMailImap4DeleteMailBox	NMailImap4DeleteMailBoxA
#endif
#ifdef _UNICODE
#define NMailImap4DeleteMailBox	NMailImap4DeleteMailBoxW
#endif

//
//	IMAP4 メールボックス名称変更
//	in:  Socket      .. ソケット
//	     OldMailBox  .. 名称変更するメールボックス名
//	     NewMailBox  .. 名称変更後のメールボックス名
//	out: エラーコード
//
int WINAPI NMailImap4RenameMailBox(SOCKET Socket, LPCTSTR OldMailBox, LPCTSTR NewMailBox);
int WINAPI NMailImap4RenameMailBoxA(SOCKET Socket, LPCSTR OldMailBox, LPCSTR NewMailBox);
int WINAPI NMailImap4RenameMailBoxW(SOCKET Socket, LPCWSTR OldMailBox, LPCWSTR NewMailBox);
#ifdef _MBCS
#define NMailImap4RenameMailBox	NMailImap4RenameMailBoxA
#endif
#ifdef _UNICODE
#define NMailImap4RenameMailBox	NMailImap4RenameMailBoxW
#endif

//
//	IMAP4 メールボックス購読
//	in:  Socket   .. ソケット
//	     MailBox  .. 購読するメールボックス名
//	out: エラーコード
//
int WINAPI NMailImap4SubscribeMailBox(SOCKET Socket, LPCTSTR MailBox);
int WINAPI NMailImap4SubscribeMailBoxA(SOCKET Socket, LPCSTR MailBox);
int WINAPI NMailImap4SubscribeMailBoxW(SOCKET Socket, LPCWSTR MailBox);
#ifdef _MBCS
#define NMailImap4SubscribeMailBox	NMailImap4SubscribeMailBoxA
#endif
#ifdef _UNICODE
#define NMailImap4SubscribeMailBox	NMailImap4SubscribeMailBoxW
#endif

//
//	IMAP4 メールボックス購読解除
//	in:  Socket   .. ソケット
//	     MailBox  .. 購読解除するメールボックス名
//	out: エラーコード
//
int WINAPI NMailImap4UnsubscribeMailBox(SOCKET Socket, LPCTSTR MailBox);
int WINAPI NMailImap4UnsubscribeMailBoxA(SOCKET Socket, LPCSTR MailBox);
int WINAPI NMailImap4UnsubscribeMailBoxW(SOCKET Socket, LPCWSTR MailBox);
#ifdef _MBCS
#define NMailImap4UnsubscribeMailBox	NMailImap4UnsubscribeMailBoxA
#endif
#ifdef _UNICODE
#define NMailImap4UnsubscribeMailBox	NMailImap4UnsubscribeMailBoxW
#endif

//
//	IMAP4 メールコピー
//	in:  Socket   .. ソケット
//	     MailNo   .. メール番号
//	     MailBox  .. コピー先のメールボックス名
//	     Flag     .. フラグ(UID)
//	out: エラーコード
//
int WINAPI NMailImap4CopyMail(SOCKET Socket, DWORD MaiNo, LPCTSTR MailBox, int Flag);
int WINAPI NMailImap4CopyMailA(SOCKET Socket, DWORD MailNo, LPCSTR MailBox, int Flag);
int WINAPI NMailImap4CopyMailW(SOCKET Socket, DWORD MailNo, LPCWSTR MailBox, int Flag);
#ifdef _MBCS
#define NMailImap4CopyMail	NMailImap4CopyMailA
#endif
#ifdef _UNICODE
#define NMailImap4CopyMail	NMailImap4CopyMailW
#endif

//
//	IMAP4 UID を得る
//	in:  Socket   .. ソケット
//	     MailNo   .. メール番号
//	     Uid      .. UID を格納するバッファ
//	out: NMAIL_SUCCESS .. 成功
//
int WINAPI NMailImap4GetUid(SOCKET Socket, DWORD No, DWORD *Uid);

//
//	IMAP4 メールボックス情報取得
//	in:  Socket   .. ソケット
//	     MailBox  .. メールボックス名
//	     Type     .. 情報種別
//	     Data     .. 情報格納用バッファ
//	out: エラーコード
//
int WINAPI NMailImap4GetMailBoxStatus(SOCKET Socket, LPCTSTR MailBox, int Type, DWORD *Data);
int WINAPI NMailImap4GetMailBoxStatusA(SOCKET Socket, LPCSTR MailBox, int Type, DWORD *Data);
int WINAPI NMailImap4GetMailBoxStatusW(SOCKET Socket, LPCWSTR MailBox, int Type, DWORD *Data);
#ifdef _MBCS
#define NMailImap4GetMailBoxStatus	NMailImap4GetMailBoxStatusA
#endif
#ifdef _UNICODE
#define NMailImap4GetMailBoxStatus	NMailImap4GetMailBoxStatusW
#endif

//
//	IMAP4 メール検索
//	in:  Socket   .. ソケット
//	     Type     .. 検索条件
//	     Text     .. 検索文字列
//	     Flag     .. フラグ(UID)
//	out: 条件に一致したメール数
//	     負の数でエラー
//
int WINAPI NMailImap4SearchMail(SOCKET Socket, int Type, LPCTSTR Text, int Flag);
int WINAPI NMailImap4SearchMailA(SOCKET Socket, int Type, LPCSTR Text, int Flag);
int WINAPI NMailImap4SearchMailW(SOCKET Socket, int Type, LPCWSTR Text, int Flag);
#ifdef _MBCS
#define NMailImap4SearchMail	NMailImap4SearchMailA
#endif
#ifdef _UNICODE
#define NMailImap4SearchMail	NMailImap4SearchMailW
#endif

//
//	IMAP4 検索結果取得
//	in:  Socket   .. ソケット
//	     ResultNo .. 検索結果番号
//	     MailNo   .. メール番号を格納するバッファ
//	out: メール番号
//
int WINAPI NMailImap4GetSearchMailResult(SOCKET Socket, int ResultNo, DWORD *MailNo);

//
//	IMAP4 メールをメールボックスに格納
//	in:  Socket      .. ソケット
//	     MailBox     .. メールメールボックス名
//	     Header      .. メールヘッダ
//	     Body        .. メール本文
//	     Path        .. 添付ファイル NULL で追加しない
//	     Flag        .. フラグ
//	     MessageFlag .. メッセージフラグ
//	     Date        .. メール追加日時(ヘッダとは別) NULL で現在日時
//	out: エラーコード
//
int WINAPI NMailImap4AppendMail(SOCKET Socket, LPCTSTR MailBox, LPCTSTR Header, LPCTSTR Body, LPCSTR Path, int MessageFlag, LPCTSTR Date, int Flag);
int WINAPI NMailImap4AppendMailA(SOCKET Socket, LPCSTR MailBox, LPCSTR Header, LPCSTR Body, LPCSTR Path, int MessageFlag, LPCSTR Date, int Flag);
int WINAPI NMailImap4AppendMailW(SOCKET Socket, LPCWSTR MailBox, LPCWSTR Header, LPCWSTR Body, LPCWSTR Path, int MessageFlag, LPCWSTR Date, int Flag);
#ifdef _MBCS
#define NMailImap4AppendMail	NMailImap4AppendMailA
#endif
#ifdef _UNICODE
#define NMailImap4AppendMail	NMailImap4AppendMailW
#endif

//
//	日時文字列作成
//	in: String   .. 文字列を格納するバッファ
//	    Year     .. 年
//	    Month    .. 月
//	    Day      .. 日
//	    Hour     .. 時
//	    Minute   .. 分
//	    Second   .. 秒
//	out: エラーコード
//
int WINAPI NMailMakeDateString(LPTSTR String, int Year, int Month, int Day, int Hour, int Minute, int Second, int Flag);
int WINAPI NMailMakeDateStringA(LPSTR String, int Year, int Month, int Day, int Hour, int Minute, int Second, int Flag);
int WINAPI NMailMakeDateStringW(LPWSTR String, int Year, int Month, int Day, int Hour, int Minute, int Second, int Flag);
#ifdef _MBCS
#define NMailMakeDateString		NMailMakeDateStringA
#endif
#ifdef _UNICODE
#define NMailMakeDateString		NMailMakeDateStringW
#endif

//
//	IMAP4 名前空間を取得
//	in:  Socket           .. ソケット
//	out: エラーコード
//
int WINAPI NMailImap4GetNameSpace(SOCKET Socket);

//
//	IMAP4 名前空間情報取得
//	in:  Socket   .. ソケット
//	     Type     .. 名前空間種別
//	     Separete .. 名前空間区切り文字を格納するバッファ
//	     Name     .. 名前空間名称を格納するバッファ
//	     Size     .. 名前空間名称を格納するバッファのサイズ
//	out: エラーコード
//
int WINAPI NMailImap4GetNameSpaceStatus(SOCKET Socket, int Type, LPSTR Separate, LPSTR Name, int Size);
int WINAPI NMailImap4GetNameSpaceStatusA(SOCKET Socket, int Type, LPSTR Separate, LPSTR Name, int Size);
int WINAPI NMailImap4GetNameSpaceStatusW(SOCKET Socket, int Type, LPWSTR Separate, LPWSTR Name, int Size);
#ifdef _MBCS
#define NMailImap4GetNameSpaceStatus		NMailImap4GetNameSpaceStatusA
#endif
#ifdef _UNICODE
#define NMailImap4GetNameSpaceStatus		NMailImap4GetNameSpaceStatusW
#endif

//
//	IMAP4 メールの構造を取得する
//	in:  Socket .. ソケット
//	     MailNo .. メール番号
//	     Flag   .. フラグ(UID)
//	out: MIME 構造パート数
//	     負の数でエラー
//
int WINAPI NMailImap4GetMimeStructure(SOCKET Socket, DWORD MailNo, int Flag);

//
//	IMAP4 メール構造情報取得
//	in:  Socket   .. ソケット
//	     Type     .. 種別
//	     PartNo   .. 構造番号
//	     SubNo    .. 構造パラメータ番号
//	     Name     .. 構造名称格納バッファ
//	     Value    .. パラメータ値格納するバッファ
//	     Size     .. 格納するバッファのサイズ
//	out: NMAIL_IMAP4_MIME_CONTENT_PARAMETER_COUNT,
//		 NMAIL_IMAP4_MIME_CONTENT_SIZE,
//		 NMAIL_IMAP4_MIME_CONTENT_LINE の場合は数値
//		 負の値はエラーコード
//
int WINAPI NMailImap4GetMimeStructureStatus(SOCKET Socket, int Type, int PartNo, int SubNo, LPTSTR Name, LPTSTR Value, int Size);
int WINAPI NMailImap4GetMimeStructureStatusA(SOCKET Socket, int Type, int PartNo, int SubNo, LPSTR Name, LPSTR Value, int Size);
int WINAPI NMailImap4GetMimeStructureStatusW(SOCKET Socket, int Type, int PartNo, int SubNo, LPWSTR Name, LPWSTR Value, int Size);
#ifdef _MBCS
#define	NMailImap4GetMimeStructureStatus 	NMailImap4GetMimeStructureStatusA
#endif
#ifdef _UNICODE
#define NMailImap4GetMimeStructureStatus	NMailImap4GetMimeStructureStatusW
#endif

//
//	IMAP4 メールボディ個別取得
//	in:  Socket   .. ソケット
//	     MailNo   .. メール番号
//	     PartNo   .. 構造番号
//	     Body     .. ボディ格納バッファ
//	     Flag     .. フラグ
//	out: エラーコード
//
int WINAPI NMailImap4GetMimePart(SOCKET Socket, DWORD MailNo, int PartNo, LPTSTR Body, int Flag);
int WINAPI NMailImap4GetMimePartA(SOCKET Socket, DWORD MailNo, int PartNo, LPSTR Body, int Flag);
int WINAPI NMailImap4GetMimePartW(SOCKET Socket, DWORD MailNo, int PartNo, LPWSTR Body, int Flag);
#ifdef _MBCS
#define	NMailImap4GetMimePart 	NMailImap4GetMimePartA
#endif
#ifdef _UNICODE
#define NMailImap4GetMimePart	NMailImap4GetMimePartW
#endif

//
//	IMAP4 メールボディファイル保存
//	in:  Socket   .. ソケット
//	     MailNo   .. メール番号
//	     PartNo   .. 構造番号
//	     Path     .. 添付ファイルを保存するフォルダ
//	     FileName .. 添付ファイル名を格納するバッファ
//	     Flag     .. フラグ
//	out: エラーコード
//
int WINAPI NMailImap4SaveMimePart(SOCKET Socket, DWORD MailNo, int PartNo, LPCTSTR Path, LPTSTR FileName, int Flag);
int WINAPI NMailImap4SaveMimePartA(SOCKET Socket, DWORD MailNo, int PartNo, LPCSTR Path, LPSTR FileName, int Flag);
int WINAPI NMailImap4SaveMimePartW(SOCKET Socket, DWORD MailNo, int PartNo, LPCWSTR Path, LPWSTR FileName, int Flag);
#ifdef _MBCS
#define	NMailImap4SaveMimePart 	NMailImap4SaveMimePartA
#endif
#ifdef _UNICODE
#define NMailImap4SaveMimePart	NMailImap4SaveMimePartW
#endif

//
//	IMAP4 空コマンド送信
//	in:  Socket   .. ソケット
//	out: 負の数でエラー
//
int WINAPI NMailImap4NoOperation(SOCKET Socket);

//
//	IMAP4 接続終了
//	in:  Socket   .. ソケット
//	out: 負の数でエラー
//
int WINAPI NMailImap4Close(SOCKET Socket);

//
//	POP3 サーバに接続 SSL
//	in:  HostName .. POP3 ホスト名
//	     PortNo   .. POP3 ポート番号
//	     Flag     .. SSL 設定フラグ
//	     Name     .. クライアント証明書名称
//	out: ソケット
//	     INVALID_SOCKET でエラー
//
SOCKET WINAPI NMailPop3ConnectSsl(LPCTSTR HostName, int PortNo, int Flag, LPCTSTR Name);
SOCKET WINAPI NMailPop3ConnectSslA(LPCSTR HostName, int PortNo, int Flag, LPCSTR Name);
SOCKET WINAPI NMailPop3ConnectSslW(LPCWSTR HostName, int PortNo, int Flag, LPCWSTR Name);
#ifdef _MBCS
#define NMailPop3ConnectSsl	NMailPop3ConnectSslA
#endif
#ifdef _UNICODE
#define NMailPop3ConnectSsl	NMailPop3ConnectSslW
#endif

//
//	SMTP サーバに接続 SSL
//	in:  HostName .. SMTP ホスト名
//	     PortNo   .. SMTP ポート番号
//	     Flag     .. SSL 設定フラグ
//	     Name     .. クライアント証明書名称
//	out: ソケット
//	     INVALID_SOCKET でエラー
//
SOCKET WINAPI NMailSmtpConnectSsl(LPCTSTR HostName, int PortNo, int Flag, LPCTSTR Name);
SOCKET WINAPI NMailSmtpConnectSslA(LPCSTR HostName, int PortNo, int Flag, LPCSTR Name);
SOCKET WINAPI NMailSmtpConnectSslW(LPCWSTR HostName, int PortNo, int Flag, LPCWSTR Name);
#ifdef _MBCS
#define NMailSmtpConnectSsl	NMailSmtpConnectSslA
#endif
#ifdef _UNICODE
#define NMailSmtpConnectSsl	NMailSmtpConnectSslW
#endif

//
//	IMAP4 サーバに接続 SSL
//	in:  HostName .. IMAP4 ホスト名
//	     PortNo   .. IMAP4 ポート番号
//	     Flag     .. SSL 設定フラグ
//	     Name     .. クライアント証明書名称
//	out: ソケット
//	     INVALID_SOCKET でエラー
//
SOCKET WINAPI NMailImap4ConnectSsl(LPCTSTR HostName, int PortNo, int Flag, LPCTSTR Name);
SOCKET WINAPI NMailImap4ConnectSslA(LPCSTR HostName, int PortNo, int Flag, LPCSTR Name);
SOCKET WINAPI NMailImap4ConnectSslW(LPCWSTR HostName, int PortNo, int Flag, LPCWSTR Name);
#ifdef _MBCS
#define NMailImap4ConnectSsl	NMailImap4ConnectSslA
#endif
#ifdef _UNICODE
#define NMailImap4ConnectSsl	NMailImap4ConnectSslW
#endif

//
//	メールを送信 SSL
//	in:  HostName .. SMTP サーバ名
//	     To       .. 送り先
//	     Cc       .. CC
//	     Bcc      .. BCC
//	     From     .. 差出人
//	     Subject  .. 題名
//	     Body     .. メール本文
//	     Header   .. 他のヘッダ
//	     Path     .. 添付ファイル名(なければNULL)
//	     Flag     .. ヘッダにDate/Message-IDを付加するか
//	     PortNo   .. SMTP ポート番号
//	     SslFlag  .. SSL 設定フラグ
//	     Name     .. クライアント証明書名称
//	out: 負の数でエラー
//
int WINAPI NMailSmtpSendMailSsl(LPCTSTR HostName, LPCTSTR To, LPCTSTR Cc, LPCTSTR Bcc, LPCTSTR From, LPCTSTR Subject, LPCTSTR Body, LPCTSTR Header, LPCTSTR Path, int Flag, int PortNo, int SslFlag, LPCTSTR Name);
int WINAPI NMailSmtpSendMailSslA(LPCSTR HostName, LPCSTR To, LPCSTR Cc, LPCSTR Bcc, LPCSTR From, LPCSTR Subject, LPCSTR Body, LPCSTR Header, LPCSTR Path, int Flag, int PortNo, int SslFlag, LPCSTR Name);
int WINAPI NMailSmtpSendMailSslW(LPCWSTR HostName, LPCWSTR To, LPCWSTR Cc, LPCWSTR Bcc, LPCWSTR From, LPCWSTR Subject, LPCWSTR Body, LPCWSTR Header, LPCWSTR Path, int Flag, int PortNo, int SslFlag, LPCWSTR Name);
#ifdef _MBCS
#define NMailSmtpSendMailSsl	NMailSmtpSendMailSslA
#endif
#ifdef _UNICODE
#define NMailSmtpSendMailSsl	NMailSmtpSendMailSslW
#endif

//
//	IMAP4 IDLE 開始
//	in:  Socket   .. ソケット
//	     wnd      .. ウインドウハンドル
//	     message  .. 通知メッセージ
//	out: NMAIL_SUCCESS .. 正常終了
//
int WINAPI NMailImap4StartIdle(SOCKET Socket, HWND wnd, int message);

//
//	IMAP4 IDLE イベント取得
//	in:  Socket   .. ソケット
//	out: イベントハンドル
//
HANDLE WINAPI NMailImap4GetIdleEvent(SOCKET Socket);

//
//	IMAP4 IDLE 終了
//	in:  Socket   .. ソケット
//	out: NMAIL_SUCCESS .. 正常終了
//
int WINAPI NMailImap4EndIdle(SOCKET Socket);

//
//	OAuth 認可コード取得用サーバー開始
//	in:  RedirectUri   .. リダイレクト URI
//	     PesponseOK    .. 認可成功時に返す html 本文
//	     PesponseError .. 認可エラー時に返す html 本文
//	     Wnd           .. ウインドウハンドル
//	     Message       .. 認可終了通知メッセージ
//	     Flag          .. フラグ
//	out: 認可コード受取サーバーのソケット
//
SOCKET WINAPI NMailOAuth2StartRedirectServer(LPCTSTR RedirectUri, LPCTSTR ResponseOK, LPCTSTR ResponseError, HWND Wnd, int Message, int Flag);
SOCKET WINAPI NMailOAuth2StartRedirectServerA(LPCSTR RedirectUri, LPCSTR ResponseOK, LPCSTR ResponseError, HWND Wnd, int Meessage, int Flag);
SOCKET WINAPI NMailOAuth2StartRedirectServerW(LPCWSTR RedirectUri, LPCWSTR ResponseOK, LPCWSTR ResponseError, HWND Wnd, int Message, int Flag);
#ifdef _MBCS
#define NMailOAuth2StartRedirectServer NMailOAuth2StartRedirectServerA
#endif
#ifdef _UNICODE
#define NMailOAuth2StartRedirectServer NMailOAuth2StartRedirectServerW
#endif

//
//	OAuth 認可コード取得用サーバー開始 ポート番号指定
//	in:  PortNo        .. ポート番号
//	     PesponseOK    .. 認可成功時に返す html 本文
//	     PesponseError .. 認可エラー時に返す html 本文
//	     Wnd           .. ウインドウハンドル
//	     Message       .. 認可終了通知メッセージ
//	     Flag          .. フラグ
//	out: 認可コード受取サーバーのソケット
//
SOCKET WINAPI NMailOAuth2StartRedirectServerPortNo(int PortNo, LPCTSTR ResponseOK, LPCTSTR ResponseError, HWND Wnd, int Message, int Flag);
SOCKET WINAPI NMailOAuth2StartRedirectServerPortNoA(int PortNo, LPCSTR ResponseOK, LPCSTR ResponseError, HWND Wnd, int Meessage, int Flag);
SOCKET WINAPI NMailOAuth2StartRedirectServerPortNoW(int PortNo, LPCWSTR ResponseOK, LPCWSTR ResponseError, HWND Wnd, int Message, int Flag);
#ifdef _MBCS
#define NMailOAuth2StartRedirectServerPortNo NMailOAuth2StartRedirectServerPortNoA
#endif
#ifdef _UNICODE
#define NMailOAuth2StartRedirectServerPortNo NMailOAuth2StartRedirectServerPortNoW
#endif

//
//	OAuth 認可コード取得リクエスト
//	in:  AuthUri     .. 認可 URI
//	     ClientId    .. クライアントID
//	     RedirectUri .. リダイレクト URI
//	     Scope       .. スコープ
//	     State       .. ステート
//	     Verifier    .. PKCE code_verifier
//	     Param       .. 追加のパラメータ
//	     Flag        .. フラグ
//	out: 認可コード受取サーバーのソケット
//
int WINAPI NMailOAuth2RequestAuthorize(LPCTSTR AuthUri, LPCTSTR ClientId, LPCTSTR RedirectUri, LPCTSTR Scope, LPCTSTR State, LPCTSTR Verifier, LPCTSTR Param, int Flag);
int WINAPI NMailOAuth2RequestAuthorizeA(LPCSTR AuthUri, LPCSTR ClientId, LPCSTR RedirectUri, LPCSTR Scope, LPCSTR State, LPCSTR Verifier, LPCSTR Param, int Flag);
int WINAPI NMailOAuth2RequestAuthorizeW(LPCWSTR AuthUri, LPCWSTR ClientId, LPCWSTR RedirectUri, LPCWSTR Scope, LPCWSTR State, LPCWSTR Verifier, LPCWSTR Param, int Flag);
#ifdef _MBCS
#define NMailOAuth2RequestAuthorize NMailOAuth2RequestAuthorizeA
#endif
#ifdef _UNICODE
#define NMailOAuth2RequestAuthorize NMailOAuth2RequestAuthorizeW
#endif

//
//	OAuth 認可コード取得
//	in:  Socket       .. 認可コード受取サーバーソケット
//	     Code         .. 認可コードを格納するバッファ
//	     CodeLength   .. 格納バッファサイズ
//	     State        .. state を格納するバッファ
//	     StateLength  .. 格納バッファサイズ
//	out: NMAIL_SUCCESS .. 取得成功
//
int WINAPI NMailOAuth2GetAuthorizeCode(SOCKET Socket, LPTSTR Code, int CodeLength, LPTSTR State, int StateLength);
int WINAPI NMailOAuth2GetAuthorizeCodeA(SOCKET Socket, LPSTR Code, int CodeLength, LPSTR State, int StateLength);
int WINAPI NMailOAuth2GetAuthorizeCodeW(SOCKET Socket, LPWSTR Code, int CodeLength, LPWSTR State, int StateLength);
#ifdef _MBCS
#define NMailOAuth2GetAuthorizeCode	NMailOAuth2GetAuthorizeCodeA
#endif
#ifdef _UNICODE
#define NMailOAuth2GetAuthorizeCode	NMailOAuth2GetAuthorizeCodeW
#endif

//
//	OAuth 認可コード取得通知イベント取得
//	in:  Socket      .. 認可コード受取サーバーソケット
//	out: イベントハンドル
//
HANDLE WINAPI NMailOAuth2GetAuthorizeEvent(SOCKET Socket);

//
//	OAuth 認可コード取得用サーバー終了
//	in:  Socket      .. 認可コード受取サーバーソケット
//	out: NMAIL_SUCCESS .. 正常終了
//
int WINAPI NMailOAuth2EndRedirectServer(SOCKET Socket);

//
//	OAuth リフレッシュトークン取得
//	in:  RequestUri   .. トークン取得 URI
//	     ClientId     .. クライアントID
//	     ClientSecret .. クライアントシークレット
//	     RedirectUri  .. リダイレクト URI
//	     Code         .. 認可コード
//	     Verifier     .. PKCE code_verifier
//	     Param        .. 追加のパラメータ
//	     Header       .. 追加のヘッダー
//	     Json         .. 応答 JSON 文字列を格納するバッファ
//	     Length       .. 格納バッファサイズ
//	     Flag        .. フラグ
//	out: NMAIL_SUCCESS .. 取得成功
//
int WINAPI NMailOAuth2GetRefreshToken(LPCTSTR RequestUri, LPCTSTR ClientId, LPCTSTR ClientSecret, LPCTSTR RedirectUri, LPCTSTR Code, LPCTSTR Verifier, LPCTSTR Param, LPCTSTR Header, LPTSTR Json, int Length, int Flag);
int WINAPI NMailOAuth2GetRefreshTokenA(LPCSTR RequestUri, LPCSTR ClientId, LPCSTR ClientSecret, LPCSTR RedirectUri, LPCSTR Code, LPCSTR Verifier, LPCSTR Param, LPCSTR Header, LPSTR Json, int Length, int Flag);
int WINAPI NMailOAuth2GetRefreshTokenW(LPCWSTR RequestUri, LPCWSTR ClientId, LPCWSTR ClientSecret, LPCWSTR RedirectUri, LPCWSTR Code, LPCWSTR Verifier, LPCWSTR Param, LPCWSTR Header, LPWSTR Json, int length, int Flag);
#ifdef _MBCS
#define NMailOAuth2GetRefreshToken	NMailOAuth2GetRefreshTokenA
#endif
#ifdef _UNICODE
#define NMailOAuth2GetRefreshToken	NMailOAuth2GetRefreshTokenW
#endif

//
//	OAuth アクセストークン取得
//	in:  RequestUri   .. トークン取得 URI
//	     ClientId     .. クライアントID
//	     ClientSecret .. クライアントシークレット
//	     RefreshToken .. リフレッシュトークン
//	     Param        .. 追加のパラメータ
//	     Header       .. 追加のヘッダー
//	     Json         .. 応答 JSON 文字列を格納するバッファ
//	     Length       .. 格納バッファサイズ
//	     Flag         .. フラグ
//	out: NMAIL_SUCCESS .. 取得成功
//
int WINAPI NMailOAuth2GetAccessToken(LPCTSTR RequestUri, LPCTSTR ClientId, LPCTSTR ClientSecret, LPCTSTR RefreshToken, LPCTSTR Param, LPCTSTR Header, LPTSTR Json, int Length, int Flag);
int WINAPI NMailOAuth2GetAccessTokenA(LPCSTR RequestUri, LPCSTR ClientId, LPCSTR ClientSecret, LPCSTR RefreshToken, LPCSTR Param, LPCSTR Header, LPSTR Json, int Length, int Flag);
int WINAPI NMailOAuth2GetAccessTokenW(LPCWSTR RequestUri, LPCWSTR ClientId, LPCWSTR ClientSecret, LPCWSTR RefreshToken, LPCWSTR Param, LPCWSTR Header, LPWSTR Json, int Length, int Flag);
#ifdef _MBCS
#define NMailOAuth2GetAccessToken	NMailOAuth2GetAccessTokenA
#endif
#ifdef _UNICODE
#define NMailOAuth2GetAccessToken	NMailOAuth2GetAccessTokenW
#endif

//
//	JSON キーに対応する値取得
//	in:  Json         .. JSON 文字列
//	     Key          .. キー名
//	     Value        .. キーに対応する値を格納するバッファ
//	     Length       .. 格納バッファサイズ
//	     Flag         .. フラグ
//	out: NMAIL_SUCCESS .. 取得成功
//
int WINAPI NMailJsonGetValue(LPCSTR Json, LPCSTR Key, LPSTR Value, int Length, int Flag);
int WINAPI NMailJsonGetValueA(LPCSTR Json, LPCSTR Key, LPSTR Value, int Length, int Flag);
int WINAPI NMailJsonGetValueW(LPCWSTR Json, LPCWSTR Key, LPWSTR Value, int Length, int Flag);
#ifdef _MBCS
#define NMailJsonGetValue	NMailJsonGetValueA
#endif
#ifdef _UNICODE
#define NMailJsonGetValue	NMailJsonGetValueW
#endif

//
//	ランダム文字列生成
//	in:  Str          .. 文字列を格納するバッファ
//	     Length       .. 格納バッファサイズ
//	     Flag         .. フラグ
//	out: NMAIL_SUCCESS .. 取得成功
//
int WINAPI NMailMakeRandomString(LPSTR Str, int Length, int Flag);
int WINAPI NMailMakeRandomStringA(LPSTR Str, int Length, int Flag);
int WINAPI NMailMakeRandomStringW(LPWSTR Str, int Length, int Flag);
#ifdef _MBCS
#define NMailMakeRandomString	NMailMakeRandomStringA
#endif
#ifdef _UNICODE
#define NMailMakeRandomString	NMailMakeRandomStringW
#endif

//
//	HTTP GET/POST/PUT/DELETE
//	in:  Uri          .. URI
//	     PostData     .. POST するデータ
//	     Header       .. 追加ヘッダー
//	     Json         .. 応答を格納するバッファ
//	     Length       .. 格納バッファサイズ
//	     Flag         .. フラグ
//	out: NMAIL_SUCCESS .. 取得成功
//
int WINAPI NMailHttpGetPost(LPCSTR Uri, LPCSTR PostData, LPCSTR Header, LPSTR Json, int Length, int Flag);
int WINAPI NMailHttpGetPostA(LPCSTR Uri, LPCSTR PostData, LPCSTR Header, LPSTR Json, int Length, int Flag);
int WINAPI NMailHttpGetPostW(LPCWSTR Uri, LPCWSTR PostData, LPCWSTR Header, LPWSTR Json, int Length, int Flag);
#ifdef _MBCS
#define NMailHttpGetPost	NMailHttpGetPostA
#endif
#ifdef _UNICODE
#define NMailHttpGetPost	NMailHttpGetPostW
#endif


#ifdef __cplusplus
}
#endif

#endif
