1

我正在使用 webDAV 和 .Net 2.0 在运行 Exchange Server 2003 的服务器上收集有关电子邮件帐户的信息。我可以访问如下所示的 uri:

http://my.mailserver.com/exchange/user/Inbox/someImportantEmail.EML

我试图像这样复制文件:

Dim uri As New Uri(uriNode.InnerText)
If uri.IsFile() Then
    Dim fn As String = Path.GetFileName(uri.LocalPath)
    System.IO.File.Copy(uri.LocalPath, "c:\" & fn)
End If

但是 uri.IsFile() 总是返回 false。我注意到的另一件事是 uri.Local 路径是

/exchange/user/Inbox/someImportantEmail.EML

我这部分的问题?如何将 .eml 文件从 Exchange 服务器复制到本地硬盘?

编辑:
我已经实施了 AnthonyWJones 的建议

    Dim cred As New System.Net.CredentialCache
    cred.Add(uri, "BASIC", New System.Net.NetworkCredential(_username, _password, _domain))
    Dim wc As New WebClient()
    wc.Credentials = cred
    wc.DownloadFile(uri, "c:\testEML.EML")

虽然这确实在我的 c 驱动器上创建了 testEML.EML 文件...这里是 EML 文件的内容:

<!--版权所有 (c) 2000-2003 Microsoft Corporation。保留所有权利。-->
<!--CURRENT FILE== "NON-IE5" "NON-WIN32" 框架集 -->
<!--当前模板 == 框架集.00000000 -->
<HTML>
<头部>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=utf-8">
<TITLE>Microsoft Outlook Web Access</TITLE>
<BASE href="http://my.mailserver.com/exchange/user/">
</头>
<SCRIPT 语言="JavaScript">
var g_iNewWindowWidth = 700;
变量 g_iNewWindowHeight = 500;
var g_fWarnOnLogOff=false;
函数 WarnOnLogOff()
{
如果(g_fWarnOnLogOff)
alert("为帮助保护您的邮箱免受未经授权的访问,请在使用完 Outlook Web Access 后关闭所有浏览器窗口。");
}
</脚本>
<FRAMESET OnUnload="WarnOnLogOff()" framespacing="3" cols="190,*"><FRAME bordercolor="#3D5FA3" name="navbar" title="Navigation" src="Inbox/?Cmd=navbar" marginheight="0" marginwidth="0" scrolling="auto" border="1"><FRAME name="viewer" title="Contents" src="Inbox/FW:.EML?Cmd=open" scrolling="自动">
<框架>
<BODY><P>此页面使用框架,但您的浏览器不支持。</P></BODY>
</框架>
</帧集>
</HTML>

未经授权的访问是怎么回事?

4

2 回答 2

1

尝试:-

 Dim webClient As New WebClient()
 webClient.UseDefaultCredentials = True
 webClient.DownloadFile(uri, fn)

您不能使用标准文件 IO 来复制 http 资源

于 2009-07-28T14:47:32.397 回答
1

这是我最终得到的代码,它完全符合我的需要。

    Dim msgPath As String = message.Path
    Dim msgURI As String = message.URI
    Dim msgID As String = message.ID

    MyCredentialCache = New System.Net.CredentialCache()
    MyCredentialCache.Add(New System.Uri(_inboxPath), "BASIC", New System.Net.NetworkCredential(_username, _password, _domain))

    Dim request As WebRequest = WebRequest.Create(msgURI)
    request.Credentials = MyCredentialCache
    request.ContentType = "text/xml"
    request.Headers.Add("Translate", "f")
    Dim response As HttpWebResponse = CType(request.GetResponse(), HttpWebResponse)

    Dim file As FileStream = New FileStream(msgPath, FileMode.CreateNew)
    Dim stream As Stream = response.GetResponseStream()

    Dim buffer() As Byte = New Byte(4096) {}
    Dim len As Integer = stream.Read(buffer, 0, buffer.Length)

    While (len > 0)
        file.Write(buffer, 0, len)
        len = stream.Read(buffer, 0, buffer.Length)
    End While

    file.Close()
    stream.Close()
于 2009-08-03T18:16:33.593 回答