Phishing Email Detection with AI Analysis and Jira Ticket Creation

High-Level Summary

This workflow automatically detects potential phishing emails by monitoring your Gmail (and optionally Outlook) inbox, capturing a screenshot of the email's HTML content, analyzing it with OpenAI's ChatGPT-4, and creating a detailed Jira ticket with the analysis and screenshot. It is designed for security teams or IT support who want to streamline phishing reporting and ensure no suspicious email goes uninvestigated.

By combining email triggers, HTML-to-image conversion, AI-powered analysis, and ticketing, this workflow reduces manual effort and provides a consistent, documented process for handling phishing threats.

Node-by-Node Walkthrough

1. Email Triggers (Two Branches)

  • Gmail Trigger (OAuth2) — Polls your Gmail inbox every minute for new emails. When a new email arrives, it outputs the email data (subject, body, headers, etc.).
  • Microsoft Outlook Trigger (OAuth2) — Disabled by default. Polls your Outlook inbox every minute. If enabled, it outputs email fields like body, subject, and recipients.

2. Data Extraction and Variable Setting

  • Set Gmail Variables (No auth) — Extracts key fields from the Gmail trigger output: htmlBody, headers, subject, recipient, and textBody. These are stored as workflow variables for later use.
  • Retrieve Headers of Email (OAuth2 – Microsoft Outlook) — For the Outlook branch, this HTTP request fetches the full internet message headers and plain-text body from Microsoft Graph API using the email ID.
  • Format Headers (No auth) — A Code node that transforms the raw headers array into a clean object (e.g., { "Received": [...], "From": [...] }) for easier reading.
  • Set Outlook Variables (No auth) — Similar to the Gmail branch, it assigns htmlBody, headers, subject, recipient, and textBody from the Outlook data.

3. HTML Screenshot Generation

  • Set Email Variables (No auth) — Merges the variables from either the Gmail or Outlook branch into a single set of fields (including htmlBody). It also preserves all other fields from the incoming data.
  • Screenshot HTML (HTTP Basic Auth – hcti.io) — Sends the email's HTML body to the hcti.io API via a POST request. The API generates a screenshot of the HTML and returns a URL to the image.
  • Retrieve Screenshot (HTTP Basic Auth – hcti.io) — Fetches the actual image binary from the URL returned by the previous node. The image is stored as binary data for attachment.

4. AI Analysis with ChatGPT

  • ChatGPT Analysis (API Key – OpenAI) — Sends the email screenshot (as base64) and the headers to OpenAI's ChatGPT-4 model with a prompt to describe the image and determine if it could be a phishing email. The response is formatted for Jira's wiki-style renderer (no code blocks).

5. Jira Ticket Creation and Attachment

  • Create Jira Ticket (OAuth2 or Basic Auth – Jira) — Creates a new issue in the specified Jira project (e.g., "Support") with a summary like "Phishing Email Reported: "[subject]"". The description includes the recipient, subject, body text, and the ChatGPT analysis.
  • Rename Screenshot (No auth) — A Code node that renames the binary file to emailScreenshot.png for clarity.
  • Upload Screenshot of Email to Jira (OAuth2 or Basic Auth – Jira) — Attaches the renamed screenshot to the newly created Jira ticket, providing visual evidence of the email.

Setup Instructions

To use this workflow, you need the following accounts and credentials:

  • Gmail – Enable the Gmail API in Google Cloud Console and create OAuth2 credentials. Authorize the n8n Gmail Trigger node with those credentials.
  • Microsoft Outlook (optional) – Register an app in Azure AD, grant the Mail.Read permission, and set up OAuth2 credentials for the Microsoft Outlook Trigger and HTTP Request nodes.
  • hcti.io – Sign up at htmlcsstoimage.com to get an API key and user ID. Use these as HTTP Basic Auth credentials in the Screenshot HTML and Retrieve Screenshot nodes.
  • OpenAI – Create an API key from your OpenAI account. Use it in the ChatGPT Analysis node.
  • Jira – Obtain a Jira API token (or use OAuth2) and configure the Jira nodes with your instance URL, project key, and issue type IDs.

