0%

使用n8n自动上传邮件附件到服务器

用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.. 命令

欢迎关注我的其它发布渠道