質問

MS Exchange Server (社内) 上の特定のメールボックスを監視し、そこからの電子メールを読み取る機能が必要です。また、送信者の電子メール アドレス、件名、メッセージ本文を読み取り、添付ファイルがある場合はダウンロードできる必要もあります。

C# (または Vb.net) を使用してこれを行う最良の方法は何ですか?

役に立ちましたか?

解決

これは混乱です。 .NET interop DLLを介したMAPIまたはCDOは Microsoftによって公式にサポートされていない-正常に動作するように見えますが、メモリの違いによるメモリリークの問題があります。モデル。 CDOEXを使用できますが、これはExchangeサーバー自体でのみ機能し、リモートでは機能しません。役に立たない。 Outlookと相互運用できますが、Outlookに依存するようになりました。やりすぎ。最後に、 Exchange 2003のWebDAVサポートを使用できますが、WebDAVは複雑で、 .NETの組み込みサポートは不十分であり、(傷害をto辱するために)Exchange 2007はWebDAVサポートをほぼ完全にドロップします。

やるべきことは何ですか?最終的に AfterLogicのIMAPコンポーネントを使用して、IMAP経由でExchange 2003サーバーと通信し、そして、これは非常にうまくいきました。 (私は通常、無料またはオープンソースのライブラリを探していますが、特に2003年のIMAP実装のいくつかの癖になると、必要なすべての.NETライブラリを見つけました。これは十分に安く、最初のもので動作しました試してみてください。他にも他にもあることがわかっています。)

ただし、組織がExchange 2007を使用している場合は、幸運です。 Exchange 2007にはSOAPベースのWebサービスインターフェイスが付属しています Exchangeサーバーと対話する、言語に依存しない統一された方法。 2007+を要件にすることができれば、これは間違いなく進むべき方法です。 (残念ながら、私の会社には<!> quot;がありますが、2003は壊れていません<!> quot;ポリシー。)

Exchange 2003と2007の両方をブリッジする必要がある場合は、間違いなくIMAPまたはPOP3が最適です。

他のヒント

ええと、

ここでは少し遅すぎるかもしれませんが、これはEWSのポイントではありませんか?

https://msdn.microsoft.com/en -us / library / dd633710(EXCHG.80).aspx

メールボックスからメールを取得するには、約6行のコードが必要です:

ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2007_SP1);

//service.Credentials = new NetworkCredential( "{Active Directory ID}", "{Password}", "{Domain Name}" );

service.AutodiscoverUrl( "First.Last@MyCompany.com" );

FindItemsResults<Item> findResults = service.FindItems(
   WellKnownFolderName.Inbox,
   new ItemView( 10 ) 
);

foreach ( Item item in findResults.Items )
{
   Console.WriteLine( item.Subject );
}
  1. 現在推奨されている (Exchange 2013 および 2016) API は次のとおりです。 EWS. 。純粋に HTTP ベースであり、どの言語からでもアクセスできますが、 。ネット そして ジャワ 特定のライブラリ。

    使用できます EWSエディター API を使って遊んでください。

  2. 拡張MAPI. 。これは、Outlook で使用されるネイティブ API です。最終的には、 MSEMS Exchange MAPI プロバイダー。RPC (Exchange 2013 ではサポートされなくなりました)、RPC-over-HTTP (Exchange 2007 以降)、または MAPI-over-HTTP (Exchange 2013 以降) を使用して Exchange と通信できます。

    API 自体には、アンマネージド C++ または デルフィ. 。も使用できます 償還 (任意の言語) - その RDO オブジェクト ファミリは拡張 MAPI ラッパーです。拡張 MAPI を使用するには、Outlook または MAPI のスタンドアロン (Exchange) バージョン (延長サポート上、Unicode PST および MSG ファイルはサポートされず、Exchange 2016 にはアクセスできません)。拡張MAPIはサービス内で使用できます。

    API を使用して遊ぶことができます。 アウトルックスパイ または MFCMAPI.

  3. Outlook オブジェクト モデル - Exchange 固有ではありませんが、コードが実行されるマシン上の Outlook で利用可能なすべてのデータにアクセスできます。サービスではご利用いただけません。

  4. Exchangeアクティブ同期. 。Microsoft は、このプロトコルに多額のリソースを投資しなくなりました。

  5. Outlook は以前は CDO 1.21 ライブラリ (拡張 MAPI をラップしている) をインストールしていましたが、Microsoft によって非推奨になったため、更新は受信されなくなりました。

  6. 以前は MAPI33 というサードパーティの .Net MAPI ラッパーがありましたが、現在は開発またはサポートされていません。

  7. WebDAV - 非推奨。

  8. Collaborative Data Objects for Exchange (CDOEX) - 非推奨になりました。

  9. Exchange OLE DB プロバイダー (EXOLEDB) - 非推奨になりました。

ここに、WebDAVを実行するために配置した古いコードをいくつか示します。 Exchange 2003に対して作成されたと思いますが、それ以上覚えていません。役に立つならお気軽に借りてください...

class MailUtil
{
    private CredentialCache creds = new CredentialCache();

    public MailUtil()
    {
        // set up webdav connection to exchange
        this.creds = new CredentialCache();
        this.creds.Add(new Uri("http://mail.domain.com/Exchange/me@domain.com/Inbox/"), "Basic", new NetworkCredential("myUserName", "myPassword", "WINDOWSDOMAIN"));
    }

