11 июля 2012 г.

Посылаем сообщения через Exchange с помощью C#

Понадобилось мне тут намедни сообщение отправлять автоматически. Долго ломал голову как это организовать с помощью установленного Microsoft Outlook из офисного пакета, но кроме как использовать его COM ничего не придумал. Но это не удобно же. В итоге, долго ковыряясь в просторах тырнета в поисках решения этой проблемы наткнулся на MSDN, где рассказывалось про такой замечательный Exchange Web Services Managed API SDK. Это просто кладезь для работы с Exchange'ем. Пока только начал его рассматривать, да и многое от него не требуется, но отправить с использованием данного API сообщение (даже с вложением) просто как раз-два-три.

Вот простой консольный проект, демонстрирующий эти шаги. Для начала скачиваем и устанавливаем данный API SDK (x86, x64). Потом добавляем ссылку к проекту и подключаем. А дальше, с помощью нескольких строк пишем код, отправляющий нам пресловутый "Hello World!".
using System;
using System.IO;
using System.Net;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using Microsoft.Exchange.WebServices.Data;

namespace ExchangeMail
{
 class Program

 {
  public static void Main(string[] args)

  {
   String Mail_, Subject_, Body_;
   Mail_ = "Lastname.Firstname@yourmailserver.ru";
   Subject_ = "Hello World";
   Body_ = "Hello World, I'm here";

   ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2007_SP1);

   ServicePointManager.ServerCertificateValidationCallback += RemoteCertificateValidationHandler;

   service.Url = new Uri("https://YourExchangeServer/EWS/Exchange.asmx");

   EmailMessage message = new EmailMessage(service);
   message.Subject = Subject_;
   message.Body = Body_;
   message.ToRecipients.Add(Mail_);
   message.SendAndSaveCopy();
  }

  private static bool RemoteCertificateValidationHandler(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
  {
   return true; //Игнорировать проверку и продолжить
  }
 }
}
RemoteCertificateValidationHandler необходим для того, чтобы игнорировать проверку сертификата, который программа пытается запросить у Exchange. Данный метод был найден на просторах интернета, в MSDN я об этом ничего не нашёл. Но если Вы хотите, скачайте и установите сертификат вручную.

2 комментария:

  1. а зачем так мудрить?
    ну разве что себе копию положить (AndSaveCopy)

    а тут и outlook не нужен:

    using System.Net.Mail;
    using System.Net;

    SmtpClient Smtp = new SmtpClient("192.168.1.1", 25);
    // Smtp.Credentials = new NetworkCredential("xxx@mail.ru", "password");
    // в АД не нужно Credentials
    //Smtp.EnableSsl = false; // без сертификатов
    MailMessage Message = new MailMessage();
    Message.From = new MailAddress("Вася пупкин");// от кого
    Message.To.Add(new MailAddress(masha@mail.ru)); // кому
    // Message.To.Add(new MailAddress(masha2@mail.ru)); // еще кому-нибудь
    Message.IsBodyHtml = true;// будем рисовать HTML
    Message.Body =".hr."+ Text+".br..hr.Не отвечайте на это письмо указанный обратный адрес не существует!!";
    Smtp.Send(Message); //отправка

    ОтветитьУдалить
    Ответы
    1. Да, спасибо за код, но... Целью было отправить сообщение с нашего почтового сервера (у получателя должен засветиться необходимый адрес отправителя), у отправителя действительно должна остаться копия отправленного сообщения (будет возможность доказать, что он таки отправлял), также у пользователя есть возможность получить с сервера адреса тех, кто прочитал сообщение (в Outlook это называется "Отслеживание", кажется). А так да, если бы мне нужно было просто отправить сообщение, то я так бы и поступил))

      Да и вроде ничего мудрёного я не сделал. Код довольно простой и понятный. Ну разве что немного больше, чем Ваш))

      Удалить

Уважаемый комментатор, пишите грамотно.
С благодарностью, автор блога.