You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何遍历数组元素并执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:12:00