Résumé quotidien de la boîte de réception Gmail vers Discord (GPT-4.1-mini + conversion PDF)

Avancé

Ceci est unMiscellaneous, AI Summarization, Multimodal AIworkflow d'automatisation du domainecontenant 18 nœuds.Utilise principalement des nœuds comme Code, Gmail, Discord, Markdown, Aggregate. Résumé quotidien de la boîte de réception Gmail avec GPT-4.1-mini et conversion PDF envoyé vers Discord

Prérequis
  • Compte Google et informations d'identification Gmail API
  • Token Bot Discord ou Webhook
  • Peut nécessiter les informations d'identification d'authentification de l'API cible
  • Clé API OpenAI
Aperçu du workflow
Visualisation des connexions entre les nœuds, avec support du zoom et du déplacement
Exporter le workflow
Copiez la configuration JSON suivante dans n8n pour importer et utiliser ce workflow
{
  "meta": {
    "instanceId": "004a8f4f776326f6308ea533268fac22ea60e1995204a49569b21eb0ebbf949b",
    "templateCredsSetupCompleted": true
  },
  "nodes": [
    {
      "id": "3b5b2708-da04-420a-aa33-498cd726ab8d",
      "name": "Déclencheur planifié",
      "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 Modèle de chat1",
      "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 Requête",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1920,
        -224
      ],
      "parameters": {
        "url": "={{ $json.url }}",
        "options": {}
      },
      "typeVersion": 4.2
    },
    {
      "id": "a49d8c5b-f638-4309-add4-7524c347e9cb",
      "name": "Chaîne de résumé",
      "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": "Agrégation",
      "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": "extraire les sections requises des e-mails",
      "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": "obtenir les e-mails des dernières 24h",
      "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": "Note adhésive2",
      "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": "Note adhésive1",
      "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": "Note adhésive",
      "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": "séparer texte et 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": "Note adhésive3",
      "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": "Note adhésive4",
      "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": "Note adhésive5",
      "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": "Note adhésive6",
      "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
          }
        ]
      ]
    }
  }
}
Foire aux questions

Comment utiliser ce workflow ?

Copiez le code de configuration JSON ci-dessus, créez un nouveau workflow dans votre instance n8n et sélectionnez "Importer depuis le JSON", collez la configuration et modifiez les paramètres d'authentification selon vos besoins.

Dans quelles scénarios ce workflow est-il adapté ?

Avancé - Divers, Résumé IA, IA Multimodale

Est-ce payant ?

Ce workflow est entièrement gratuit et peut être utilisé directement. Veuillez noter que les services tiers utilisés dans le workflow (comme l'API OpenAI) peuvent nécessiter un paiement de votre part.

Informations sur le workflow
Niveau de difficulté
Avancé
Nombre de nœuds18
Catégorie3
Types de nœuds11
Description de la difficulté

Adapté aux utilisateurs avancés, avec des workflows complexes contenant 16+ nœuds

Liens externes
Voir sur n8n.io

Partager ce workflow

Catégories

Catégories: 34