如何遍历数组元素并执行AJAX?结合现有SendEmail函数实现
解决遍历数组执行AJAX发送邮件的问题
我先帮你补全现有代码里未完成的部分,再整合遍历逻辑。核心思路是先从PeoplePicker中提取所有收件人的邮箱地址形成数组,再遍历这个数组,给每个收件人单独发起AJAX请求调用SharePoint的邮件API。
步骤1:完善收件人数组的提取
你的代码里emailSpan的选择器没写完,这里帮你补全从PeoplePicker中提取所有选中用户邮箱的逻辑:
// 从PeoplePicker提取收件人邮箱数组 var emailSpan = $(_PeoplePicker).find('.sp-peoplepicker-userSpan'); var recipientEmails = []; emailSpan.each(function() { // SharePoint PeoplePicker的用户span标题格式通常是「用户名 <邮箱>」,提取<>内的邮箱 var userInfo = $(this).attr('title'); var email = userInfo.match(/<(.*?)>/)[1]; recipientEmails.push(email); });
步骤2:遍历数组执行AJAX请求
接下来遍历recipientEmails数组,对每个邮箱发起AJAX请求。注意SharePoint的SendEmail API有固定的请求格式,要确保请求头和请求体正确:
function sendEmail() { var appweburl = _spPageContextInfo.webAbsoluteUrl; var urlTemplate = appweburl + "/_api/SP.Utilities.Utility.SendEmail"; var fieldName = "Notificar a"; var body = "Descripción"; var _body = $("textarea[title^='" + body + "']").val(); // 获取textarea里的邮件内容 var fullURL = window.location.href var url = new URL(fullURL ); var ID = url.searchParams.get("ID"); var _PeoplePicker = $("div[title='" + fieldName + "']"); // 1. 提取收件人邮箱数组 var emailSpan = $(_PeoplePicker).find('.sp-peoplepicker-userSpan'); var recipientEmails = []; emailSpan.each(function() { var userInfo = $(this).attr('title'); var email = userInfo.match(/<(.*?)>/)[1]; recipientEmails.push(email); }); // 2. 遍历数组,逐个发送邮件 recipientEmails.forEach(function(recipient) { // 构建符合SharePoint要求的邮件请求体 var emailPayload = { 'properties': { '__metadata': { 'type': 'SP.Utilities.EmailProperties' }, 'To': { 'results': [recipient] }, // 单个收件人也需保持数组格式 'Subject': `通知:项目ID ${ID}`, // 可自定义邮件主题 'Body': _body } }; // 发起AJAX请求 $.ajax({ url: urlTemplate, type: "POST", contentType: "application/json;odata=verbose", data: JSON.stringify(emailPayload), headers: { "Accept": "application/json;odata=verbose", "X-RequestDigest": $("#__REQUESTDIGEST").val() // SharePoint POST请求必需的验证头 }, success: function(data) { console.log(`邮件已成功发送至 ${recipient}`); // 可在此添加成功提示,比如页面弹出通知 }, error: function(error) { console.error(`发送邮件至 ${recipient} 失败:`, error); // 可在此添加错误提示逻辑 } }); }); }
关键注意点
- 请求Digest:SharePoint的POST请求必须携带
X-RequestDigest头,这里通过页面上的#__REQUESTDIGEST元素获取,确保请求合法。 - 邮件格式:
SP.Utilities.EmailProperties的结构不能错,To字段必须是包含results数组的对象,哪怕只有一个收件人也要遵守这个格式。 - 遍历顺序:上面用
forEach是并行发送请求,如果需要按顺序发送(前一封成功再发下一封),可以改用异步函数+await的方式:
// 异步函数实现顺序发送 async function sendEmail() { // ... 前面的变量和收件人提取逻辑不变 ... for (const recipient of recipientEmails) { try { const emailPayload = { 'properties': { '__metadata': { 'type': 'SP.Utilities.EmailProperties' }, 'To': { 'results': [recipient] }, 'Subject': `通知:项目ID ${ID}`, 'Body': _body } }; const response = await $.ajax({ url: urlTemplate, type: "POST", contentType: "application/json;odata=verbose", data: JSON.stringify(emailPayload), headers: { "Accept": "application/json;odata=verbose", "X-RequestDigest": $("#__REQUESTDIGEST").val() } }); console.log(`邮件已成功发送至 ${recipient}`); } catch (error) { console.error(`发送邮件至 ${recipient} 失败:`, error); } } }
这样就能实现你需要的「遍历数组中的每个元素并执行AJAX请求」的需求,你可以根据实际场景调整邮件主题、内容或提示逻辑。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