All credentials are managed in n8n's Credentials section. The workflow uses the following credential types:

  • Gmail OAuth2
  • Microsoft Outlook OAuth2
  • HTTP Basic Auth (for hcti.io)
  • OpenAI API
  • Jira API (Basic Auth or OAuth2)

Use Cases and Variations

  • Security Operations – Automate phishing reporting for SOC teams. The workflow can be extended to send alerts to Slack or email.
  • Compliance – Keep a record of all reported phishing attempts with screenshots and AI analysis for audit trails.
  • Multi-Email Integration – The Outlook branch is disabled but can be enabled to monitor both Gmail and Outlook simultaneously.
  • Custom Analysis – Modify the ChatGPT prompt to ask for specific indicators (e.g., spoofed domains, urgency language).
  • Alternative Screenshot Service – If you self-host n8n, replace hcti.io with a local Puppeteer or Playwright node to avoid sending email content to a third party.
  • Different Ticketing Systems – Replace Jira nodes with ServiceNow, Zendesk, or a custom webhook.

Note: The Outlook trigger and related nodes are disabled by default. To use them, enable the nodes and configure the Microsoft Outlook OAuth2 credentials.

18 nodesmanual triggerSupport
HTTP RequestSetCodeOpen AIJiraSticky Note

Workflow JSON

