Hướng dẫn tự động gửi lời chúc mừng sinh nhật nhân viên trên Microsoft 365 với n8n

Nguyen Thai Trong 29/10/2026 8 phút đọc

 

Workflow đọc danh sách nhân viên từ Excel (OneDrive) lúc 08:00 mỗi ngày, nếu có người sinh nhật sẽ tự động gửi email chúc mừng qua Outlook và đăng lời chúc lên kênh Microsoft Teams.

📢 Lưu ý: Bài viết mang tính chất tham khảo. Quý Khách có thể tùy chỉnh hoặc bổ sung thêm các tính năng theo nhu cầu sử dụng.

1. Import workflow vào n8n

Sao chép đoạn JSON bên dưới → mở n8n → Create Workflow → nhấn Ctrl + V trên vùng làm việc (hoặc lưu thành file .json và chọn … → Import from File).

Quý Khách có thể tham khảo đoạn mã JSON dưới đây. Quý Khách có thể tùy chỉnh hoặc bổ sung thêm các tính năng theo nhu cầu sử dụng.

{
  "name": "Tự động chúc mừng sinh nhật nhân viên",
  "nodes": [
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "triggerAtHour": 8
            }
          ]
        }
      },
      "id": "f96e8f78-f1d4-4e4d-89dc-9d26ed871069",
      "name": "Schedule - 08:00 mỗi ngày",
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.2,
      "position": [
        -1024,
        128
      ]
    },
    {
      "parameters": {
        "resource": "worksheet",
        "operation": "readRows",
        "workbook": {
          "__rl": true,
          "value": "<YOUR_EXCEL_WORKBOOK_ID>",
          "mode": "list",
          "cachedResultName": "<TEN_FILE_EXCEL>"
        },
        "worksheet": {
          "__rl": true,
          "value": "<YOUR_WORKSHEET_ID>",
          "mode": "list",
          "cachedResultName": "Employees"
        },
        "options": {}
      },
      "id": "6fc88970-e1d7-4035-b909-5c94221edf38",
      "name": "Excel - Danh sách nhân viên",
      "type": "n8n-nodes-base.microsoftExcel",
      "typeVersion": 2.2,
      "position": [
        -768,
        128
      ],
      "credentials": {
        "microsoftExcelOAuth2Api": {
          "id": "<YOUR_EXCEL_CREDENTIAL_ID>",
          "name": "Microsoft Excel account"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "const now = new Date();\nconst todayDay = now.getDate();\nconst todayMonth = now.getMonth() + 1;\n\nreturn items.filter(item => {\n  const value = item.json['Ngày sinh'] ?? item.json['birthDate'] ?? item.json['BirthDate'];\n  if (!value) return false;\n\n  const birthDate = new Date(value);\n  if (Number.isNaN(birthDate.getTime())) return false;\n\n  return birthDate.getDate() === todayDay &&\n         birthDate.getMonth() + 1 === todayMonth;\n}).map(item => {\n  const name = item.json['Họ tên'] ?? item.json['Ho ten'] ?? item.json['name'] ?? item.json['Name'] ?? 'Nhân viên';\n  const email = item.json['Email'] ?? item.json['email'] ?? item.json['Email Address'] ?? '';\n  const department = item.json['Phòng ban'] ?? item.json['Phong ban'] ?? item.json['department'] ?? '';\n\n  return {\n    json: {\n      ...item.json,\n      employeeName: name,\n      employeeEmail: email,\n      department\n    }\n  };\n});"
      },
      "id": "390281a1-5b3e-417a-932f-3363a52638fb",
      "name": "Kiểm tra sinh nhật hôm nay",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -496,
        128
      ]
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 2
          },
          "conditions": [
            {
              "id": "has-name",
              "leftValue": "={{ $json.employeeName }}",
              "rightValue": "",
              "operator": {
                "type": "string",
                "operation": "notEmpty"
              }
            },
            {
              "id": "has-email",
              "leftValue": "={{ $json.employeeEmail }}",
              "rightValue": "",
              "operator": {
                "type": "string",
                "operation": "notEmpty"
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "id": "0a7fbc7b-48a1-4215-8083-1b87d42d0416",
      "name": "Có nhân viên sinh nhật?",
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.2,
      "position": [
        -256,
        128
      ]
    },
    {
      "parameters": {
        "toRecipients": "={{ $json.employeeEmail }}",
        "subject": "=🎂 Chúc mừng sinh nhật {{ $json.employeeName }}!",
        "bodyContent": "=🎂🎉 <b>CHÚC MỪNG SINH NHẬT!</b> 🎉🎂<br><br>Xin chào <b>{{ $json.employeeName }}</b>,<br><br>Hôm nay là ngày đặc biệt của bạn!<br><br>🎈 Chúc bạn tuổi mới thật nhiều sức khỏe, niềm vui và thành công.<br><br>Chúc bạn luôn giữ được năng lượng tích cực và có thật nhiều thành công trong công việc cũng như cuộc sống.<br><br>🥳 <b>Chúc mừng sinh nhật!</b><br><br>Trân trọng,<br>Phòng Nhân sự",
        "additionalFields": {
          "bodyContentType": "html",
          "saveToSentItems": true
        }
      },
      "id": "255739db-aa25-4ce5-959f-238899e29fad",
      "name": "Outlook - Gửi Email chúc mừng",
      "type": "n8n-nodes-base.microsoftOutlook",
      "typeVersion": 2,
      "position": [
        0,
        0
      ],
      "webhookId": "<YOUR_WEBHOOK_ID>",
      "credentials": {
        "microsoftOutlookOAuth2Api": {
          "id": "<YOUR_OUTLOOK_CREDENTIAL_ID>",
          "name": "Microsoft Outlook account"
        }
      }
    },
    {
      "parameters": {
        "resource": "channelMessage",
        "teamId": {
          "__rl": true,
          "value": "<YOUR_TEAM_ID>",
          "mode": "list",
          "cachedResultName": "<TEN_TEAM>"
        },
        "channelId": {
          "__rl": true,
          "value": "<YOUR_CHANNEL_ID>",
          "mode": "list",
          "cachedResultName": "<TEN_CHANNEL>"
        },
        "contentType": "html",
        "message": "=🎂🎉 <b>CHÚC MỪNG SINH NHẬT!</b> 🎉🎂<br><br>Hôm nay là sinh nhật của <b>{{ $json.employeeName }}</b>!<br><br>🏢 Phòng ban: <b>{{ $json.department || 'Chưa cập nhật' }}</b><br><br>🎈 Chúc bạn tuổi mới thật nhiều sức khỏe, niềm vui và thành công.<br><br>🥳 <b>Chúc mừng sinh nhật!</b>",
        "options": {
          "includeLinkToWorkflow": false
        }
      },
      "id": "65b048a8-30f6-4a27-a4c8-802feda4cfd5",
      "name": "Teams - Chúc mừng sinh nhật",
      "type": "n8n-nodes-base.microsoftTeams",
      "typeVersion": 2,
      "position": [
        0,
        240
      ],
      "webhookId": "<YOUR_WEBHOOK_ID>",
      "credentials": {
        "microsoftTeamsOAuth2Api": {
          "id": "<YOUR_TEAMS_CREDENTIAL_ID>",
          "name": "Microsoft Teams account"
        }
      }
    }
  ],
  "pinData": {},
  "connections": {
    "Schedule - 08:00 mỗi ngày": {
      "main": [
        [
          {
            "node": "Excel - Danh sách nhân viên",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Excel - Danh sách nhân viên": {
      "main": [
        [
          {
            "node": "Kiểm tra sinh nhật hôm nay",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Kiểm tra sinh nhật hôm nay": {
      "main": [
        [
          {
            "node": "Có nhân viên sinh nhật?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Có nhân viên sinh nhật?": {
      "main": [
        [
          {
            "node": "Outlook - Gửi Email chúc mừng",
            "type": "main",
            "index": 0
          },
          {
            "node": "Teams - Chúc mừng sinh nhật",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1",
    "binaryMode": "separate",
    "availableInMCP": false
  },
  "versionId": "<YOUR_VERSION_ID>",
  "meta": {
    "templateCredsSetupCompleted": true,
    "instanceId": "<YOUR_INSTANCE_ID>"
  },
  "id": "<YOUR_WORKFLOW_ID>",
  "tags": []
}

Hình 1: Tổng quan 6 node của workflow trong n8n Hình 1: Tổng quan 6 node của workflow trong n8n

2. Chuẩn bị file Excel

Tạo file Excel trên OneDrive, sheet tên Employees, dòng đầu có đúng các cột sau:

Họ tên Email Ngày sinh Phòng ban
Nguyễn Văn A nguyenvana@congty.vn 1995-10-29 Kỹ thuật
Trần Thị B tranthib@congty.vn 1998-03-15 Kinh doanh

⚠️ Cột “Ngày sinh” nên để định dạng Text và nhập dạng yyyy-MM-dd (ví dụ 1995-10-29) để workflow nhận đúng ngày.

3. Tạo App Registration trên Azure

  1. App registrations → New registration: đặt tên, chọn Single tenant, Redirect URI chọn Web và dán OAuth Redirect URL lấy từ n8n → Register. Sao chép Client ID.
  2. Certificates & secrets → New client secret: sao chép ngay Value.
  3. API permissions → Microsoft Graph → Delegated: thêm offline_access, User.Read, Files.Read, Mail.Send, Team.ReadBasic.All, Channel.ReadBasic.All, ChannelMessage.Send → Grant admin consent.

Đã tạo App Registration ở bài nhắc lịch họp thì chỉ cần bổ sung thêm quyền.

Hình 2: Vào App registrations và bấm New registration Hình 2: Vào App registrations và bấm New registration

Hình 3: Điền thông tin đăng ký ứng dụng và Redirect URI Hình 3: Điền thông tin đăng ký ứng dụng và Redirect URI

4. Kết nối Excel

Mở node Excel – Danh sách nhân viên → Set up credential → dán Client ID, Client Secret → Save → Connect my account. Sau đó chọn Workbook (file Excel) và Sheet Employees.

Hình 4: Node Excel – Set up credential, chọn Workbook và Sheet Hình 4: Node Excel – Set up credential, chọn Workbook và Sheet

Hình 5: Sao chép OAuth Redirect URL và dán Client ID (thông tin đã che mờ) Hình 5: Sao chép OAuth Redirect URL và dán Client ID (thông tin đã che mờ)

Hình 6: Dán Client Secret, bấm Save rồi Connect my account Hình 6: Dán Client Secret, bấm Save rồi Connect my account

5. Kết nối Outlook và Teams

  • Outlook – Gửi Email chúc mừng: tạo credential tương tự bước 4. Có thể sửa tiêu đề, nội dung email.
  • Teams – Chúc mừng sinh nhật: tạo credential tương tự, chọn Team và Channel đăng lời chúc.

Hình 8: Node Outlook – credential, người nhận, tiêu đề và nội dung email Hình 8: Node Outlook – credential, người nhận, tiêu đề và nội dung email

Hình 9: Node Teams – credential, chọn Team, Channel và nội dung lời chúc Hình 9: Node Teams – credential, chọn Team, Channel và nội dung lời chúc

6. Chạy thử và kích hoạt

  1. Vào … → Settings → Timezone chọn Asia/Ho_Chi_Minh để chạy đúng 08:00 giờ Việt Nam.
  2. Thêm một dòng thử trong Excel có ngày sinh là hôm nay và email của Quý Khách → bấm Execute workflow để kiểm tra.
  3. Xóa dòng thử → bấm Publish để workflow tự chạy mỗi ngày.

Hình 10: Execute workflow để chạy thử, Publish để kích hoạt Hình 10: Execute workflow để chạy thử, Publish để kích hoạt

Mẹo: nếu file Excel dùng tên cột khác, sửa lại tên cột trong node “Kiểm tra sinh nhật hôm nay”.






Bài viết liên quan