Проблемы с получением вложения электронной почты от Exchange
При попытке использовать HttpWebRequest.GetResponse () с помощью метода GET для получения вложения электронной почты с биржи появляется сообщение об ошибке "Удаленный сервер возвратил ошибку: (501) Не реализовано". Я пытался изменить HttpVersion и не думаю, что это проблема с разрешениями, так как я могу искать в папке "Входящие".
Я знаю, что мои учетные данные верны, так как они используются для получения HREF с использованием HttpWebRequest.Method = Поиск по входящей почте ( https://mail.mailserver.com/exchange/testemailaccount/Inbox/).
HREF = https://mail.mailserver.com/exchange/testemailaccount/Inbox/testemail.EML/attachment.csv
Образец кода:
HttpWebRequest req = (System.Net.HttpWebRequest) HttpWebRequest.CreateHREF);
req.Method = "GET";
req.Credentials = this.mCredentialCache;
string data = string.Empty;
using (WebResponse resp = req.GetResponse())
{
Encoding enc = Encoding.Default;
if (resp == null)
{
throw new Exception("Response contains no information.");
}
using (StreamReader sr = new StreamReader(resp.GetResponseStream(), Encoding.ASCII))
{
data = sr.ReadToEnd();
}
}
2 ответа
Похоже, вы используете WebDAV против Exchange 2007. По умолчанию в Exchange 2007 WebDAV не включен. Так что вы можете:
1) Включите WebDAV на вашем сервере Exchange 2007.
2) Переключитесь на использование веб-служб Exchange.
Я бы порекомендовал вариант 2, так как вы используете C#, поскольку существует API-интерфейс Managed EWS, который значительно упрощает задачу такого рода, чем использование WebDAV. Это также позволяет вам в конечном итоге ориентироваться на Exchange 2010, где WebDAV был полностью удален.
Есть 2 возможных решения:
Попробуйте использовать протокол POP3 вместо HTTP. Вы можете попробовать реализовать это самостоятельно (см., Например, "Как использовать POP3 в C#") или использовать готовую библиотеку POP3 с поддержкой SSL (например, POP3Client) или взглянуть на этот вопрос.
Также ваша ошибка, вероятно, из-за того, что не обрабатывает соединения https. Попробуйте добавить этот код:
ServicePointManager.CertificatePolicy = new AcceptAllCertificatePolicy ();
Вот реализация класса:
internal class AcceptAllCertificatePolicy : ICertificatePolicy
{
public AcceptAllCertificatePolicy()
{
}
public bool CheckValidationResult(ServicePoint sPoint, X509Certificate cert,
WebRequest wRequest, int certProb)
{
//Allways accept
return true;
}
}