{
  "meta": {
    "instanceId": "03e9d14e9196363fe7191ce21dc0bb17387a6e755dcc9acc4f5904752919dca8"
  },
  "nodes": [
    {
      "id": "1bad6bfc-9ec9-48a5-b8f7-73c4de3d08cf",
      "name": "Gmail Trigger",
      "type": "n8n-nodes-base.gmailTrigger",
      "position": [
        1480,
        160
      ],
      "parameters": {
        "simple": false,
        "filters": {},
        "options": {},
        "pollTimes": {
          "item": [
            {
              "mode": "everyMinute"
            }
          ]
        }
      },
      "credentials": {
        "gmailOAuth2": {
          "id": "kkhNhqKpZt6IUZd0",
          "name": " Gmail"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "9ac747a1-4fd8-46ba-b4c1-75fd17aab2ed",
      "name": "Microsoft Outlook Trigger",
      "type": "n8n-nodes-base.microsoftOutlookTrigger",
      "disabled": true,
      "position": [
        1480,
        720
      ],
      "parameters": {
        "fields": [
          "body",
          "toRecipients",
          "subject",
          "bodyPreview"
        ],
        "output": "fields",
// ... truncated (copy to see full JSON)

How to Import This Workflow

  1. 1Copy the workflow JSON above using the Copy Workflow JSON button.
  2. 2Open your n8n instance and go to Workflows.
  3. 3Click Import from JSON and paste the copied workflow.

Don't have an n8n instance? Start your free trial at n8nautomation.cloud

Related Templates

AI Customer Support Chatbot with Elasticsearch Knowledge Base

Overview This workflow transforms a webhook endpoint into an intelligent customer support chatbot. It receives a customer question, searches a knowledge base stored in Elasticsearch, and generates a helpful, context-aware reply using OpenAI's GPT-4. The bot is designed to reduce human workload by answering common queries instantly, and gracefully escalates to a human agent when the answer is not found. It's ideal for embedding into a website, messaging app, or any frontend that can send HTTP POST requests. Node-by-Node Breakdown Chatbot Webhook (Frontend Trigger) — Type: (No auth) - Listens for POST requests at the path . The webhook ID is . This is the entry point where your frontend sends the customer's question as JSON body (e.g., ). Extract Customer Query — Type: (No auth) - Extracts from the incoming JSON body using a simple JavaScript code snippet: . This prepares the query for the next steps. Search Knowledge Base (Elasticsearch) — Type: (Requires Elasticsearch credentials – basic auth / API key) - Performs a search on the index using the extracted question as the query. The parameter is set to . It returns matching documents from the knowledge base. Generate AI Response with GPT-4 — Type: (API Key auth) - Uses the model to generate a response. The system message instructs the assistant to use the provided knowledge base content and to politely escalate if the answer is not found. The user message combines the customer question and the top knowledge base result (). Format Chatbot Reply — Type: (No auth) - Extracts the final reply from the OpenAI response: . This ensures the output is properly structured. Return Chatbot Reply — Type: (No auth) - Sends the formatted reply back to the caller (the frontend) as a JSON response. Setup Instructions Elasticsearch: You need a running Elasticsearch instance (cloud or self-hosted) with an index named . Populate it with documents containing your knowledge base articles (e.g., each document should have a field). Configure the Elasticsearch node in n8n with your host, port, and authentication credentials (API key or username/password). OpenAI: Obtain an API key from OpenAI. Add it as a credential in n8n (type: OpenAI API). Webhook URL: After activating the workflow, n8n will generate a unique webhook URL (e.g., ). Use this URL in your frontend (website, chatbot widget, etc.) to send POST requests. Activate the workflow: Toggle the workflow to active in n8n for the webhook to start listening. Use Cases & Adaptations Customer Support Portal: Embed the webhook URL in a live chat widget on your website to answer FAQs instantly. Slack or Discord Bot: Replace the webhook trigger with a Slack/Discord trigger and adjust the response format to send messages back to the channel. Multiple Knowledge Bases: Modify the Elasticsearch query to search across multiple indices or filter by category. Fallback to Human: Customize the GPT-4 system message to trigger a notification (e.g., email or Slack message) when the answer is not found. Model Upgrade: Swap for to reduce cost or use a custom fine-tuned model. Language Support: Add a language detection step before the query to route to different knowledge bases or translate the response.

6 nodes

Receive and Reply to Messages Across WhatsApp, Instagram, and Facebook Messenger with Fiwano

Overview This workflow provides a unified integration for receiving and replying to messages from WhatsApp, Instagram Direct Messages, and Facebook Messenger using the Fiwano platform. It demonstrates how to handle incoming messages from all three Meta-owned messaging channels through a single trigger and action node set, eliminating the need to build separate integrations for each platform. The workflow is ideal for customer support, lead response, or any scenario where you need to manage multi-channel messaging from one n8n instance. Workflow Steps Fiwano Trigger (API Key auth) — This node listens for incoming messages from all connected channels (WhatsApp, Instagram, Facebook Messenger). It uses the parameter to automatically register the workflow for every active channel in your Fiwano account. The trigger fires on "Message Received" events and provides a normalized payload regardless of which channel the message came from. Example — route by message type (No auth) — This is an IF node that checks the field from the incoming message. It routes messages into two branches: one for text messages (where equals "text") and another for all other message types (images, audio, video, documents, etc.). This demonstrates how to implement different reply logic based on message content type. Example — send text reply (API Key auth) — This Fiwano Send node replies to text messages. It uses the following parameters: - : Taken from the incoming message's field to ensure the reply goes back through the same channel - : Set to the sender's ID from - : A template that echoes the user's message: Example — send attachment reply (API Key auth) — This second Fiwano Send node handles replies to non-text messages (attachments). Its parameters: - : Same as above, using - : Same as above, using - : Acknowledges the attachment type: Setup Instructions Prerequisites A Fiwano account (sign up at fiwano.com) At least one connected messaging channel (WhatsApp Business API, Instagram Professional account, or Facebook Page connected to Messenger) n8n instance (self-hosted or cloud) with public accessibility for webhook triggers Installation Steps Install the n8n-nodes-fiwano community package in your n8n editor (verified package available in the n8n community nodes registry) Create a Fiwano API credential in n8n with your API key from the Fiwano portal (Recommended) Set a Webhook Secret on the credential for signature verification Connect your messaging channels through the Fiwano portal or their channel-connection API Save and activate the workflow — the trigger will auto-register for all active channels Use Cases and Variations Primary Use Cases Customer Support: Route incoming messages to a helpdesk or ticketing system based on message content or sender Lead Response: Automatically reply to inquiries from ads or business pages with personalized messages Notification System: Forward messages to Slack, email, or other internal tools Adaptation Ideas Replace the simple IF router with a more complex decision tree using Switch nodes or AI classification Add a database lookup (e.g., Airtable, Google Sheets) to check if the sender is an existing customer Integrate with OpenAI or other AI services to generate intelligent replies Add logging to a spreadsheet or database for analytics Implement different response templates for each channel type using the field Add human handoff logic when the AI or automated response cannot handle the query Important Notes The normalized payload from Fiwano includes: , (whatsapp/instagram/messenger), , , , , and (for attachments) You typically don't need to branch by channel type unless your business logic requires channel-specific behavior n8n must be publicly reachable for the webhook trigger to receive messages from Fiwano

6 nodes

HR & IT Helpdesk Chatbot with Audio Transcription on Telegram

Overview This workflow builds a fully functional HR & IT helpdesk chatbot that operates through Telegram. It ingests internal policy documents (e.g., employee handbooks, IT FAQs), creates a searchable knowledge base using vector embeddings stored in PostgreSQL, and then answers employee questions via text or voice messages. The chatbot uses Retrieval-Augmented Generation (RAG) to provide accurate, context-aware responses based on your company's specific policies. This is particularly useful for organizations that want to automate common HR and IT inquiries, reduce the burden on support teams, and provide 24/7 self-service to employees. The inclusion of voice message transcription makes it accessible for users who prefer speaking over typing. Workflow Steps Phase 1: Knowledge Base Ingestion (Run Once or on Update) When clicking 'Test workflow' (Manual Trigger — No auth) — This node starts the ingestion process manually. It is intended to be run once when setting up the workflow or whenever the policy documents are updated. HTTP Request (HTTP Request — No auth) — Fetches a PDF file from a public URL (in this example, an employee handbook from an S3 bucket). The URL can be changed to point to any PDF hosted online or on a shared drive. Extract from File (Extract from File — No auth) — Parses the downloaded PDF and extracts its text content. The operation is set to "pdf" to handle PDF documents. Recursive Character Text Splitter (Text Splitter — No auth) — Splits the extracted text into smaller chunks of 2000 characters each. This is necessary for creating meaningful vector embeddings and for efficient retrieval. Default Data Loader (Document Loader — No auth) — Converts the text chunks into document objects that can be stored in the vector store. It takes the text from the Extract from File node using the expression . Embeddings OpenAI (Embeddings — OpenAI API Key auth) — Generates vector embeddings for each text chunk using OpenAI's embedding models. These embeddings represent the semantic meaning of the text. Create HR Policies (PostgreSQL PGVector Store — Database credentials auth) — Inserts the document chunks and their embeddings into a PostgreSQL database with pgvector extension. This creates the searchable knowledge base. Phase 2: Chatbot Runtime Telegram Trigger (Telegram Trigger — Telegram Bot Token auth) — Listens for incoming messages on a Telegram bot. It captures all messages (text, voice, etc.) sent to the bot. Verify Message Type (Switch — No auth) — Routes messages based on their type: - Text messages (containing ) → sent to the AI agent - Voice messages (containing ) → sent for transcription - Other types → sent to a fallback response Edit Fields (Set — No auth) — For text messages, extracts the text content and passes it to the AI agent. Uses the expression . Telegram1 (Telegram — Telegram Bot Token auth) — For voice messages, downloads the audio file from Telegram using the from the incoming message. OpenAI (OpenAI — OpenAI API Key auth) — Transcribes the downloaded voice message into text using OpenAI's Whisper transcription API. The operation is set to "transcribe" and the binary property is set to "data". Unsupported Message Type (Telegram — Telegram Bot Token auth) — Sends a fallback message "I'm not able to process this message type." for unsupported message types (e.g., stickers, locations). AI Agent (AI Agent — No auth) — The core conversational agent. It receives the user's text (either directly or transcribed from voice) and generates a response. The system message is set to "You are a helpful assistant for HR and employee policies". OpenAI Chat Model (Chat Model — OpenAI API Key auth) — The language model powering the AI agent. It generates natural language responses based on the context and retrieved information. Postgres Chat Memory (Memory — Database credentials auth) — Maintains conversation history per user, using the Telegram chat ID as the session key. This allows the chatbot to remember context across multiple messages. Answer questions with a vector store (Vector Store Tool — No auth) — A tool that the AI agent uses to query the knowledge base. It is configured with the name "hremployeepolicies" and description "data for HR and employee policies". Postgres PGVector Store (Vector Store — Database credentials auth) — The actual vector store connection that retrieves relevant document chunks based on the user's query. OpenAI Chat Model1 (Chat Model — OpenAI API Key auth) — A second language model instance used specifically by the vector store tool for re-ranking or summarizing retrieved results. Embeddings OpenAI1 (Embeddings — OpenAI API Key auth) — A second embeddings instance used by the vector store tool to embed the user's query for similarity search. Telegram (Telegram — Telegram Bot Token auth) — Sends the AI agent's response back to the user in the same Telegram chat. Uses the expression for the response text. Setup Instructions Prerequisites OpenAI Account: You need an OpenAI API key with access to: - GPT-4 or GPT-3.5 for chat completion - text-embedding-ada-002 for embeddings - Whisper for audio transcription Telegram Bot: Create a bot via @BotFather on Telegram and obtain the bot token. PostgreSQL Database: A PostgreSQL database with the pgvector extension installed. You can use: - A local PostgreSQL instance - A cloud provider like Supabase, Aiven, or AWS RDS Configuration Steps Set up credentials in n8n: - OpenAI API: Add your OpenAI API key as a credential - Telegram Bot: Add your bot token as a credential - PostgreSQL: Add your database connection details (host, port, database name, user, password) Update the PDF URL: In the HTTP Request node, change the URL to point to your own policy documents (e.g., company handbook, IT policies, FAQs). Run the ingestion: Click "Test Workflow" on the When clicking 'Test workflow' node to populate the vector store with your documents. Set the webhook: Activate the workflow and set the Telegram webhook URL to your n8n instance's webhook URL (provided by the Telegram Trigger node). Test the chatbot: Send a text or voice message to your Telegram bot and verify it responds with relevant information from your policies. Use Cases and Variations Primary Use Cases HR Helpdesk: Answer questions about leave policies, benefits, payroll, company culture, and onboarding procedures. IT Support Desk: Provide troubleshooting steps for common IT issues, password reset instructions, software access requests, and hardware policies. Employee Onboarding: New hires can ask questions about company policies, team structures, and first-day procedures. Possible Variations Multiple Document Sources: Instead of a single PDF, use multiple HTTP Request nodes or connect to Google Drive, SharePoint, or Confluence to ingest documents from various sources. Different Channels: Replace the Telegram trigger with Slack, Microsoft Teams, or a web chat widget to deploy the chatbot on other platforms. Multi-language Support: Configure the OpenAI model to respond in multiple languages based on user preference or detected language. Human Handoff: Add a condition to escalate complex queries to a human agent via email or a ticketing system. Feedback Loop: Add a mechanism for users to rate responses and use that feedback to improve the knowledge base. Scheduled Re-indexing: Add a Cron trigger to periodically re-ingest documents to keep the knowledge base up to date.

27 nodes

Ready to automate with n8n?

Get affordable managed n8n hosting with 24/7 support.