Mailkit の SMTP と IMAP を使用する電子メール プロバイダーがあります。私が現在使用している主な機能は、受信トレイからメッセージを読み取ることであり、メールの内容に応じて、「処理済み」または「無視」フォルダーに移動します。Exchange で使用している既存のシステムでは、これらのフォルダーは受信トレイのサブフォルダーとして存在します。フォルダーが存在しない場合は、作成されます。サンプル コード スニペットを以下に示します。
var _inboxFolder = _provider.GetInboxFolder();
var folder = _inboxFolder.GetChildFolder(folderName);
if (folder == null)
{
// If Gmail, Inbox does not allow children. Check for folder in root.
folder = _provider.GetFolder(folderName);
}
if (folder == null)
{
// Create new folder under Inbox
folder = _inboxFolder.CreateChildFolder(folderName);
if (folder == null)
{
// Cannot create under Inbox, create on root
folder = _provider.CreateFolderOnRoot(folderName);
}
}
これらはすべて、他のプロバイダーに使用するインターフェイスに基づいた独自のプロバイダーを使用するため、他のプロバイダーにとって意味のある「奇妙な」ロジックがいくつかあります。GetInboxFolder と GetFolder はフォルダーを返しますが、フォルダーが見つからない場合は null を返します。これはすべてのプロバイダーで正常に機能します。フォルダーが存在しない場合は作成できます。
フォルダの作成時に問題が発生します。フォルダーが見つからない場合は、受信トレイ フォルダーの下に作成する必要があります。これができない場合 (Gmail など)、ルート フォルダーに作成する必要があります。ただし、Inbox フォルダーの下にフォルダーを作成しようとしても失敗せず、「INBOX/FolderName」というラベルが作成されるだけです。理想的には、このフォルダーを作成しようとしても失敗するようにして、ルートに簡単に作成できるようにしたいと考えています。これは、IMAP から GMail ラベル システムへの変換の問題だと思います。
「INBOX/FolderName」ラベルを防止する方法、または作成する前にこの問題を特定する方法はありますか? または、これが gmail サーバーであることを特定し、特別な条項を実装する方法はありますか?
少し追加情報として、CreateChildFolder と CreateFolderOnRoot のコードを以下に示します。
IMAPFolder クラス
public IEmailFolder CreateChildFolder(string displayName)
{
if (_imapClient == null || !_imapClient.IsConnected)
{
throw new NotLoggedInException();
}
return new ImapFolder(_folder.Create(displayName, true), _imapClient);
}
IMAPClient クラス
public IEmailFolder CreateFolderOnRoot(string displayName)
{
if (_client == null)
{
throw new NotLoggedInException();
}
try
{
var toplevel = _client.GetFolder(_client.PersonalNamespaces[0]);
var mailkit = toplevel.Create(displayName, true);
return new ImapFolder(mailkit, _client);
}
catch (Exception exception)
{
throw new LoadFolderFailedException(exception);
}
}