Saturday 14 May 2016

Рассылка почтовых сообщений с помощью JavaScript REST API в SharePoint

Выполнить передачу почтового сообщения с помощью метода SendEmail на стороне клиента легко. В сети имеются масса примеров, о том как это сделать.
О проблемах исполнения этого метода тоже немало написано. Например частой ошибкой является - недействительный адрес электронной почты пользователя SharePoint. Даже, если достоверно известно, что пользователь имеет подтвержденный электронный адрес и у него достаточно высокий уровень доступа к материалам сайта, при отправке почты ему могут возникнуть проблемы. 
Лично я обнаружив, что нельзя довериться способу передачи почты с помощью методов sharepoint rest api, решил подстраховаться и написать в рамках собственного web service метод передачи почты пользователю SharePoint.
Конечно, если в вашей ферме SharePoint не работает собственное решение методов web service, то писать и развертывать его в ферме  только лишь для указанных целей, не стоит :). У меня же уже имелся в ферме собственный web service, в рамках которого выполнялись несколько десятков методов, поэтому добавить туда еще один метод - не проблема.

Итак, что я сделал:

sendEmailфункция javascript. она выполняет простую работу - передает почтовое сообщение пользователю (или группе пользователям). Если возникают проблемы, то функция обращается к моему методу на сервере (обратите внимание на функцию GetReturnAjax). Там, за "кулисами" работает метод SetItemSPSendEmailItem. Как правило с ним проблем не бывает :).

function sendEmail(from, to, body, subject, containerId, gridId, urlPanel, mparam) {        
    var urlTemplate = _spPageContextInfo.webAbsoluteUrl + 
"/_api/SP.Utilities.Utility.SendEmail";
    var container = $('#' + containerId);
    $.ajax({
        contentType: 'application/json',
        url: urlTemplate,
        type: "POST",
        data: JSON.stringify({
            'properties': {
                '__metadata': { 'type''SP.Utilities.EmailProperties' },
                'From': from,
                'To': { 'results': [to] },
                'Body': body,
                'Subject': subject
            }
        }),
        headers: {
            "Accept""application/json;odata=verbose",
            "content-type""application/json;odata=verbose",
            "X-RequestDigest": $("#__REQUESTDIGEST").val()
        },
        beforeSend: function () {
            if (container.length) {
                container.prepend($('<p />').addClass('loading-aj-dialog'))
            }
        },
        success: function (data) {
            container.find('p.loading-aj-dialog').remove();
            GetReturnAjax(urlPanel, JSON.stringify(mparam), false,
                function (data) {
                    container.find('p.loading-aj-dialog').remove();
                    alert(subject + " передано успешно.");
            }, containerId);
        },
        error: function (err) {
            container.find('p.loading-aj-dialog').remove();
            console.log(JSON.stringify(err));
            var mparam2 = { "subject": subject,"body": body, "to": to };
            //если ошибка, то пытаемся передать сообщение через собственную службу
            GetReturnAjax(urlPanel, JSON.stringify(mparam2), false,
                function (data) {
                    container.find('p.loading-aj-dialog').remove();
                    alert(subject + " передано успешно.");
                }, containerId);
        }
    });
}
Метод на сервере на тот случай, если на клиенте будут проблемы.        
        [WebMethod]
        [System.Web.Script.Services.ScriptMethod ( UseHttpGet = false, ResponseFormat = ResponseFormat.Json )]
        public m_message SetItemSPSendEmailItem ( string subject,
            string body, string to )
        {
            m_message retur = new m_message { title = "", type = 2 };
            string error = "";
            using ( SPSite site = new SPSite ( this.GetUrlSite ) )
            {
                using ( SPWeb web = site.OpenWeb ( ) )
                {
                    try
                    {                                                
                        if ( !string.IsNullOrEmpty ( subject ) && 
                             !string.IsNullOrEmpty ( body ) && 
                             !string.IsNullOrEmpty ( to ) )
                        {
                            SPUtility.SendEmail ( web, truefalse, to, subject, body );
                        }
                    }
                    catch ( Exception ex )
                    {
                        error = ex.ToString ( );
                        retur.title = error;
                    }
                    finally
                    {
                        if ( web != null )
                            web.Dispose ( );
                    }
                }
            }
            return retur;
        }
Ну, вот, на сегодня, пожалуй все.

No comments:

Post a Comment