8
n8n 中文网amn8n.com

自动化每日 Outlook 日历会议摘要

中级

这是一个Other领域的自动化工作流,包含 8 个节点。主要使用 Set, Code, EmailSend, ScheduleTrigger, MicrosoftOutlook 等节点。 自动化每日 Outlook 日历会议摘要

前置要求
  • 无特殊前置要求,导入即可使用

分类

工作流预览
可视化展示节点连接关系,支持缩放和平移
导出工作流
复制以下 JSON 配置到 n8n 导入,即可使用此工作流
{
  "meta": {
    "instanceId": "7d8066d2f56a07000fe7d753d3eeabf0ecdf68413466f30d10afe0906f058427",
    "templateCredsSetupCompleted": true
  },
  "nodes": [
    {
      "id": "c515d0b8-82f7-47f1-9a15-6867c69a8146",
      "name": "Microsoft Outlook",
      "type": "n8n-nodes-base.microsoftOutlook",
      "position": [
        480,
        0
      ],
      "webhookId": "35e62655-df36-4713-9a85-641dc2dc3fb8",
      "parameters": {
        "filters": {
          "custom": "=start/dateTime ge '{{$json.today}}' and start/dateTime lt '{{$json.tomorrow}}'"
        },
        "resource": "event"
      },
      "credentials": {
        "microsoftOutlookOAuth2Api": {
          "id": "JcYqVJwcwZIhB8oy",
          "name": "Outlook - Jared"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "2c325199-8df6-4c6c-94d2-b54a6d407d27",
      "name": "代码",
      "type": "n8n-nodes-base.code",
      "position": [
        260,
        0
      ],
      "parameters": {
        "jsCode": "const now = new Date();\nconst today = new Date(now.getFullYear(), now.getMonth(), now.getDate());\nconst tomorrow = new Date(today);\ntomorrow.setDate(today.getDate() + 1);\n\nconst isoDate = (d) => d.toISOString().split('.')[0] + 'Z';\n\nreturn [\n  {\n    json: {\n      today: isoDate(today),\n      tomorrow: isoDate(tomorrow),\n    },\n  },\n];\n"
      },
      "typeVersion": 2
    },
    {
      "id": "0b785775-6430-4fee-8603-e6527957560a",
      "name": "获取简报",
      "type": "n8n-nodes-base.set",
      "position": [
        700,
        0
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "b4e4cf3b-eb02-408e-87e4-85eb52677a52",
              "name": "id",
              "type": "string",
              "value": "={{ $json.id }}"
            },
            {
              "id": "2eb21920-5251-4def-8b24-0db84367bb94",
              "name": "subject",
              "type": "string",
              "value": "={{ $json.subject }}"
            },
            {
              "id": "2840ba2a-1c25-494e-89ad-a18d61629855",
              "name": "description",
              "type": "string",
              "value": "={{ $json.bodyPreview }}"
            },
            {
              "id": "df847006-a390-40cc-a51e-368a213ffb32",
              "name": "meeting_start",
              "type": "string",
              "value": "={{ $json.start.dateTime }}"
            },
            {
              "id": "82e613bc-8de5-4f49-bebe-fbe34f3a1ea8",
              "name": "meeting_end",
              "type": "string",
              "value": "={{ $json.end.dateTime }}"
            },
            {
              "id": "6de1d0ea-48f6-4b95-b810-720dd853b301",
              "name": "attendees",
              "type": "array",
              "value": "={{ $json.attendees }}"
            },
            {
              "id": "3fca7af4-1e83-4e50-b42b-db95e5dba255",
              "name": "meeting_organizer",
              "type": "string",
              "value": "={{ $json.organizer.emailAddress.name }}"
            },
            {
              "id": "5eaa74ef-595d-4a5b-9c37-bdf009cd3b5e",
              "name": "meeting_organizer_email",
              "type": "string",
              "value": "={{ $json.organizer.emailAddress.address }}"
            },
            {
              "id": "d26a7fc5-9782-4237-af89-7afcb42c8bcc",
              "name": "meeting_link",
              "type": "string",
              "value": "={{ $json.webLink }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "9257dcb7-0605-4837-944b-97670cf53317",
      "name": "发送邮件",
      "type": "n8n-nodes-base.emailSend",
      "position": [
        1140,
        0
      ],
      "webhookId": "0b3eae88-6102-4da2-985e-c681e7d5005c",
      "parameters": {
        "html": "={{ $json.html }}",
        "options": {
          "appendAttribution": false
        },
        "subject": "={{ $json.subject }}",
        "toEmail": "akhil.nueve@gmail.com",
        "fromEmail": "notification@nuevesolutions.in"
      },
      "credentials": {
        "smtp": {
          "id": "vCexcphurglwGBfk",
          "name": "SMTP account"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "571a1e32-3d86-4a2f-af35-439557423283",
      "name": "定时触发器",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        40,
        0
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "triggerAtHour": 8
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "649833a8-81e0-4bd2-ad8b-5982ce32fe11",
      "name": "生成 HTML",
      "type": "n8n-nodes-base.code",
      "position": [
        920,
        0
      ],
      "parameters": {
        "jsCode": "const data = $input.all().map(item => item.json);\n\nfunction generateMeetingReminderEmail(meetings) {\n  const escapeHtml = (unsafe) =>\n    unsafe\n      .replace(/&/g, \"&amp;\")\n      .replace(/</g, \"&lt;\")\n      .replace(/>/g, \"&gt;\")\n      .replace(/\"/g, \"&quot;\")\n      .replace(/'/g, \"&#039;\");\n\n  const meetingCards = meetings.map(meeting => {\n    const start = new Date(meeting.meeting_start);\n    const end = new Date(meeting.meeting_end);\n\n    const options = { year: 'numeric', month: 'short', day: 'numeric', hour: 'numeric', minute: '2-digit' };\n    const timeString = `${start.toLocaleString('en-US', options)} – ${end.toLocaleTimeString('en-US', { hour: 'numeric', minute: '2-digit' })}`;\n\n    const requiredAttendees = meeting.attendees\n      .filter(a => a.type === 'required')\n      .map(a => escapeHtml(a.emailAddress.name))\n      .join(', ');\n\n    const optionalAttendees = meeting.attendees\n      .filter(a => a.type === 'optional')\n      .map(a => escapeHtml(a.emailAddress.name))\n      .join(', ');\n\n    return `\n      <table width=\"100%\" cellspacing=\"0\" cellpadding=\"0\" style=\"margin-bottom: 20px;\">\n        <tr>\n          <td align=\"center\" style=\"padding: 0 10px;\">\n            <table cellpadding=\"20\" cellspacing=\"0\" width=\"100%\" style=\"max-width: 800px; background-color: #ffffff; border: 1px solid #ddd; border-collapse: collapse;\">\n              <tr>\n                <td style=\"font-family: Arial, sans-serif; color: #333333; font-size: 14px;\">\n                  <h2 style=\"margin: 0 0 10px; font-size: 18px; color: #2c3e50;\">${escapeHtml(meeting.subject)}</h2>\n                  <p><strong>Time:</strong> ${timeString}</p>\n                  <p><strong>Organizer:</strong> ${escapeHtml(meeting.meeting_organizer)} (${escapeHtml(meeting.meeting_organizer_email)})</p>\n                  <p><strong>Description:</strong> ${escapeHtml(meeting.description || 'No description provided.')}</p>\n                  <p><strong>Attendees:</strong><br>${requiredAttendees || 'None'}<br>\n                  ${optionalAttendees ? `<em>Optional:</em> ${optionalAttendees}` : ''}</p>\n                  <p>\n                    <a href=\"${meeting.meeting_link}\" style=\"display: inline-block; padding: 10px 15px; background-color: #0078d4; color: #ffffff; text-decoration: none; border-radius: 4px;\">View in Calendar</a>\n                  </p>\n                </td>\n              </tr>\n            </table>\n          </td>\n        </tr>\n      </table>\n    `;\n  }).join('\\n');\n\n  return `\n    <!DOCTYPE html>\n    <html>\n      <head>\n        <meta charset=\"UTF-8\">\n        <title>Today's Meetings</title>\n      </head>\n      <body style=\"margin: 0; padding: 0; font-family: Arial, sans-serif; background-color: #f4f4f4; color: #333;\">\n        <table width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"padding: 20px;\">\n          <tr>\n            <td align=\"center\">\n              <h1 style=\"font-size: 24px;\">📅 Your Meetings Today</h1>\n            </td>\n          </tr>\n          <tr>\n            <td>\n              ${meetingCards}\n            </td>\n          </tr>\n        </table>\n      </body>\n    </html>\n  `;\n}\n\nconst htmlContent = generateMeetingReminderEmail(data);\n\n// Return HTML + Subject for email node\nreturn [\n  {\n    json: {\n      subject: \"🗓️ Your Meetings Today – \" + (new Date()).toLocaleDateString('en-US', { weekday: 'long', month: 'short', day: 'numeric' }),\n      html: htmlContent\n    }\n  }\n];\n"
      },
      "typeVersion": 2
    },
    {
      "id": "ca74ba38-8661-45d1-9524-5ed4e978f6a2",
      "name": "便签",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1060,
        160
      ],
      "parameters": {
        "width": 280,
        "height": 120,
        "content": "## 更新邮件详情"
      },
      "typeVersion": 1
    },
    {
      "id": "430f51b0-af72-4604-a00e-0d76bb45659c",
      "name": "便签1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -20,
        -180
      ],
      "parameters": {
        "content": "## 更新时间"
      },
      "typeVersion": 1
    }
  ],
  "pinData": {},
  "connections": {
    "Code": {
      "main": [
        [
          {
            "node": "Microsoft Outlook",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Edit Fields": {
      "main": [
        [
          {
            "node": "Generate HTML",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate HTML": {
      "main": [
        [
          {
            "node": "Send Email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Schedule Trigger": {
      "main": [
        [
          {
            "node": "Code",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Microsoft Outlook": {
      "main": [
        [
          {
            "node": "Edit Fields",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
常见问题

如何使用这个工作流?

复制上方的 JSON 配置代码,在您的 n8n 实例中创建新工作流并选择「从 JSON 导入」,粘贴配置后根据需要修改凭证设置即可。

这个工作流适合什么场景?

中级 - 其他

需要付费吗?

本工作流完全免费,您可以直接导入使用。但请注意,工作流中使用的第三方服务(如 OpenAI API)可能需要您自行付费。

工作流信息
难度等级
中级
节点数量8
分类1
节点类型6
难度说明

适合有一定经验的用户,包含 6-15 个节点的中等复杂度工作流

作者
Akhil Varma Gadiraju

Akhil Varma Gadiraju

@akhilv7

I'm a full stack developer passionate about building intelligent, scalable solutions that automate workflows and enhance productivity. I love working at the intersection of AI, APIs, and automation—using tools like n8n to streamline processes, integrate data, and unlock smarter decision-making. Whether it's crafting custom backend services or designing intuitive frontends, I’m always exploring ways to build more with less manual effort.

外部链接
在 n8n.io 查看

分享此工作流