用n8n工作流,监测邮箱指定类型邮件,处理该邮件内容,最后上传邮件附件到服务器,并发送HTTP Callback。
安装n8n
1 2 3 4 5 6 7 8 9
| docker volume create n8n_data
docker run -it --rm \ --name n8n \ -p 8089:5678 \ -e N8N_SECURE_COOKIE=false \ -e VUE_APP_URL_BASE_API=https://yourdomain.com/ \ -e WEBHOOK_URL=https://yourdomain.com/ \ -v n8n_data:/home/node/.n8n docker.n8n.io/n8nio/n8n
|
https://yourdomain.com 需要替换成你自己的域名。
域名 nginx 转发配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| location / { proxy_pass http://127.0.0.1:8089; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $http_host; proxy_read_timeout 300s; proxy_send_timeout 300s; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; } location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { proxy_pass http://127.0.0.1:8089; } location ~ .*\.(js|css)?$ { proxy_pass http://127.0.0.1:8089; }
|
创建工作流
打开域名,根据引导注册账号,然后新建工作流。
添加 Microsoft Outlook Trigger ,根据引导添加自己的账号。
Filter Query:
1
| isRead eq false and contains(subject, '运测试单') and receivedDateTime ge 2024-12-05T00:00:00Z
|
表示只获取未读的,且邮件标题包含”运测试单”,且邮件收到时间大于2024-12-05的邮件。
可以让AI写自己需要的Filter Query。
使用 Code 节点处理邮件数据和附件
这里是我的两个 Code 节点:
Code 1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| return items.map(item => { const attachments = Object.keys(item.binary || {}); const allContainHBL = attachments.every(key => item.binary[key].fileName.toLowerCase().includes('hbl') // 检查所有附件文件名是否包含 "HBL"(忽略大小写) );
if (allContainHBL) { attachments.forEach(key => { const fileName = item.binary[key].fileName;
// 如果文件名包含 "提单",将大小写不敏感的 "HBL" 替换为 "MBL" if (fileName.includes("提单")) { item.binary[key].fileName = fileName.replace(/hbl/gi, "MBL"); // 正则替换忽略大小写 } }); } console.log(item); return item; });
|
Code 2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| return items.flatMap(item => { const attachments = Object.keys(item.binary || {}).filter(key => item.binary[key].fileExtension.toLowerCase() === 'pdf' // 筛选 PDF 类型 ); console.log(attachments); const datePrefix = new Date().toISOString().slice(2, 10).replace(/-/g, ''); // 生成日期前缀,例如 231206 const messageId = item.json.internetMessageId || 'unknown'; // 获取 internetMessageId const hash = messageId.split('').reduce((sum, char) => sum + char.charCodeAt(0), 0); // 计算字符总和 const uniqueNumber = String(hash % 10000).padStart(4, '0'); // 取模 10000 并确保是四位数 const uniqueId = `${datePrefix}${uniqueNumber}`; // 拼接最终的 ID
// 为每个附件生成单独的条目 return attachments.map(key => { const fileName = item.binary[key].fileName; // 获取文件名 const fileBase64 = item.binary[key].data; const total_number_of_bundles = attachments.length; return { json: { ...item.json, uniqueId, fileName, fileBase64, total_number_of_bundles }, // 合并 uniqueId 和 fileName 到 json binary: { [key]: item.binary[key] }, // 保留当前附件 }; }); });
|
转换附件格式
处理后的附件是base64格式,需要转换为文件,添加 Convert to File 节点:
向服务器发送HTTP Callback
新增 HTTP Request 节点,配置请求信息。
后续升级n8n
1 2 3
| docker pull docker.n8n.io/n8nio/n8n
然后再运行一开始的 docker run -it.. 命令
|