    /// <summary>
    /// Gets all unread emails in a user's Inbox
    /// </summary>
    /// <returns>A list of unread mail messages</returns>
    public List<model.Mail> GetUnreadMail()
    {
        List<model.Mail> unreadMail = new List<model.Mail>();

        string reqStr =
            @"<?xml version=""1.0""?>
                <g:searchrequest xmlns:g=""DAV:"">
                    <g:sql>
                        SELECT
                            ""urn:schemas:mailheader:from"", ""urn:schemas:httpmail:textdescription""
                        FROM
                            ""http://mail.domain.com/Exchange/me@domain.com/Inbox/"" 
                        WHERE 
                            ""urn:schemas:httpmail:read"" = FALSE 
                            AND ""urn:schemas:httpmail:subject"" = 'tbintg' 
                            AND ""DAV:contentclass"" = 'urn:content-classes:message' 
                        </g:sql>
                </g:searchrequest>";

        byte[] reqBytes = Encoding.UTF8.GetBytes(reqStr);

        // set up web request
        HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://mail.domain.com/Exchange/me@domain.com/Inbox/");
        request.Credentials = this.creds;
        request.Method = "SEARCH";
        request.ContentLength = reqBytes.Length;
        request.ContentType = "text/xml";
        request.Timeout = 300000;

        using (Stream requestStream = request.GetRequestStream())
        {
            try
            {
                requestStream.Write(reqBytes, 0, reqBytes.Length);
            }
            catch
            {
            }
            finally
            {
                requestStream.Close();
            }
        }

        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        using (Stream responseStream = response.GetResponseStream())
        {
            try
            {
                XmlDocument document = new XmlDocument();
                document.Load(responseStream);

                // set up namespaces
                XmlNamespaceManager nsmgr = new XmlNamespaceManager(document.NameTable);
                nsmgr.AddNamespace("a", "DAV:");
                nsmgr.AddNamespace("b", "urn:uuid:c2f41010-65b3-11d1-a29f-00aa00c14882/");
                nsmgr.AddNamespace("c", "xml:");
                nsmgr.AddNamespace("d", "urn:schemas:mailheader:");
                nsmgr.AddNamespace("e", "urn:schemas:httpmail:");

                // Load each response (each mail item) into an object
                XmlNodeList responseNodes = document.GetElementsByTagName("a:response");
                foreach (XmlNode responseNode in responseNodes)
                {
                    // get the <propstat> node that contains valid HTTP responses
                    XmlNode uriNode = responseNode.SelectSingleNode("child::a:href", nsmgr);
                    XmlNode propstatNode = responseNode.SelectSingleNode("descendant::a:propstat[a:status='HTTP/1.1 200 OK']", nsmgr);
                    if (propstatNode != null)
                    {
                        // read properties of this response, and load into a data object
                        XmlNode fromNode = propstatNode.SelectSingleNode("descendant::d:from", nsmgr);
                        XmlNode descNode = propstatNode.SelectSingleNode("descendant::e:textdescription", nsmgr);

                        // make new data object
                        model.Mail mail = new model.Mail();
                        if (uriNode != null)
                            mail.Uri = uriNode.InnerText;
                        if (fromNode != null)
                            mail.From = fromNode.InnerText;
                        if (descNode != null)
                            mail.Body = descNode.InnerText;
                        unreadMail.Add(mail);
                    }
                }

            }
            catch (Exception e)
            {
                string msg = e.Message;
            }
            finally
            {
                responseStream.Close();
            }
        }

        return unreadMail;
    }
}

そしてmodel.Mail:

class Mail
{
    private string uri;
    private string from;
    private string body;

    public string Uri
    {
        get { return this.uri; }
        set { this.uri = value; }
    }

    public string From
    {
        get { return this.from; }
        set { this.from = value; }
    }

    public string Body
    {
        get { return this.body; }
        set { this.body = value; }
    }
}

CodeProject.comで公開されたコードを使用しました。 POP3を使用する場合、POP3は私が見つけた優れたソリューションの1つです。

POPまたはIMAPをサポートするようにExchangeサーバーが構成されている場合、それは簡単な方法です。

別のオプションはWebDAVアクセスです。 ライブラリが利用可能です。これが最良の選択肢かもしれません。

ExchangeにアクセスするためにCOMオブジェクトを使用するオプションがあると思いますが、それがどれほど簡単かはわかりません。

すべては、管理者があなたにアクセス権を与えたいと思っている内容に依存します。

MAPIを使用してメールボックスにアクセスし、必要な情報を取得できる必要があります。残念ながら、私が知っている唯一の.NET MAPIライブラリ(MAPI33)はメンテナンスされていないようです。これは、以前は.NETを介してMAPIにアクセスするための優れた方法でしたが、現在その有効性について話すことはできません。どこで入手できるかについての詳細は、ここにあります: MAPI33.dllのダウンロード場所?

最終的にはRedemptionを使用して解決策を得ました。これらの質問をご覧ください...

1つのオプションは、Outlookを使用することです。 Exchangeサーバーにアクセスし、インターフェイスとしてOutlookを使用するメールマネージャーアプリケーションがあります。汚れていますが、動作します。

サンプルコード:

public Outlook.MAPIFolder getInbox()
        {
            mailSession = new Outlook.Application();
            mailNamespace = mailSession.GetNamespace("MAPI");
            mailNamespace.Logon(mail_username, mail_password, false, true);
            return MailNamespace.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);
        }
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top