Выполнить передачу почтового сообщения с помощью метода 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, true, false, to, subject, body ); } } catch ( Exception ex ) { error = ex.ToString ( );retur.title = error; } finally { if ( web != null ) web.Dispose ( ); } } } return retur; }Ну, вот, на сегодня, пожалуй все.