вторник, 19 марта 2013 г.

SharePoint SPUtility - особенности отправки почты

Такая простая на первый взгляд задача, как отправка почты, может привнести пару новых багов в вашем проекте :) Речь пойдет об одном из стандартных подходов в SharePoint 2010 - SPUtility.SendEmail. Описание этого метода можно легко найти на MSDN. Но не надейтесь увидеть там много букв, оно довольно таки скудное. Начнем с того, что работает, как ожидается.
SendEmail(SPWeb, Boolean, Boolean, String, String, String)
SendEmail(SPWeb, Boolean, Boolean, String, String, String, Boolean)
Проблем и опасений не вызывают. Почта отлично отсылается, если в Central Administration (далее CA) указаны корректные настройки.
Но вот интерес вызывают как раз первые две реализации метода:
SendEmail(SPWeb, StringDictionary, String)
SendEmail(SPWeb, StringDictionary, String, Boolean)
Вторым параметром оба метода принимают словарь из строк, чтобы добавить в отправляемое письмо нужный набор header-ов. Накидаем простенький пример:
    var headers = new StringDictionary
    {
       { "to", "samplemail@sample.com" },
       { "subject", "Test subject" },
       { "content-type", "text/html" }
    };

    SPUtility.SendEmail(web, headers, bodyText);
И тут выясняется некая особенность. Если мы передаем свой набор header-ов, то выбор email-a, с которого нужно эту самую почту отправить - работает несколько по другому. Если в контексте указанного web-а, у пользователя в настройках указан email, то почта попытается уйти именно с email-а пользователя. Если же такой email не указан, то берется адрес, указанный в CA. Решить эту ситуацию можно довольно просто - необходимо явно добавлять в словарь header "from", где и указывать необходимый адрес отправителя. В данном случае - это адрес из CA.
    var headers = new StringDictionary
    {
       { "to", "samplemail@sample.com" },
       { "from", web.Site.WebApplication.OutboundMailSenderAddress },
       { "subject", "Test subject" },
       { "content-type", "text/html" }
    };
Теперь почта уходит от корректного отправителя.

Комментариев нет:

Отправить комментарий