This workflow follows the Agent → Emailsend recipe pattern — see all workflows that pair these two integrations.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"name": "AI Mail Assistant",
"nodes": [
{
"parameters": {
"downloadAttachments": true,
"options": {}
},
"type": "n8n-nodes-base.emailReadImap",
"typeVersion": 2.1,
"position": [
-768,
-96
],
"id": "f5bd1de4-c537-44bc-8dbb-5b51110875a8",
"name": "Email Trigger (IMAP)",
"credentials": {
"imap": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"rules": {
"values": [
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 3
},
"conditions": [
{
"id": "35add2ec-d543-4804-b83e-19fe018ec163",
"leftValue": "={{ $json.output }}",
"rightValue": "Category: international_office_question",
"operator": {
"type": "string",
"operation": "contains"
}
}
],
"combinator": "and"
}
},
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 3
},
"conditions": [
{
"leftValue": "={{ $json.output }}",
"rightValue": "Category: contract_submission",
"operator": {
"type": "string",
"operation": "contains"
},
"id": "6d4c0d74-e14d-4698-8ea0-3988ff1f6f8d"
}
],
"combinator": "and"
}
},
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 3
},
"conditions": [
{
"id": "aa0b117c-225c-47cf-943c-79dd3e963d07",
"leftValue": "={{ $json.output }}",
"rightValue": "Category: internship_postponement",
"operator": {
"type": "string",
"operation": "contains"
}
}
],
"combinator": "and"
}
},
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 3
},
"conditions": [
{
"id": "23ab2266-e562-4675-8e32-8300ba0f2b6b",
"leftValue": "={{ $json.output }}",
"rightValue": "Category: uncategorized",
"operator": {
"type": "string",
"operation": "contains"
}
}
],
"combinator": "and"
}
}
]
},
"options": {}
},
"type": "n8n-nodes-base.switch",
"typeVersion": 3.4,
"position": [
16,
32
],
"id": "bf04434d-128c-4bd8-ad05-557fe44a2cab",
"name": "Switch",
"alwaysOutputData": false
},
{
"parameters": {
"model": "qwen3:8b",
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.lmChatOllama",
"typeVersion": 1,
"position": [
-272,
288
],
"id": "3ca3cb22-71ef-4345-828b-e724b26b95f6",
"name": "Ollama Chat Model",
"credentials": {
"ollamaApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"authentication": "coreImapAccount",
"resource": "email",
"operation": "moveEmail",
"sourceMailbox": {
"__rl": true,
"mode": "list",
"value": "INBOX"
},
"emailUid": "={{ $('Email Trigger (IMAP)').item.json.attributes.uid }}",
"destinationMailbox": {
"__rl": true,
"value": "INBOX.contract_submission",
"mode": "list",
"cachedResultName": "INBOX.contract_submission"
}
},
"type": "n8n-nodes-imap.imap",
"typeVersion": 1,
"position": [
240,
-48
],
"id": "fb0c970a-7bcf-4bf9-a0e5-2a8dd05a4930",
"name": "MoveEmail with Contract Submission",
"credentials": {
"imap": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"authentication": "coreImapAccount",
"resource": "email",
"operation": "moveEmail",
"sourceMailbox": {
"__rl": true,
"mode": "list",
"value": "INBOX"
},
"emailUid": "={{ $('Email Trigger (IMAP)').item.json.attributes.uid }}",
"destinationMailbox": {
"__rl": true,
"value": "INBOX.international_questions",
"mode": "list",
"cachedResultName": "INBOX.international_questions"
}
},
"type": "n8n-nodes-imap.imap",
"typeVersion": 1,
"position": [
240,
-336
],
"id": "3299e876-8d1f-4457-a53c-30e19117d483",
"name": "MoveEmail with International Question",
"credentials": {
"imap": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"authentication": "coreImapAccount",
"resource": "email",
"operation": "moveEmail",
"sourceMailbox": {
"__rl": true,
"mode": "list",
"value": "INBOX"
},
"emailUid": "={{ $('Email Trigger (IMAP)').item.json.attributes.uid }}",
"destinationMailbox": {
"__rl": true,
"value": "INBOX.postponement_requests",
"mode": "list",
"cachedResultName": "INBOX.postponement_requests"
}
},
"type": "n8n-nodes-imap.imap",
"typeVersion": 1,
"position": [
464,
160
],
"id": "14f1a17e-0681-4a71-8556-f288342b9616",
"name": "MoveEmail with Postponement Request",
"credentials": {
"imap": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"authentication": "coreImapAccount",
"resource": "email",
"operation": "moveEmail",
"sourceMailbox": {
"__rl": true,
"mode": "list",
"value": "INBOX"
},
"emailUid": "={{ $('Email Trigger (IMAP)').item.json.attributes.uid }}",
"destinationMailbox": {
"__rl": true,
"value": "INBOX.uncategorized",
"mode": "list",
"cachedResultName": "INBOX.uncategorized"
}
},
"type": "n8n-nodes-imap.imap",
"typeVersion": 1,
"position": [
464,
352
],
"id": "73a3cd26-5626-4d53-aab5-3f22e393561e",
"name": "MoveEmail which is Uncategorized",
"credentials": {
"imap": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"authentication": "coreImapAccount",
"resource": "email",
"operation": "createDraft",
"destinationMailbox": {
"__rl": true,
"value": "INBOX.Drafts",
"mode": "list",
"cachedResultName": "INBOX.Drafts"
},
"subject": "=Re: {{ $('Email Trigger (IMAP)').item.json.subject }}",
"from": "ios-test-mail@htwg-konstanz.de",
"to": "={{ $('Email Trigger (IMAP)').item.json.from }}",
"text": "={{ $json.text }}"
},
"type": "n8n-nodes-imap.imap",
"typeVersion": 1,
"position": [
1584,
160
],
"id": "063538d0-c58e-41bf-9adb-21f6ef3f489e",
"name": "CreateDraft email",
"credentials": {
"imap": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"promptType": "define",
"text": "=Du bist ein E-Mail-Klassifizierungs-Assistent f\u00fcr das Praktikantenamt der HTWG Konstanz. Deine Aufgabe ist es, eingehende E-Mails in GENAU EINE Kategorie einzuordnen.\n\n## KATEGORIEN\n\n1. **contract_submission** - E-Mails zur Einreichung oder Korrektur von Praktikumsvertr\u00e4gen (meist mit Anh\u00e4ngen oder Erw\u00e4hnung von Vertragsdokumenten)\n2. **international_office_question** - Fragen zu Auslandspraktika (Visum, Anerkennung, Versicherung, ausl\u00e4ndische L\u00e4nder)\n3. **internship_postponement** - Anfragen zur Verschiebung, Pausierung oder Termin\u00e4nderung von Praktika (Gesundheit, Pr\u00fcfungen, Schwangerschaft, private Gr\u00fcnde)\n4. **uncategorized** - Alles andere (technische Probleme, Spam, unklare Anfragen, ODER E-Mails mit mehreren Hauptanliegen)\n\n## KLASSIFIZIERUNGSREGELN\n\n**Priorit\u00e4tsreihenfolge:**\n1. Wenn die E-Mail MEHRERE Hauptanliegen hat \u2192 W\u00e4hle **uncategorized**\n2. Wenn \"Vertrag\" ODER \"contract\" erw\u00e4hnt wird + has_attachment=true ODER Diskussion \u00fcber Einreichung \u2192 **contract_submission**\n3. Wenn ausl\u00e4ndische L\u00e4nder, \"Ausland\", \"international\", Visum oder ausl\u00e4ndische Firmenstandorte erw\u00e4hnt werden \u2192 **international_office_question**\n4. Wenn \"verschieb\", \"pausier\", \"unterbrech\", \"sp\u00e4ter\", Verschiebung oder \u00c4nderung von Praktikumsterminen erw\u00e4hnt wird \u2192 **internship_postponement**\n5. Wenn nichts davon klar zutrifft \u2192 **uncategorized**\n\n**Wichtige Indikatoren:**\n- **contract_submission**: Vertrag, Anhang, einreichen, Unterschrift, Dokumente einreichen, Unterlagen absenden, Genehmigungsunterlagen\n- **international_office_question**: Ausland, international, Visum, Versicherung (im internationalen Kontext), Anerkennung, L\u00e4ndernamen (Niederlande, USA, etc.)\n- **internship_postponement**: verschieben, pausieren, unterbrechen, sp\u00e4ter beginnen, Termin \u00e4ndern, gesundheitliche Gr\u00fcnde, privat (mit Zeit\u00e4nderungs-Kontext)\n\n## BEISPIELE\n\n### Beispiel 1: international_office_question\n**Eingabe:**\nBetreff: Frage zu Auslandspraktikum in den Niederlanden\nVon: lena.zimmermann@htwg-konstanz.de\nHat Anhang: false\nText: Guten Tag,\\n\\nplanes planen ein Praktikum bei einem niederl\u00e4ndischen Unternehmen in Amsterdam und h\u00e4tte gerne Informationen zu den spezifischen Anforderungen. Ben\u00f6tige ich eine Genehmigung des Praktikantamts vor Antritt des Praktikums oder kann ich mich erst nachher registrieren? Zudem w\u00fcrde ich gerne wissen, welche Versicherungen f\u00fcr Auslandspraktika notwendig sind und ob das Zeugnis der ausl\u00e4ndischen Betriebsst\u00e4tte anerkannt wird. K\u00f6nnen Sie mich auch an die zust\u00e4ndige Stelle f\u00fcr internationale Praktika weiterleiten?\\n\\nVielen Dank f\u00fcr Ihre Unterst\u00fctzung!\\nLena Zimmermann\n\n**Ausgabe:**\nCategory: international_office_question\nReasoning: E-Mail fragt nach Auslandspraktikum in den Niederlanden mit Fragen zu Genehmigung, Versicherung und Anerkennung ausl\u00e4ndischer Zeugnisse.\n\n---\n\n### Beispiel 2: internship_postponement\n**Eingabe:**\nBetreff: Praktikum verschieben - neue Genehmigung ben\u00f6tigt\nVon: felicia.koester@htwg-konstanz.de\nHat Anhang: false\nText: Sehr geehrtes Praktikantenamt,\\n\\nleider muss ich aufgrund von gesundheitlichen Gr\u00fcnden mein geplantes Praktikum verschieben. Das Praktikum bei der EngineerWorks AG sollte urspr\u00fcnglich am 01. April 2024 f\u00fcr acht Wochen beginnen. Ich m\u00f6chte diesen Termin auf September 2024 verschieben. Der Betrieb hat der Verschiebung schriftlich zugestimmt und stellt mir gerne einen neuen Praktikumsplatz zur Verf\u00fcgung. Wie m\u00fcssen wir in diesem Fall vorgehen und welche Formulare ben\u00f6tigen Sie von uns?\\n\\nMit freundlichen Gr\u00fc\u00dfen,\\nFelicia K\u00f6ster\n\n**Ausgabe:**\nCategory: internship_postponement\nReasoning: Studentin m\u00f6chte Praktikumsbeginn von April auf September verschieben aus gesundheitlichen Gr\u00fcnden.\n\n---\n\n### Beispiel 3: uncategorized\n**Eingabe:**\nBetreff: Test\nVon: spam@example.com\nHat Anhang: false\nText: Test\n\n**Ausgabe:**\nCategory: uncategorized\nReasoning: Keine erkennbare Absicht, sehr kurzer Inhalt, keine relevanten Informationen f\u00fcr Praktikantenamt.\n\n---\n\n### Beispiel 4: contract_submission (mit Nebenfrage)\n**Eingabe:**\nBetreff: Praktikumsvertrag Multimedia GmbH + Frage zur Genehmigung\nVon: thomas.voigt@htwg-konstanz.de\nHat Anhang: true\nText: Hallo Praktikantenamt,\\n\\nanbei reiche ich meinen Praktikumsvertrag f\u00fcr das Praktikum bei der Multimedia GmbH ein. Das Praktikum beginnt am 20. Mai 2024 und dauert 10 Wochen. Alle erforderlichen Unterlagen sind beigef\u00fcgt und vom Betrieb unterzeichnet. Zus\u00e4tzlich h\u00e4tte ich gerne eine kurze Frage: Kann ich nach dem Praktikum direkt ein Anschluss-Praktikum machen, ohne zwischen den beiden ein vollst\u00e4ndiges Genehmigungsverfahren durchlaufen zu m\u00fcssen? Dies w\u00fcrde mir sehr bei meiner Planung helfen.\\n\\nBesten Dank und viele Gr\u00fc\u00dfe,\\nThomas Voigt\n\n**Ausgabe:**\nCategory: contract_submission\nReasoning: Hauptabsicht ist Einreichung des Praktikumsvertrags mit Anhang. Zusatzfrage ist sekund\u00e4r.\n\n---\n\n### Beispiel 5: internship_postponement (informell/vage)\n**Eingabe:**\nBetreff: Kurze R\u00fcckfrage wegen n\u00e4chster Woche\nVon: p.schneider@htwg-konstanz.de\nHat Anhang: false\nText: Hallo,\\n\\nmein Chef meinte ich soll mich bei Ihnen melden. Wir haben da eine Situation mit dem Termin n\u00e4chste Woche - das klappt bei mir leider nicht mehr so wie besprochen. Privat ist gerade einiges los und ich br\u00e4uchte etwa zwei bis drei Wochen sp\u00e4ter. Geht das \u00fcberhaupt noch oder ist das jetzt zu kurzfristig? Der Betrieb w\u00e4re flexibel.\\n\\nLG\\nPaul\n\n**Ausgabe:**\nCategory: internship_postponement\nReasoning: Student m\u00f6chte Praktikumstermin um 2-3 Wochen nach hinten verschieben aus privaten Gr\u00fcnden.\n\n---\n\n### Beispiel 6: contract_submission (Vorbereitungsphase)\n**Eingabe:**\nBetreff: Unterlagen f\u00fcr Genehmigungsprozess\nVon: stefanie.krueger@htwg-konstanz.de\nHat Anhang: false\nText: Sehr geehrte Damen und Herren,\\n\\nich bin mir nicht ganz sicher, ob ich hier richtig bin. Ich w\u00fcrde gerne wissen, welche Dokumente ich zusammenstellen muss, bevor ich meinen Vertrag einreichen kann. Die Firma hat mir bereits alles unterschrieben zur\u00fcckgeschickt, aber ich m\u00f6chte sichergehen, dass nichts fehlt. Brauche ich eine Versicherungsbest\u00e4tigung? Und muss die Firma noch weitere Formulare ausf\u00fcllen? K\u00f6nnten Sie mir vielleicht eine Checkliste schicken?\\n\\nDanke vorab,\\nStefanie Kr\u00fcger\n\n**Ausgabe:**\nCategory: contract_submission\nReasoning: Frage zur Vorbereitung der Vertragseinreichung. Unterschriebener Vertrag liegt vor, es geht um den Einreichungsprozess.\n\n---\n\n### Beispiel 7: uncategorized (Grenzfall - inland bei internationaler Firma)\n**Eingabe:**\nBetreff: Internationale Firma in Hamburg\nVon: jan.becker@htwg-konstanz.de\nHat Anhang: false\nText: Guten Tag,\\n\\nich habe eine Zusage von einem amerikanischen Tech-Konzern bekommen, allerdings ist die Stelle hier in Hamburg am deutschen Standort. Jetzt bin ich unsicher: Gilt das als Auslandspraktikum, weil die Firma aus den USA kommt? Oder ist das ein normales inl\u00e4ndisches Praktikum? Die HR-Abteilung sitzt in San Francisco und mein Vertrag l\u00e4uft auch \u00fcber die US-Zentrale, aber ich arbeite physisch in Hamburg.\\n\\nW\u00fcrde mich \u00fcber Klarstellung freuen,\\nJan Becker\n\n**Ausgabe:**\nCategory: uncategorized\nReasoning: Frage zur Kategorisierung eines Praktikums in Deutschland bei internationaler Firma - passt nicht eindeutig in internationale oder regul\u00e4re Kategorie.\n\n---\n\n### Beispiel 8: uncategorized (technischer Support)\n**Eingabe:**\nBetreff: Formular l\u00e4sst sich nicht \u00f6ffnen\nVon: lisa.vogel@htwg-konstanz.de\nHat Anhang: false\nText: Hallo,\\n\\nich versuche seit gestern, das Praktikumsformular von Ihrer Webseite herunterzuladen, aber die PDF-Datei l\u00e4sst sich nicht \u00f6ffnen. Ich habe es mit verschiedenen Browsern probiert (Chrome, Firefox, Edge) und auch auf einem anderen Computer. Die Datei scheint besch\u00e4digt zu sein. K\u00f6nnten Sie mir bitte eine funktionierende Version per E-Mail zusenden oder das Problem auf der Webseite beheben?\\n\\nVielen Dank,\\nLisa Vogel\n\n**Ausgabe:**\nCategory: uncategorized\nReasoning: Technisches Problem mit Website, kein spezifischer Praktikumsprozess betroffen.\n\n---\n\n## DEINE AUFGABE\n\nAnalysiere die folgende E-Mail und ordne sie in EINE Kategorie ein.\n\n**Zu klassifizierende E-Mail:**\nBetreff: {{ $('Email Trigger (IMAP)').item.json.subject }}\nVon: {{ $('Email Trigger (IMAP)').item.json.to }}\nText: {{ $('Email Trigger (IMAP)').item.json.textPlain }}\n\n**Deine Antwort (verwende exakt dieses Format):**\nCategory: <kategorie_name>",
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.agent",
"typeVersion": 3,
"position": [
-336,
64
],
"id": "7892e8a6-7124-44e0-a7b1-2a59470e6ca7",
"name": "Categorize E-Mail"
},
{
"parameters": {
"fromEmail": "ios-test-mail@htwg-konstanz.de",
"toEmail": "ios-test-mail@htwg-konstanz.de",
"subject": "=Fw: {{ $('Email Trigger (IMAP)').item.json.subject }}",
"html": "={{ $('Email Trigger (IMAP)').item.json.textHtml }}",
"options": {}
},
"type": "n8n-nodes-base.emailSend",
"typeVersion": 2.1,
"position": [
464,
-336
],
"id": "1c3fde68-1896-49d9-9545-ca4ad7181646",
"name": "Forward E-Mail",
"credentials": {
"smtp": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"fromEmail": "ios-test-mail@htwg-konstanz.de",
"toEmail": "ios-test-mail@htwg-konstanz.de",
"subject": "Notification",
"html": "=The E-Mail from {{ $('Email Trigger (IMAP)').item.json.from }} with the subject \"{{ $('Email Trigger (IMAP)').item.json.subject }}\" has successfully been forwarded to TBA.",
"options": {}
},
"type": "n8n-nodes-base.emailSend",
"typeVersion": 2.1,
"position": [
896,
-336
],
"id": "f8b46d26-da6e-4735-aca0-dcafa7139901",
"name": "Send Notification",
"credentials": {
"smtp": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"model": "mxbai-embed-large:latest"
},
"type": "@n8n/n8n-nodes-langchain.embeddingsOllama",
"typeVersion": 1,
"position": [
1168,
688
],
"id": "464a2255-af0c-4ff4-a1ce-53efd41f2bf6",
"name": "Embeddings Ollama",
"credentials": {
"ollamaApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"jsCode": "// --- Get AI response ---\nlet aiBody = $input.first().json.content ?? '';\n\n// Convert escaped sequences like \"\\n\" into real newlines\naiBody = aiBody.replace(/\\\\n/g, '\\n');\n\n// Normalize to LF first\naiBody = aiBody\n .replace(/\\r\\n/g, '\\n')\n .replace(/\\r/g, '\\n');\n\n// --- Get original email data ---\nconst trigger = $node[\"Email Trigger (IMAP)\"].json;\n\nconst subject = trigger.subject ?? '';\nconst from = trigger.from ?? '';\nlet original = trigger.textPlain ?? '';\n\n// Convert escaped sequences in original mail too\noriginal = original.replace(/\\\\n/g, '\\n');\n\n// Normalize original to LF\noriginal = original\n .replace(/\\r\\n/g, '\\n')\n .replace(/\\r/g, '\\n');\n\n// --- Build full message using LF internally ---\nlet fullText =\n`Sehr geehrter Herr/Frau ${from}\n\n${aiBody}\n\n\n\nViele Gr\u00fc\u00dfe\ni.A. Praktikantenamt\n\n\n--------------------------\nOriginal-E-Mail:\nBetreff: ${subject}\nVon: ${from}\n\n${original}`;\n\n// Final normalization: convert everything to strict CRLF\nfullText = fullText\n .replace(/\\r\\n/g, '\\n')\n .replace(/\\r/g, '\\n')\n .replace(/\\n/g, '\\r\\n');\n\nreturn {\n text: fullText\n};"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
1360,
160
],
"id": "6ef2c443-6ad4-47ba-a338-c1e1330e4c66",
"name": "Code in JavaScript"
},
{
"parameters": {
"operation": "upload",
"bucketName": "n8n-test",
"fileName": "={{ $json.metadata['message-id'] }}.pdf",
"binaryPropertyName": "attachment_0",
"additionalFields": {}
},
"type": "n8n-nodes-base.s3",
"typeVersion": 1,
"position": [
-288,
-208
],
"id": "49029211-59ff-417e-8681-b789dfaa510a",
"name": "Upload a file",
"credentials": {
"s3": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"workflowId": {
"__rl": true,
"value": "1ZcGacJ2YTByFhtf",
"mode": "list",
"cachedResultUrl": "/workflow/1ZcGacJ2YTByFhtf",
"cachedResultName": "Contract Validation"
},
"workflowInputs": {
"mappingMode": "defineBelow",
"value": {
"file-id": "={{ $('Email Trigger (IMAP)').item.json.metadata['message-id'] }}.pdf"
},
"matchingColumns": [
"mail-id"
],
"schema": [
{
"id": "file-id",
"displayName": "file-id",
"required": false,
"defaultMatch": false,
"display": true,
"canBeUsedToMatch": true,
"type": "string",
"removed": false
}
],
"attemptToConvertTypes": false,
"convertFieldsToString": true
},
"options": {
"waitForSubWorkflow": true
}
},
"type": "n8n-nodes-base.executeWorkflow",
"typeVersion": 1.3,
"position": [
464,
-48
],
"id": "ab7a5dd6-cdb1-435a-aa33-3a713f1e77e2",
"name": "Execute Contract Validation"
},
{
"parameters": {
"model": "qwen3.5:27b",
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.lmChatOllama",
"typeVersion": 1,
"position": [
736,
448
],
"id": "cfac7fbe-10c5-4c62-96e8-2bbf7d99dded",
"name": "Ollama Chat Model1",
"credentials": {
"ollamaApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"sessionIdType": "customKey",
"sessionKey": "={{(+new Date).toString(36).slice(-5) + Math.random().toString(36).substr(2, 5)}}",
"contextWindowLength": 6
},
"type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
"typeVersion": 1.3,
"position": [
896,
464
],
"id": "4e46500f-72db-4e96-9613-746a35e63354",
"name": "Simple Memory"
},
{
"parameters": {
"promptType": "define",
"text": "=Original-E-Mail:\nBetreff: {{ $('Email Trigger (IMAP)').item.json.subject }}\nVon: {{ $('Email Trigger (IMAP)').item.json.from }}\nInhalt: {{ $('Email Trigger (IMAP)').item.json.textPlain }}\n{{ $if($('Execute Contract Validation').isExecuted,\n\n'---\\n Informationen \u00fcber den zugesendeten Vertrag:', '') }}\n{{ $if($('Execute Contract Validation').isExecuted,$('Execute Contract Validation').item.json.output.toJsonString(), '') }}",
"options": {
"systemMessage": "=Du bist Assistent des Praktikantenamts der HTWG Konstanz.\n\nAUFGABE\nDu erzeugst ausschlie\u00dflich den Antworttext f\u00fcr eine E-Mail.\n\n\nANTWORTFORMAT\n- Schreibe 1\u20134 kurze S\u00e4tze in formeller Sie-Form.\n- Keine Anrede, keine Gru\u00dfformel, keine Signatur.\n- Verwende ausschlie\u00dflich die extrahierten Informationen.\n- Keine Erkl\u00e4rungen, keine Aufz\u00e4hlungen, keine Beispiele.\n---\n\n{{ $if($('Execute Contract Validation').isExecuted, `\n\nEingaben:\n- student_name\n- matrikelnummer\n- company_name\n- company_address\n- start_date (YYYY-MM-DD)\n- end_date (YYYY-MM-DD)\n- valid_company (boolean)\n- workdays (optional, Anzahl der Arbeitstage)\n\nRegeln:\n\n1. Satz 1 \u2013 Praxisstelle:\n - valid_company = true \u2192 \"Die Praxisstelle [company_name] ist als Praxisstelle anerkannt.\"\n - valid_company = false \u2192 \"Die Praxisstelle [company_name] ist nicht als Praxisstelle anerkannt.\"\n\n2. Satz 2 \u2013 Mindestdauer:\n - Vergleiche numerisch workdays mit 95:\n - workdays \u2265 95 \u2192 \"Die angegebene Dauer vom [start_date] bis [end_date] erf\u00fcllt die vorgeschriebene Mindestdauer von 95 Arbeitstagen.\"\n - workdays < 95 \u2192 \"Die angegebene Dauer vom [start_date] bis [end_date] unterschreitet die vorgeschriebene Mindestdauer von 95 Arbeitstagen.\"\n\nKeine weiteren S\u00e4tze. Keine Interpretation. Keine Sch\u00e4tzung. Keine zus\u00e4tzliche Information.\n`, `\nWISSENSQUELLE\nF\u00fcr alle fachlichen Fragen MUSS das Tool \"database_retriever\" verwendet werden.\nDie Wissensdatenbank ist die einzige erlaubte Informationsquelle.\n\nREGELN\n1. Bevor du eine Antwort schreibst, MUSST du das Tool \"database_retriever\" aufrufen.\n2. Die Antwort darf ausschlie\u00dflich Informationen enthalten, die vom Tool zur\u00fcckgegeben wurden.\n3. Erg\u00e4nze oder interpretiere keine Informationen selbst.\n4. Wenn keine passende Information vorhanden ist, schreibe genau:\n \"Dazu liegen in der Wissensdatenbank keine Informationen vor.\"\n\nAUSWAHL UND EXTRAKTION\n1. Bestimme zuerst die konkrete Frage aus der eingehenden E-Mail.\n2. Pr\u00fcfe alle Textabschnitte aus der Tool-Antwort.\n3. W\u00e4hle nur den Abschnitt aus, der die Frage direkt beantwortet.\n4. Alle anderen Abschnitte m\u00fcssen ignoriert werden.\n5. Extrahiere aus dem ausgew\u00e4hlten Abschnitt genau die Informationen, die die Frage beantworten.\n6. Ver\u00e4ndere keine Zahlen, Modalverben, Fristen oder Zeitangaben.\n7. Es darf nur ein Abschnitt verwendet werden.\n`) }}",
"maxIterations": 50,
"returnIntermediateSteps": false,
"enableStreaming": true
}
},
"type": "@n8n/n8n-nodes-langchain.agent",
"typeVersion": 3,
"position": [
768,
160
],
"id": "e3199d89-b513-4f58-af29-789d6eaaaf13",
"name": "Write Response for E-Mail"
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 3
},
"conditions": [
{
"id": "cf7fa5ae-a282-4221-ac79-96def2b79c36",
"leftValue": "={{ $binary.attachment_0 }}",
"rightValue": "",
"operator": {
"type": "object",
"operation": "notEmpty",
"singleValue": true
}
}
],
"combinator": "and"
},
"options": {}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.3,
"position": [
-544,
-192
],
"id": "9e01d291-eadd-4953-8819-2ff0bb3727e3",
"name": "If"
},
{
"parameters": {
"mode": "retrieve-as-tool",
"toolDescription": "Tool zum Abrufen offizieller Informationen zum Praxissemester der HTWG Konstanz.\nMuss verwendet werden, wenn eine E-Mail fachliche Fragen zum Praxissemester enth\u00e4lt.\nDie zur\u00fcckgegebenen Inhalte sind die einzige erlaubte Informationsquelle f\u00fcr die Antwort.",
"qdrantCollection": {
"__rl": true,
"value": "htwg_knowledge_base",
"mode": "list",
"cachedResultName": "htwg_knowledge_base"
},
"topK": 5,
"options": {
"contentPayloadKey": "text"
}
},
"type": "@n8n/n8n-nodes-langchain.vectorStoreQdrant",
"typeVersion": 1.3,
"position": [
1040,
464
],
"id": "2484fb3b-b90f-4621-bf64-18bf11d10b3b",
"name": "praxissemester_information_retriever",
"credentials": {
"qdrantApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"modelId": {
"__rl": true,
"value": "mistral-nemo:12b",
"mode": "list",
"cachedResultName": "mistral-nemo:12b"
},
"messages": {
"values": [
{
"content": "=Der folgende Text enth\u00e4lt einen Denkprozess und eine finale Atwort.\nExtrahiere die finale Antwort und gebe nur diese zur\u00fcck, ohne den Text darin zu ver\u00e4ndern.\nM\u00f6glicherweise enth\u00e4lt es f\u00fcr mehrere Fragen mehrere Denkprozesse. Stelle sicher, dass f\u00fcr jede Frage die finale Antwort extrahiert wird.\n\n{{ $json.output }}"
}
]
},
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.ollama",
"typeVersion": 1,
"position": [
1056,
160
],
"id": "702ea15c-4f31-40c2-820f-dd4df86041a1",
"name": "Extract response / Remove thinking",
"credentials": {
"ollamaApi": {
"name": "<your credential>"
}
}
}
],
"connections": {
"Email Trigger (IMAP)": {
"main": [
[
{
"node": "Categorize E-Mail",
"type": "main",
"index": 0
},
{
"node": "If",
"type": "main",
"index": 0
}
]
]
},
"Switch": {
"main": [
[
{
"node": "MoveEmail with International Question",
"type": "main",
"index": 0
}
],
[
{
"node": "MoveEmail with Contract Submission",
"type": "main",
"index": 0
}
],
[
{
"node": "MoveEmail with Postponement Request",
"type": "main",
"index": 0
}
],
[
{
"node": "MoveEmail which is Uncategorized",
"type": "main",
"index": 0
}
]
]
},
"Ollama Chat Model": {
"ai_languageModel": [
[
{
"node": "Categorize E-Mail",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"MoveEmail with Contract Submission": {
"main": [
[
{
"node": "Execute Contract Validation",
"type": "main",
"index": 0
}
]
]
},
"MoveEmail with International Question": {
"main": [
[
{
"node": "Forward E-Mail",
"type": "main",
"index": 0
}
]
]
},
"MoveEmail with Postponement Request": {
"main": [
[
{
"node": "Write Response for E-Mail",
"type": "main",
"index": 0
}
]
]
},
"MoveEmail which is Uncategorized": {
"main": [
[
{
"node": "Write Response for E-Mail",
"type": "main",
"index": 0
}
]
]
},
"Categorize E-Mail": {
"main": [
[
{
"node": "Switch",
"type": "main",
"index": 0
}
]
]
},
"CreateDraft email": {
"main": [
[]
]
},
"Forward E-Mail": {
"main": [
[
{
"node": "Send Notification",
"type": "main",
"index": 0
}
]
]
},
"Embeddings Ollama": {
"ai_embedding": [
[
{
"node": "praxissemester_information_retriever",
"type": "ai_embedding",
"index": 0
}
]
]
},
"Code in JavaScript": {
"main": [
[
{
"node": "CreateDraft email",
"type": "main",
"index": 0
}
]
]
},
"Execute Contract Validation": {
"main": [
[
{
"node": "Write Response for E-Mail",
"type": "main",
"index": 0
}
]
]
},
"Simple Memory": {
"ai_memory": [
[
{
"node": "Write Response for E-Mail",
"type": "ai_memory",
"index": 0
}
]
]
},
"Ollama Chat Model1": {
"ai_languageModel": [
[
{
"node": "Write Response for E-Mail",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Write Response for E-Mail": {
"main": [
[
{
"node": "Extract response / Remove thinking",
"type": "main",
"index": 0
}
]
]
},
"Structured Output Parser": {
"ai_outputParser": [
[
{
"node": "Write Response for E-Mail",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"If": {
"main": [
[
{
"node": "Upload a file",
"type": "main",
"index": 0
}
]
]
},
"praxissemester_information_retriever": {
"ai_tool": [
[
{
"node": "Write Response for E-Mail",
"type": "ai_tool",
"index": 0
}
]
]
},
"Extract response / Remove thinking": {
"main": [
[
{
"node": "Code in JavaScript",
"type": "main",
"index": 0
}
]
]
}
},
"active": true,
"settings": {
"executionOrder": "v1"
},
"versionId": "c473a7f4-bfca-48cc-90c4-07bf6aea1d52",
"meta": {
"templateCredsSetupCompleted": true
},
"id": "fp104TdG8LJYzIr8",
"tags": []
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
imapollamaApiqdrantApis3smtp
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
AI Mail Assistant. Uses emailReadImap, lmChatOllama, n8n-nodes-imap, agent. Manual trigger; 21 nodes.
Source: https://github.com/Local-AI-Workflows/Praktikantenamt-AI-Assistant/blob/1bced371cc41873ec3f7d35eea383fbbe2fadaa8/n8n-workflows/v3_AI-Mail-Assistant-with-Contract-Validation/AI-Mail-Assistant.json — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
ejemplo RAG vs CRAG. Uses googleDrive, vectorStoreQdrant, embeddingsOllama, agent. Event-driven trigger; 30 nodes.
An on-premises, domain-specific AI assistant for Kaggle (tested on binary disaster-tweet classification), combining LLM, an n8n workflow engine, and Qdrant-backed Retrieval-Augmented Generation (RAG).
AI Email processing autoresponder with approval (Yes/No). Uses emailReadImap, markdown, lmChatOpenAi, emailSend. Manual trigger; 17 nodes.
AI Email processing autoresponder with approval (Yes/No). Uses emailReadImap, markdown, lmChatOpenAi, emailSend. Manual trigger; 17 nodes.
This workflow is designed to automate the process of handling incoming emails, summarizing their content, generating appropriate responses, and obtaining approval before sending replies. Below are the