0

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);
        }
    }
4

1 に答える 1

1

GMail の「ラベル システム」は、GMail がフォルダを実装する方法です。彼らは物理的なフォルダーを実装しません。彼らが行うのは、ユーザーが定義したラベルである「仮想」フォルダーを持ち、フォルダーはそのラベルが適用されたすべてのメールの単なるクエリです。

つまり、GMail のルート名前空間はstring.Empty. 一部の IMAP サーバーにはルート名前空間があります"INBOX"(Courier IMAP などだと思います)。

メソッドはGMailCreateFolderOnRootのルートにフォルダーを作成する必要があり、INBOXの下には作成しないため、質問は非常に混乱します。

INBOXの下にフォルダを追加したい場合は、単に使用してくださいclient.Inbox.Create (displayName, true);

フォルダの作成時に問題が発生します。フォルダーが見つからない場合は、受信トレイ フォルダーの下に作成する必要があります。

これは、あなたが実際にやりたいことはこれだと思います:

try {
    var toplevel = _client.GetFolder(_client.PersonalNamespaces[0]);
    var mailkit = folder.GetSubfolder(displayName);
    return new ImapFolder(mailkit, _client);
} catch (Exception ex) {
    throw new LoadFolderFailedException(ex);
}

GetSubfolderではなく を使用していることに注意してCreateください。Create常にフォルダを作成します。GetSubfolder存在する場合にのみ取得します。

于 2016-03-16T16:43:29.757 に答える