Resumen diario de la bandeja de entrada de Gmail a Discord (GPT-4.1-mini + conversión a PDF)
Este es unMiscellaneous, AI Summarization, Multimodal AIflujo de automatización del dominio deautomatización que contiene 18 nodos.Utiliza principalmente nodos como Code, Gmail, Discord, Markdown, Aggregate. Resumen diario de la bandeja de entrada de Gmail con GPT-4.1-mini y conversión de PDF, enviado a Discord
- •Cuenta de Google y credenciales de API de Gmail
- •Bot Token de Discord o Webhook
- •Pueden requerirse credenciales de autenticación para la API de destino
- •Clave de API de OpenAI
Nodos utilizados (18)
Categoría
{
"meta": {
"instanceId": "004a8f4f776326f6308ea533268fac22ea60e1995204a49569b21eb0ebbf949b",
"templateCredsSetupCompleted": true
},
"nodes": [
{
"id": "3b5b2708-da04-420a-aa33-498cd726ab8d",
"name": "Disparador Programado",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
0,
-224
],
"parameters": {
"rule": {
"interval": [
{
"triggerAtHour": 20
}
]
}
},
"typeVersion": 1.2
},
{
"id": "602ac44e-3936-4cfe-81fc-0c89aa180904",
"name": "Discord",
"type": "n8n-nodes-base.discord",
"position": [
2272,
-224
],
"webhookId": "22e13d55-f814-4fcc-a6d1-64532a1a272d",
"parameters": {
"files": {
"values": [
{}
]
},
"content": "= {{ $('separate text and markdown').item.json.plainText }}",
"options": {},
"authentication": "webhook"
},
"credentials": {
"discordWebhookApi": {
"id": "jKpjyXPQk0ZHSthc",
"name": "Discord Webhook account"
}
},
"typeVersion": 2
},
{
"id": "cab9950b-4b4f-418b-ae4c-bd29a4966bb5",
"name": "OpenAI Chat Model1",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
880,
-64
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1-mini"
},
"options": {}
},
"credentials": {
"openAiApi": {
"id": "FjFA8XKFHNhB1RJV",
"name": "OpenAi account"
}
},
"typeVersion": 1.2
},
{
"id": "85dde31c-3895-4ece-bb8c-ee5f21f55c89",
"name": "HTTP Request",
"type": "n8n-nodes-base.httpRequest",
"position": [
1920,
-224
],
"parameters": {
"url": "={{ $json.url }}",
"options": {}
},
"typeVersion": 4.2
},
{
"id": "a49d8c5b-f638-4309-add4-7524c347e9cb",
"name": "Cadena de Resumen",
"type": "@n8n/n8n-nodes-langchain.chainSummarization",
"position": [
896,
-224
],
"parameters": {
"options": {
"summarizationMethodAndPrompts": {
"values": {
"prompt": "You will receive a collection of emails.\n\nSummarize them in **two formats**:\n\n1. **Plain Text Digest** \n - Use clear sentences. \n - Separate different senders with line breaks. \n - Keep it compact but readable. \n - Mention only the most important details (credentials, OTPs, deadlines, required actions). \n - Mark urgent items with [Action Required]. \n\n2. **Markdown Digest** \n - Use headings for senders. \n - Bullets for details. \n - Highlight actions with **[Action Required]**. \n\nHere are the emails:\n\n\"{text}\"\n\nNow output:\n\nPLAIN TEXT:\n...\n\nMARKDOWN:\n...\n",
"summarizationMethod": "stuff"
}
}
}
},
"typeVersion": 2.1
},
{
"id": "7f9ab61d-ffd9-477e-8886-2472e5d4a1ab",
"name": "PDFco Api",
"type": "n8n-nodes-pdfco.PDFco Api",
"position": [
1696,
-224
],
"parameters": {
"html": "={{ $json.data }}",
"operation": "URL/HTML to PDF",
"convertType": "htmlToPDF",
"advancedOptions": {}
},
"credentials": {
"pdfcoApi": {
"id": "vCEaG1kMANv6I2pX",
"name": "PDF.co account"
}
},
"typeVersion": 1
},
{
"id": "156e95b9-c5c7-477d-b1a4-0c3545a56669",
"name": "Markdown",
"type": "n8n-nodes-base.markdown",
"position": [
1472,
-224
],
"parameters": {
"mode": "markdownToHtml",
"options": {},
"markdown": "=\n{{ $json.markdown }}"
},
"typeVersion": 1
},
{
"id": "190586e3-685c-4c95-87f1-882dba9e54ca",
"name": "Agregador",
"type": "n8n-nodes-base.aggregate",
"position": [
672,
-224
],
"parameters": {
"include": "specifiedFields",
"options": {},
"aggregate": "aggregateAllItemData",
"fieldsToInclude": "subject, from, plainText"
},
"typeVersion": 1
},
{
"id": "9c7247ee-9811-4ad4-bb4a-bbc53a23ab38",
"name": "extraer secciones requeridas de correos",
"type": "n8n-nodes-base.code",
"position": [
448,
-224
],
"parameters": {
"jsCode": "// n8n Code node (JavaScript)\n\n// Helper: decode Gmail's base64url\nfunction decodeBase64Url(str) {\n if (!str) return \"\";\n str = str.replace(/-/g, '+').replace(/_/g, '/');\n return Buffer.from(str, 'base64').toString('utf8');\n}\n\n// Helper: clean text\nfunction cleanText(txt) {\n if (!txt) return \"\";\n\n return txt\n // remove long URLs\n .replace(/https?:\\/\\/\\S+/g, \"\")\n // remove multiple stars/dashes\n .replace(/[*]{3,}|[-]{3,}/g, \"\")\n // remove extra blank lines\n .replace(/\\n\\s*\\n\\s*\\n+/g, \"\\n\\n\")\n // trim\n .trim();\n}\n\nconst items = $input.all();\nconst returnData = [];\n\nfor (let i = 0; i < items.length; i++) {\n const email = items[i].json;\n let plainText = \"\";\n\n // Case 1: direct body\n if (email?.payload?.body?.data) {\n plainText = decodeBase64Url(email.payload.body.data);\n }\n\n // Case 2: multipart body\n if (!plainText && Array.isArray(email?.payload?.parts)) {\n for (const part of email.payload.parts) {\n if (part.mimeType === \"text/plain\" && part.body?.data) {\n plainText = decodeBase64Url(part.body.data);\n break;\n }\n }\n }\n\n // Fallback if you already had email.text\n if (!plainText && email.text) {\n plainText = email.text;\n }\n\n const extractedData = {\n id: email.id || \"\",\n subject: email.subject || email.payload?.headers?.find(h => h.name === \"Subject\")?.value || \"\",\n from: email.from?.text || email.from || email.payload?.headers?.find(h => h.name === \"From\")?.value || \"\",\n to: email.to?.text || email.to || email.payload?.headers?.find(h => h.name === \"To\")?.value || \"\",\n plainText: cleanText(plainText),\n };\n\n returnData.push({ json: extractedData });\n}\n\nreturn returnData;\n"
},
"typeVersion": 2
},
{
"id": "157ef58a-86fa-41fc-96d4-b058684d513f",
"name": "obtener correos de las últimas 24 h",
"type": "n8n-nodes-base.gmail",
"position": [
224,
-224
],
"webhookId": "9b3a82a5-af1e-4a65-b285-ef679fe139cb",
"parameters": {
"simple": false,
"filters": {
"labelIds": [
"INBOX",
"IMPORTANT"
],
"receivedAfter": "={{$now.minus({days: 1}).toISO()}}"
},
"options": {},
"operation": "getAll",
"returnAll": true
},
"credentials": {
"gmailOAuth2": {
"id": "TRunAyOQrZYegEJX",
"name": "Gmail account"
}
},
"typeVersion": 2.1
},
{
"id": "0df5a671-79aa-4c7d-bbd7-296a214b4c9c",
"name": "Nota Adhesiva2",
"type": "n8n-nodes-base.stickyNote",
"position": [
416,
-368
],
"parameters": {
"width": 400,
"height": 320,
"content": "## extract fields and aggregate\n- sender\n- subject\n- body"
},
"typeVersion": 1
},
{
"id": "5a0a95ad-14a7-484a-94c2-ef6a582151fa",
"name": "Nota Adhesiva1",
"type": "n8n-nodes-base.stickyNote",
"position": [
176,
-304
],
"parameters": {
"width": 208,
"height": 208,
"content": "## get mails\n- Important and inbox"
},
"typeVersion": 1
},
{
"id": "2335cdb8-b1e1-4d7c-98f7-e84dfec2e4c0",
"name": "Nota Adhesiva",
"type": "n8n-nodes-base.stickyNote",
"position": [
-64,
-320
],
"parameters": {
"width": 192,
"height": 256,
"content": "## daily trigger"
},
"typeVersion": 1
},
{
"id": "b82da96e-aa95-45fd-b13e-51f998143f6c",
"name": "separar texto y markdown",
"type": "n8n-nodes-base.code",
"position": [
1248,
-224
],
"parameters": {
"jsCode": "const output = $json[\"output\"][\"text\"];\n\n// Match plain text - works for both \"PLAIN TEXT\" and \"PLAIN TEXT DIGEST\"\nconst plainText = output.match(/PLAIN TEXT(?: DIGEST)?:\\s*([\\s\\S]*?)(?:\\n\\n---\\n\\nMARKDOWN DIGEST:|\\n\\nMARKDOWN:)/)?.[1]?.trim();\n\n// Match markdown - works for both \"MARKDOWN\" and \"MARKDOWN DIGEST\"\nconst markdown = output.match(/MARKDOWN(?: DIGEST)?:\\s*([\\s\\S]*)/)?.[1]?.trim();\n\nreturn [{\n plainText,\n markdown\n}];\n"
},
"typeVersion": 2
},
{
"id": "44150497-0310-40d3-bb8d-8bd7624ab4c1",
"name": "Nota Adhesiva3",
"type": "n8n-nodes-base.stickyNote",
"position": [
832,
-384
],
"parameters": {
"width": 320,
"height": 480,
"content": "## summarize all mails\n- ### model used gpt 4o-mini"
},
"typeVersion": 1
},
{
"id": "e77850b7-6d9c-44da-8c36-33ab2cac645f",
"name": "Nota Adhesiva4",
"type": "n8n-nodes-base.stickyNote",
"position": [
1392,
-304
],
"parameters": {
"width": 432,
"height": 240,
"content": "## convert markdown to html and convert html to pdf using PDFco Api"
},
"typeVersion": 1
},
{
"id": "24c297f1-9195-43e2-b27d-208aaad5b518",
"name": "Nota Adhesiva5",
"type": "n8n-nodes-base.stickyNote",
"position": [
1856,
-400
],
"parameters": {
"height": 336,
"content": "## Download PDF\n- ### using link generated from pdfco"
},
"typeVersion": 1
},
{
"id": "31e1f02c-4b0a-49c6-ad17-3d8bef1fc35c",
"name": "Nota Adhesiva6",
"type": "n8n-nodes-base.stickyNote",
"position": [
2192,
-352
],
"parameters": {
"width": 336,
"height": 304,
"content": "## Send discord\n- using webhook\n- result will contain summary and a pdf of summary"
},
"typeVersion": 1
}
],
"pinData": {},
"connections": {
"156e95b9-c5c7-477d-b1a4-0c3545a56669": {
"main": [
[
{
"node": "7f9ab61d-ffd9-477e-8886-2472e5d4a1ab",
"type": "main",
"index": 0
}
]
]
},
"190586e3-685c-4c95-87f1-882dba9e54ca": {
"main": [
[
{
"node": "a49d8c5b-f638-4309-add4-7524c347e9cb",
"type": "main",
"index": 0
}
]
]
},
"7f9ab61d-ffd9-477e-8886-2472e5d4a1ab": {
"main": [
[
{
"node": "85dde31c-3895-4ece-bb8c-ee5f21f55c89",
"type": "main",
"index": 0
}
]
]
},
"85dde31c-3895-4ece-bb8c-ee5f21f55c89": {
"main": [
[
{
"node": "602ac44e-3936-4cfe-81fc-0c89aa180904",
"type": "main",
"index": 0
}
]
]
},
"3b5b2708-da04-420a-aa33-498cd726ab8d": {
"main": [
[
{
"node": "157ef58a-86fa-41fc-96d4-b058684d513f",
"type": "main",
"index": 0
}
]
]
},
"cab9950b-4b4f-418b-ae4c-bd29a4966bb5": {
"ai_languageModel": [
[
{
"node": "a49d8c5b-f638-4309-add4-7524c347e9cb",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"a49d8c5b-f638-4309-add4-7524c347e9cb": {
"main": [
[
{
"node": "b82da96e-aa95-45fd-b13e-51f998143f6c",
"type": "main",
"index": 0
}
]
]
},
"157ef58a-86fa-41fc-96d4-b058684d513f": {
"main": [
[
{
"node": "9c7247ee-9811-4ad4-bb4a-bbc53a23ab38",
"type": "main",
"index": 0
}
]
]
},
"b82da96e-aa95-45fd-b13e-51f998143f6c": {
"main": [
[
{
"node": "156e95b9-c5c7-477d-b1a4-0c3545a56669",
"type": "main",
"index": 0
}
]
]
},
"9c7247ee-9811-4ad4-bb4a-bbc53a23ab38": {
"main": [
[
{
"node": "190586e3-685c-4c95-87f1-882dba9e54ca",
"type": "main",
"index": 0
}
]
]
}
}
}¿Cómo usar este flujo de trabajo?
Copie el código de configuración JSON de arriba, cree un nuevo flujo de trabajo en su instancia de n8n y seleccione "Importar desde JSON", pegue la configuración y luego modifique la configuración de credenciales según sea necesario.
¿En qué escenarios es adecuado este flujo de trabajo?
Avanzado - Varios, Resumen de IA, IA Multimodal
¿Es de pago?
Este flujo de trabajo es completamente gratuito, puede importarlo y usarlo directamente. Sin embargo, tenga en cuenta que los servicios de terceros utilizados en el flujo de trabajo (como la API de OpenAI) pueden requerir un pago por su cuenta.
Flujos de trabajo relacionados recomendados
moosa
@moosaCompartir este flujo de trabajo