{"id":1250,"date":"2026-09-17T09:45:00","date_gmt":"2026-09-16T23:45:00","guid":{"rendered":"https:\/\/catharsis.net.au\/blog\/how-to-spot-a-phishing-email\/"},"modified":"2026-11-03T21:46:53","modified_gmt":"2026-11-03T10:46:53","slug":"how-to-spot-a-phishing-email","status":"publish","type":"post","link":"https:\/\/catharsis.net.au\/blog\/how-to-spot-a-phishing-email\/","title":{"rendered":"How do you spot a phishing email? Red flags and a free trainer"},"content":{"rendered":"\n<p class=\"has-pale-cyan-blue-background-color has-background wp-block-paragraph\">Most phishing emails give themselves away in four places: the sender, the request, the links and the pressure. Here are the red flags to check, how the common Australian scams work, and a free trainer you can paste a suspicious email into or practise on with your team.<\/p>\n\n\n\n<div class=\"wp-block-group has-background\" style=\"background-color:#f4f6f8;padding-top:28px;padding-right:32px;padding-bottom:28px;padding-left:32px\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-container-core-group-is-layout-40de7cf3 wp-block-group-is-layout-constrained\">\n\n<p class=\"wp-block-paragraph\"><strong>Related guides<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><a href=\"https:\/\/catharsis.net.au\/blog\/christmas-invoice-fraud-call-back-checklist\/\" target=\"_blank\" rel=\"noreferrer noopener\">Christmas Invoice Fraud: A Call-Back Checklist for Accounts Teams<\/a><\/li>\n\n\n<li><a href=\"https:\/\/catharsis.net.au\/blog\/device-code-phishing-microsoft-365\/\" target=\"_blank\" rel=\"noreferrer noopener\">MFA isn&#8217;t enough: how device-code phishing hijacks Microsoft 365<\/a><\/li>\n\n\n<li><a href=\"https:\/\/catharsis.net.au\/blog\/business-email-hacked-first-hour\/\" target=\"_blank\" rel=\"noreferrer noopener\">Business Email Hacked? What to Do in the First Hour<\/a><\/li>\n\n\n<li><a href=\"https:\/\/catharsis.net.au\/blog\/spf-dkim-dmarc-microsoft-365-com-au\/\" target=\"_blank\" rel=\"noreferrer noopener\">How to Set Up SPF, DKIM and DMARC for .com.au in Microsoft 365<\/a><\/li>\n\n<\/ul>\n\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-group has-background\" style=\"background-color:#f4f6f8;padding-top:28px;padding-right:32px;padding-bottom:28px;padding-left:32px\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-container-core-group-is-layout-40de7cf3 wp-block-group-is-layout-constrained\">\n\n<h3 class=\"wp-block-heading\">TL;DR<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>You spot a phishing email by checking four things before you act: <strong>who it&#8217;s really from, what it wants you to do, where the links really go, and how hard it pushes you<\/strong>.<\/li>\n\n\n<li>The requests that matter most are a change of bank details, a sign-in or password prompt, a request for a code, gift cards, and &quot;enable content&quot; on an attachment. Any one of them means you stop and verify.<\/li>\n\n\n<li>Verify through a channel you already trust: a phone number you already hold, the app, or a bookmark. Never use the contact details in the message.<\/li>\n\n\n<li>Phishing was the most reported scam to Scamwatch in 2025, with 65,361 reports. It doesn&#8217;t have to be clever to work. It only has to catch someone in a hurry.<\/li>\n\n\n<li>Use the trainer below to check a suspicious email or to practise on eight invented examples. It&#8217;s a learning aid, not a filter: it runs in your browser, treats what you paste as plain text, and never opens a link or sends anything anywhere.<\/li>\n\n<\/ul>\n\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-group has-background\" style=\"background-color:#f4f6f8;padding-top:28px;padding-right:32px;padding-bottom:28px;padding-left:32px\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-container-core-group-is-layout-40de7cf3 wp-block-group-is-layout-constrained\">\n\n<h3 class=\"wp-block-heading\">In this post<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><a href=\"#why-phishing-still-works\">Why phishing still works<\/a><\/li>\n\n\n<li><a href=\"#the-30-second-check-four-questions\">The 30-second check: four questions<\/a><\/li>\n\n\n<li><a href=\"#the-red-flags-one-by-one\">The red flags, one by one<\/a><\/li>\n\n\n<li><a href=\"#real-patterns-explained-with-the-links-removed\">Real patterns, explained (with the links removed)<\/a><\/li>\n\n\n<li><a href=\"#how-to-check-the-headers-when-the-email-looks-right\">How to check the headers (when the email looks right)<\/a><\/li>\n\n\n<li><a href=\"#what-to-do-with-a-suspicious-email\">What to do with a suspicious email<\/a><\/li>\n\n\n<li><a href=\"#a-simple-anti-phishing-routine-for-your-organisation\">A simple anti-phishing routine for your organisation<\/a><\/li>\n\n\n<li><a href=\"#key-takeaways\">Key takeaways<\/a><\/li>\n\n\n<li><a href=\"#sources\">Sources<\/a><\/li>\n\n<\/ul>\n\n<\/div><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"why-phishing-still-works\">Why phishing still works<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Phishing is an email, text or call that pretends to come from someone you trust so you&#8217;ll hand over a password, a code, money or access. The Australian Cyber Security Centre (ACSC) warns that these messages can look genuine and convincing. Looking for spelling mistakes isn&#8217;t enough. Many phishing emails are well written, and some are sent from a genuine account that has already been taken over.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The numbers show why it&#8217;s worth a few minutes of training. In 2025, phishing was the most reported scam to Scamwatch, with 65,361 reports, according to the ACCC and the National Anti-Scam Centre. In the combined data from Scamwatch, ReportCyber and the other organisations that share scam reports with the National Anti-Scam Centre, reported losses to phishing were $97.6 million. Payment redirection, a close cousin that often targets businesses, accounted for a further $166.8 million.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The good news is that phishing relies on a small set of tricks, and once you know them most attempts become obvious.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"the-30-second-check-four-questions\">The 30-second check: four questions<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Before you click, reply, pay, scan or open anything, ask:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n\n<li><strong>Who is it really from?<\/strong> Look past the display name at the actual address, and at where a reply would go.<\/li>\n\n\n<li><strong>What does it want me to do?<\/strong> Sign in, pay, change details, share a code, buy something, open a file, scan a code or call a number. The request is the most important red flag.<\/li>\n\n\n<li><strong>Where do the links really go?<\/strong> The text you see can say anything. The real address is what counts.<\/li>\n\n\n<li><strong>How hard is it pushing?<\/strong> Deadlines, threats and secrecy are there to stop you checking.<\/li>\n\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">If the answer to the second question is anything involving money, passwords, codes or files, verify the request through a separate channel even if everything else looks right.<\/p>\n\n\n\n<div id=\"cat-phishing-check\">\n<style>\n#cat-phishing-check{background:#f4f6f8;border-radius:12px;padding:20px;margin:8px 0 24px;color:#1f2328;max-width:100%;overflow-wrap:anywhere}\n#cat-phishing-check *{box-sizing:border-box}\n#cat-phishing-check .cat-disclaimer{background:#fff;border-left:4px solid #0a5fb4;border-radius:6px;padding:10px 12px;margin:0 0 14px;font-size:15px}\n#cat-phishing-check .cat-disclaimer p{margin:0}\n#cat-phishing-check .cat-disclaimer p+p{margin-top:6px}\n#cat-phishing-check [role=tablist]{display:flex;flex-wrap:wrap;gap:6px;margin:0 0 16px;border-bottom:2px solid #dde3ea;padding-bottom:10px}\n#cat-phishing-check [role=tab]{font-size:15px;padding:8px 14px;border:1px solid #c5ced8;border-radius:999px;background:#fff;color:#32373c;cursor:pointer}\n#cat-phishing-check [role=tab][aria-selected=true]{background:#32373c;color:#fff;border-color:#32373c}\n#cat-phishing-check label,#cat-phishing-check legend{display:block;font-size:15px;font-weight:600;margin:0 0 6px}\n#cat-phishing-check textarea,#cat-phishing-check select{width:100%;font-size:16px;padding:10px 12px;border:1px solid #b8c2cc;border-radius:8px;background:#fff;color:#1f2328}\n#cat-phishing-check textarea{min-height:200px;resize:vertical;font-family:ui-monospace,Menlo,Consolas,monospace;font-size:15px}\n#cat-phishing-check textarea:focus-visible,#cat-phishing-check select:focus-visible,#cat-phishing-check button:focus-visible,#cat-phishing-check input:focus-visible,#cat-phishing-check pre:focus-visible{outline:3px solid #0a66c2;outline-offset:1px}\n#cat-phishing-check .cat-hint,#cat-phishing-check .cat-note{font-size:14px;color:#55606b;margin:6px 0 0}\n#cat-phishing-check .cat-btn{font-size:15px;padding:9px 16px;border-radius:8px;border:1px solid #32373c;background:#32373c;color:#fff;cursor:pointer;margin:12px 8px 0 0}\n#cat-phishing-check .cat-btn-alt{background:#fff;color:#32373c}\n#cat-phishing-check .cat-err{color:#a4002b;font-weight:600;margin:12px 0 0}\n#cat-phishing-check .cat-out{margin-top:14px}\n#cat-phishing-check .cat-summary{font-weight:600;margin:10px 0 0}\n#cat-phishing-check .cat-bad{color:#a4002b}\n#cat-phishing-check .cat-flags{list-style:none;padding:0;margin:12px 0 0}\n#cat-phishing-check .cat-flag{background:#fff;border:1px solid #dde3ea;border-left-width:5px;border-radius:8px;padding:10px 12px;margin:0 0 10px}\n#cat-phishing-check .cat-sev-high{border-left-color:#a4002b}\n#cat-phishing-check .cat-sev-medium{border-left-color:#b36b00}\n#cat-phishing-check .cat-sev-low{border-left-color:#6b7785}\n#cat-phishing-check .cat-flag-head{margin:0;display:flex;flex-wrap:wrap;gap:8px;align-items:center}\n#cat-phishing-check .cat-badge{font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;padding:2px 8px;border-radius:999px;background:#eef1f4;color:#33404d}\n#cat-phishing-check .cat-sev-high .cat-badge{background:#fbe9ee;color:#8a0024}\n#cat-phishing-check .cat-sev-medium .cat-badge{background:#fff3e0;color:#7a4a00}\n#cat-phishing-check .cat-why{margin:6px 0 0;font-size:15px}\n#cat-phishing-check .cat-ev{margin:8px 0 0;padding-left:18px;font-size:14px;color:#33404d}\n#cat-phishing-check .cat-ev li{margin:3px 0;font-family:ui-monospace,Menlo,Consolas,monospace;word-break:break-word}\n#cat-phishing-check .cat-mail{white-space:pre-wrap;word-break:break-word;background:#fff;border:1px solid #c5ced8;border-radius:8px;padding:12px;font-family:ui-monospace,Menlo,Consolas,monospace;font-size:14px;margin:8px 0 0;max-height:360px;overflow:auto}\n#cat-phishing-check .cat-tr-label{font-size:13px;font-weight:700;color:#8a0024;text-transform:uppercase;letter-spacing:.04em;margin:12px 0 0}\n#cat-phishing-check fieldset{border:0;padding:0;margin:14px 0 0;min-width:0}\n#cat-phishing-check .cat-boxes{display:grid;grid-template-columns:1fr 1fr;gap:4px 16px}\n#cat-phishing-check .cat-boxes label{font-weight:400;display:flex;gap:8px;align-items:flex-start;margin:4px 0}\n#cat-phishing-check .cat-boxes input{margin-top:4px;flex:none}\n#cat-phishing-check .cat-h{font-size:16px;margin:14px 0 4px}\n#cat-phishing-check .cat-msgs{margin:4px 0 0;padding-left:20px}\n#cat-phishing-check .cat-foot{font-size:13px;color:#55606b;margin:16px 0 0}\n#cat-phishing-check .cat-foot a{color:#0a5fb4}\n@media (max-width:640px){#cat-phishing-check{padding:14px}#cat-phishing-check .cat-boxes{grid-template-columns:1fr}}\n<\/style>\n\n<div class=\"cat-disclaimer\">\n<p><strong>Educational, not a filter.<\/strong> This trainer checks pasted text against common red flags. It can&#8217;t tell you an email is safe, and it doesn&#8217;t replace your email security or your judgement. Indicative only. General information, not legal advice or a formal assessment.<\/p>\n<p>Everything stays in your browser: the text is never sent, stored or shown as a web page, and links in it are never opened. Remove personal information (names, account numbers) before pasting.<\/p>\n<\/div>\n\n<div role=\"tablist\" aria-label=\"Phishing trainer\">\n<button type=\"button\" role=\"tab\" id=\"cat-ph-tab-check\" aria-controls=\"cat-ph-panel-check\" aria-selected=\"true\">Check an email<\/button>\n<button type=\"button\" role=\"tab\" id=\"cat-ph-tab-train\" aria-controls=\"cat-ph-panel-train\" aria-selected=\"false\" tabindex=\"-1\">Training: spot the flags<\/button>\n<\/div>\n\n<div role=\"tabpanel\" id=\"cat-ph-panel-check\" aria-labelledby=\"cat-ph-tab-check\">\n<form id=\"cat-ph-form\" novalidate>\n<label for=\"cat-ph-input\">Paste the text of a suspicious email<\/label>\n<textarea id=\"cat-ph-input\" maxlength=\"20000\" spellcheck=\"false\" autocomplete=\"off\" aria-describedby=\"cat-ph-hint cat-ph-count\" placeholder=\"From: ...  Subject: ...  then the message text\"><\/textarea>\n<p id=\"cat-ph-hint\" class=\"cat-hint\">Copy the message text. For a fuller check, include the From, Reply-To and Authentication-Results lines from the message details or source. Up to 20,000 characters.<\/p>\n<p id=\"cat-ph-count\" class=\"cat-hint\" aria-live=\"off\"><\/p>\n<button type=\"submit\" class=\"cat-btn\">Check for red flags<\/button><button type=\"button\" id=\"cat-ph-clear\" class=\"cat-btn cat-btn-alt\">Clear<\/button>\n<\/form>\n<div id=\"cat-ph-out\" class=\"cat-out\" aria-live=\"polite\"><\/div>\n<\/div>\n\n<div role=\"tabpanel\" id=\"cat-ph-panel-train\" aria-labelledby=\"cat-ph-tab-train\" hidden>\n<label for=\"cat-tr-pick\">Choose an example email<\/label>\n<select id=\"cat-tr-pick\"><\/select>\n<p id=\"cat-tr-title\" class=\"cat-tr-label\"><\/p>\n<pre id=\"cat-tr-mail\" class=\"cat-mail\" tabindex=\"0\" aria-labelledby=\"cat-tr-title\"><\/pre>\n<form id=\"cat-tr-form\" novalidate>\n<fieldset>\n<legend>Which red flags can you see? Tick all that apply (or none, if you think it&#8217;s genuine).<\/legend>\n<div id=\"cat-tr-boxes\" class=\"cat-boxes\"><\/div>\n<\/fieldset>\n<button type=\"submit\" class=\"cat-btn\">Check my answers<\/button>\n<\/form>\n<div id=\"cat-tr-out\" class=\"cat-out\" aria-live=\"polite\"><\/div>\n<\/div>\n\n<p class=\"cat-foot\">The red flags follow the Australian Cyber Security Centre&#8217;s <a href=\"https:\/\/www.cyber.gov.au\/guidance\/learn-about-phishing-scams\" target=\"_blank\" rel=\"noopener noreferrer\">warning signs of phishing<\/a> and <a href=\"https:\/\/www.scamwatch.gov.au\/types-of-scams\/phishing-scams\" target=\"_blank\" rel=\"noopener noreferrer\">Scamwatch<\/a> guidance. Training emails are invented and use reserved example domains. Received a suspicious email at work? Use your email&#8217;s Report button or tell your IT team, and report scams to Scamwatch or, if you lost money or data, through <a href=\"https:\/\/www.cyber.gov.au\/submit-a-report\" target=\"_blank\" rel=\"noopener noreferrer\">ReportCyber<\/a>.<\/p>\n<script>(function () {\n  'use strict';\n  \/\/ Catharsis phishing red-flag trainer. Educational only: it is not a spam filter and gives no verdict.\n  \/\/ Pasted text is treated strictly as plain text. It is never parsed as markup or rendered, links in it are\n  \/\/ never followed, fetched or made clickable, and nothing is stored or sent anywhere. Output is written with\n  \/\/ textContent only. Input is capped at 20,000 characters and every list is capped, so no paste can freeze\n  \/\/ the page. The source contains no ampersand character (WordPress rewrites it): nested ifs replace the\n  \/\/ logical AND operator.\n  \/\/ Red flags follow the ACSC \"Learn about phishing scams\" warning signs (cyber.gov.au, reviewed 9 Apr 2026)\n  \/\/ and Scamwatch phishing guidance (scamwatch.gov.au).\n\n  var MAX_INPUT = 20000;\n  var MAX_EVIDENCE = 3;\n  var MAX_URLS = 100;\n  var MAX_HOSTS = 100;\n\n  var CATS = [\n    { id: 'payment', label: 'Payment or bank-detail change', severity: 'high', why: 'Requests to pay a new account, or news that a supplier\\'s bank details have changed, are the core of invoice and payment-redirection scams. Always confirm by phone using a number you already have, never one in the email.' },\n    { id: 'credentials', label: 'Asks you to sign in or confirm a password', severity: 'high', why: 'Messages that push you to sign in, confirm your account or keep a password usually lead to a fake sign-in page that captures what you type. Go to the service yourself, by bookmark or app, not through the link.' },\n    { id: 'mfa', label: 'Asks for a code or to approve a sign-in', severity: 'high', why: 'A one-time or verification code is the last thing protecting your account. No genuine organisation asks you to read it out, forward it or approve a sign-in you didn\\'t start. Entering a code someone sends you on a real sign-in page (device code phishing) can hand them your account too.' },\n    { id: 'giftcard', label: 'Gift cards or unusual payment', severity: 'high', why: 'Requests to buy gift cards, send the codes, or pay in cryptocurrency are a classic scam: the money is gone the moment the codes are shared.' },\n    { id: 'attachment', label: 'Risky attachment or \"enable content\"', severity: 'high', why: 'Being told to click Enable Content or Enable Editing, or to open a macro-enabled, script, disc image or shortcut file, is how many malware infections start. Microsoft blocks macros from the internet by default for this reason.' },\n    { id: 'lookalike', label: 'Lookalike or disguised domain', severity: 'high', why: 'Scammers register domains one character away from a real one, put a trusted name in front of their own domain, or use characters that look like Latin letters. Read a domain from the right: the part just before the ending is who really owns it.' },\n    { id: 'linktext', label: 'Link text doesn\\'t match where it goes', severity: 'high', why: 'The text you see can say anything. When the visible address and the real link point to different domains, the link is disguised. Hover (or long-press) to see the real address, and don\\'t click if they differ.' },\n    { id: 'sender', label: 'Sender details don\\'t add up', severity: 'medium', why: 'The display name is easy to fake. Check the actual address after it, whether replies go somewhere else, and whether an \"official\" message comes from a free email account. Failed SPF, DKIM or DMARC checks in the headers mean the message may not be from who it claims.' },\n    { id: 'urgency', label: 'Urgency or pressure', severity: 'medium', why: 'Pressure to act quickly is designed to stop you checking. Real organisations give you time. Slow down and verify through a channel you already trust.' },\n    { id: 'threat', label: 'Threats or consequences', severity: 'medium', why: 'Warnings that an account will be closed, a fine applied or legal action taken are meant to scare you into acting before you think.' },\n    { id: 'secrecy', label: 'Secrecy or going around the usual process', severity: 'medium', why: 'Requests to keep something quiet, skip the normal approval, or act because the boss \"can\\'t talk right now\" are typical of executive impersonation (business email compromise).' },\n    { id: 'qr', label: 'QR code instruction', severity: 'medium', why: 'A QR code hides its link, and scanning it on a personal phone moves you outside work security controls (\"quishing\"). Be wary of QR codes in emails, especially ones about sign-in or MFA.' },\n    { id: 'remote', label: 'Remote access or call-back request', severity: 'high', why: 'Asking you to install software, allow remote access or ring a number given in the message lets a scammer take control of your device or talk you into handing over details.' },\n    { id: 'link', label: 'Suspicious link format', severity: 'medium', why: 'Link shorteners hide the destination, raw IP addresses and an \"@\" inside a link are used to disguise where it goes, and script or data links are never normal in email.' },\n    { id: 'reward', label: 'Prize, refund or parcel bait', severity: 'medium', why: 'Unexpected prizes, refunds, unpaid tolls and parcels \"on hold\" with a small fee are common lures. The fee is a way to collect your card details.' },\n    { id: 'greeting', label: 'Generic greeting', severity: 'low', why: 'Organisations you deal with usually use your name. \"Dear customer\" or \"Dear user\" suggests a message sent to thousands of people. On its own it proves nothing.' }\n  ];\n  var CAT = Object.create(null);\n  for (var c = 0; c < CATS.length; c++) CAT[CATS[c].id] = CATS[c];\n\n  \/\/ Keyword rules: plain phrases, bounded quantifiers only.\n  var RULES = [\n    { cat: 'urgency', re: \/\\b(?:urgent(?:ly)?|immediate(?:ly)?|right away|as soon as possible|asap|act now|without delay|time[- ]sensitive|action required|final (?:notice|reminder|warning)|last (?:chance|reminder|warning)|expires? (?:today|tonight|soon|in \\d{1,3} ?(?:hours?|hrs?|minutes?|days?))|within (?:the next )?\\d{1,3} ?(?:hours?|hrs?|minutes?|mins?)|by (?:end|close) of (?:day|business)|today only|respond (?:today|now)|pay now|overdue)\\b\/gi },\n    { cat: 'threat', re: \/\\b(?:(?:will|may|shall) be (?:suspended|closed|locked|disabled|deactivated|deleted|terminated|cancell?ed|blocked|disconnected|returned to sender)|(?:suspend|deactivate|terminate|lock|close|disable) your (?:account|mailbox|access|service|card)|legal action|debt collect(?:or|ion)|arrest(?:ed)?|warrant|penalt(?:y|ies)|late fees?|permanently (?:lose|delete|deleted|close|closed)|lose access)\\b\/gi },\n    { cat: 'payment', re: \/\\b(?:(?:new|updated?|changed?|different|revised) (?:bank(?:ing)?|account|payment|remittance) (?:details?|information|info)|(?:bank(?:ing)?|account|payment) details? (?:have|has) (?:changed|been (?:changed|updated))|change (?:of|to) (?:our )?bank(?:ing)? details?|bsb|swift code|iban|wire transfer|remittance advice|(?:paid|pay|payment|payments) (?:to|into) (?:the|our|this) (?:new|updated|following|below) account|new account below|update (?:your|the) (?:payment|billing) (?:details|information|method)|(?:outstanding|unpaid|overdue) invoices?)\\b\/gi },\n    { cat: 'credentials', re: \/\\b(?:(?:verify|confirm|validate|update|re-?enter|re-?activate|unlock|restore) (?:your )?(?:account|identity|password|login|log-?in|credentials|mailbox|email account|profile)|(?:password|credentials?) (?:expires?|expired|expiring|will expire)|(?:keep|retain) (?:your|my) (?:current )?password|(?:sign|log) ?in (?:now |here |below )?to (?:view|access|keep|avoid|restore|retain|confirm|verify|continue|download|open|read)|(?:mailbox|storage|quota) (?:is )?(?:full|almost full|exceeded)|shared (?:a )?(?:document|file|folder) with you|enter your (?:password|credentials|username))\\b\/gi },\n    { cat: 'mfa', re: \/\\b(?:(?:verification|security|one[- ]time|authentication|authenticator|access|login|sms|mfa|2fa|otp|6[- ]digit) (?:code|pin|passcode)s?|code (?:we|i) (?:just |have )?sent|(?:read|send|give|tell|share|forward) (?:me |us )?(?:the |that |this )?code|approve (?:the|this|a) (?:sign[- ]?in|login|request|prompt|notification)|devicelogin|device login|number (?:shown|displayed) (?:on|in) (?:your|the) (?:screen|app))\\b\/gi },\n    { cat: 'giftcard', re: \/\\b(?:gift ?cards?|(?:itunes|google play|steam|apple|ebay|amazon|prepaid) cards?|scratch (?:off )?(?:the )?(?:back|panel)|photos? of the (?:cards?|codes?)|bitcoin|crypto ?(?:currency|wallet)|wallet address)\\b\/gi },\n    { cat: 'attachment', re: \/\\b(?:enable (?:content|editing|macros?)|password[- ]protected (?:zip|file|attachment|archive|document)|(?:password|passcode) (?:for|to open) the (?:attachment|file|document|zip))\\b\/gi },\n    { cat: 'attachment', re: \/(?:^|[\\s\"'(:])[\\w() .-]{1,80}\\.(?:docm|xlsm|pptm|xlam|dotm|iso|img|vhdx?|exe|scr|jse?|vbe?s?|hta|lnk|bat|cmd|ps1|msi|one|wsf|jar|s?html?)(?![\\w\\\/.-])\/gi },\n    { cat: 'qr', re: \/\\b(?:qr ?codes?|scan (?:the|this|below|attached) (?:code|image|barcode)|(?:phone|mobile)(?:'s)? camera|scan (?:it )?with your (?:phone|mobile|device))\\b\/gi },\n    { cat: 'secrecy', re: \/\\b(?:keep (?:this|it) (?:confidential|between us|private|quiet|to yourself)|(?:do not|don't|dont) (?:tell|mention|discuss) (?:anyone|anybody|this|it|the team|others)|i'?m in (?:a meeting|meetings)|i am in (?:a meeting|meetings)|can'?t (?:talk|take calls)|are you (?:at your desk|available right now)|(?:quick|small|urgent) (?:favour|favor)|skip the (?:usual|normal) (?:process|approval|checks?)|discreet(?:ly)?)\\b\/gi },\n    { cat: 'remote', re: \/\\b(?:remote (?:access|support|desktop|session|control)|(?:install|download) (?:the|this|our) (?:app|software|tool|program) so|(?:give|allow) (?:us|me) access to your (?:computer|device|screen|pc)|call (?:this number|the number below|our (?:fraud|security) team|us immediately))\\b\/gi },\n    { cat: 'reward', re: \/\\b(?:you(?:'ve| have) (?:won|been selected|been chosen)|claim (?:your|the) (?:prize|reward|refund|gift|winnings)|(?:tax |toll )?refund (?:is )?(?:due|pending|available|owed)|unclaimed (?:funds|money|parcel|package|reward)|lottery|inheritance|(?:parcel|package|delivery) (?:is )?(?:on hold|held|pending|awaiting|failed|could not be delivered)|(?:redelivery|customs|delivery) fee|unpaid toll)\\b\/gi },\n    { cat: 'greeting', re: \/\\b(?:dear (?:customer|client|user|member|sir|madam|account ?holder|valued (?:customer|client|member)|email user|beneficiary)|hello (?:user|customer)|attention (?:user|customer))\\b\/gi }\n  ];\n\n  var SHORTENERS = ['bit.ly', 'tinyurl.com', 't.co', 'goo.gl', 'is.gd', 'ow.ly', 'rebrand.ly', 'cutt.ly', 'shorturl.at', 'tiny.cc', 'buff.ly', 'rb.gy', 't.ly', 's.id', 'qrco.de'];\n  var FREE_MAIL = ['gmail.com', 'googlemail.com', 'outlook.com', 'hotmail.com', 'live.com', 'yahoo.com', 'yahoo.com.au', 'icloud.com', 'me.com', 'aol.com', 'proton.me', 'protonmail.com', 'gmx.com', 'mail.com', 'bigpond.com', 'freemail.test'];\n  \/\/ Domains that are often imitated, plus the example domains used by the training emails.\n  var KNOWN = ['microsoft.com', 'office.com', 'microsoftonline.com', 'outlook.com', 'live.com', 'sharepoint.com', 'mygov.au', 'my.gov.au', 'ato.gov.au', 'servicesaustralia.gov.au', 'auspost.com.au', 'linkt.com.au', 'commbank.com.au', 'westpac.com.au', 'nab.com.au', 'anz.com', 'paypal.com', 'apple.com', 'google.com', 'docusign.net', 'docusign.com', 'dropbox.com', 'linkedin.com', 'amazon.com.au', 'example.com', 'example.org', 'example.net'];\n  var ORGISH = \/\\b(?:bank|support|service|services|team|help ?desk|accounts?|payroll|finance|billing|ceo|cfo|director|manager|admin|administrator|security|it|hr|microsoft|office|government|ato|mygov|tax|official)\\b\/i;\n  var SECOND_LEVEL = { com: 1, net: 1, org: 1, gov: 1, edu: 1, asn: 1, id: 1, co: 1, ac: 1 };\n  var CONFUSABLE = { '\u0430': 'a', '\u0435': 'e', '\u043e': 'o', '\u0440': 'p', '\u0441': 'c', '\u0445': 'x', '\u0443': 'y', '\u0456': 'i', '\u0458': 'j', '\u0501': 'd', '\u0261': 'g', '\u03bf': 'o', '\u03b1': 'a', '\u0131': 'i', '\u04bb': 'h', '\u0455': 's' };\n\n  function str(v) { return String(v === undefined || v === null ? '' : v); }\n  function oneLine(s) { return s.replace(\/\\s+\/g, ' ').trim(); }\n  function snippet(text, index, len) {\n    var a = Math.max(0, index - 40), b = Math.min(text.length, index + len + 40);\n    var s = oneLine(text.slice(a, b));\n    if (s.length > 160) s = s.slice(0, 157) + '...';\n    s = s.replace(\/\\bhttp(s?):\\\/\\\/\/gi, 'hxxp$1:\/\/');\n    return (a > 0 ? '...' : '') + s + (b < text.length ? '...' : '');\n  }\n  \/** Make a URL or domain safe to show and copy: hxxp and [.] so it can't be clicked or auto-linked. *\/\n  function defang(u) {\n    var s = str(u).slice(0, 120).replace(\/^http\/i, 'hxxp').replace(\/\\.\/g, '[.]');\n    return str(u).length > 120 ? s + '...' : s;\n  }\n  function orgDomain(d) {\n    var parts = d.split('.');\n    if (parts.length <= 2) return d;\n    var tld = parts[parts.length - 1], sld = parts[parts.length - 2];\n    if (tld.length === 2) { if (SECOND_LEVEL[sld]) return parts.slice(-3).join('.'); }\n    return parts.slice(-2).join('.');\n  }\n  function inList(listArr, v) { for (var i = 0; i < listArr.length; i++) if (listArr[i] === v) return true; return false; }\n\n  function skeleton(s) {\n    var out = '';\n    var t = s.toLowerCase();\n    for (var i = 0; i < t.length; i++) { var ch = t.charAt(i); out += CONFUSABLE[ch] || ch; }\n    return out.replace(\/-\/g, '').replace(\/rn\/g, 'm').replace(\/vv\/g, 'w').replace(\/0\/g, 'o').replace(\/[1i|]\/g, 'l').replace(\/3\/g, 'e').replace(\/5\/g, 's');\n  }\n  function distance(a, b) {\n    if (Math.abs(a.length - b.length) > 1) return 2;\n    if (a.length > 64) return 2;\n    var prev = [], cur = [], i, j;\n    for (j = 0; j <= b.length; j++) prev[j] = j;\n    for (i = 1; i <= a.length; i++) {\n      cur = [i];\n      for (j = 1; j <= b.length; j++) cur[j] = Math.min(prev[j] + 1, cur[j - 1] + 1, prev[j - 1] + (a.charAt(i - 1) === b.charAt(j - 1) ? 0 : 1));\n      prev = cur;\n    }\n    return prev[b.length];\n  }\n\n  \/** Why a host might be a lookalike, or '' if nothing stands out. *\/\n  function lookalikeReason(host) {\n    var h = host.toLowerCase();\n    if (\/[^\\x00-\\x7f]\/.test(h)) return 'contains non-Latin characters that can imitate ordinary letters';\n    if (h.indexOf('xn--') >= 0) return 'is an internationalised (punycode) domain, which can disguise lookalike characters';\n    var org = orgDomain(h);\n    for (var i = 0; i < KNOWN.length; i++) {\n      var k = KNOWN[i];\n      if (org === k) return '';\n      if (h === k) return '';\n    }\n    var sk = skeleton(org);\n    for (i = 0; i < KNOWN.length; i++) {\n      k = KNOWN[i];\n      if (sk === skeleton(k)) return 'looks like ' + k + ' but is a different domain (' + org + ')';\n      if (org.length >= 6) { if (distance(org, k) === 1) return 'is one character away from ' + k; }\n    }\n    \/\/ Same disguised name under another ending (paypa1.net, examp1e.test): compare the name part only.\n    var label = org.split('.')[0], skl = skeleton(label);\n    for (i = 0; i < KNOWN.length; i++) {\n      var kl = KNOWN[i].split('.')[0];\n      if (kl.length < 5) continue;\n      if (label !== kl) { if (skl === skeleton(kl)) return 'looks like ' + KNOWN[i] + ' but is a different domain (' + org + ')'; }\n    }\n    var sub = h.slice(0, Math.max(0, h.length - org.length));\n    for (i = 0; i < KNOWN.length; i++) {\n      var brand = KNOWN[i].split('.')[0];\n      if (brand.length < 5) continue;\n      if (sub.indexOf(KNOWN[i] + '.') >= 0) return 'starts with ' + KNOWN[i] + ' but really belongs to ' + org;\n      if (org.split('.')[0].indexOf(brand) >= 0) return 'uses the name \"' + brand + '\" in a different domain (' + org + ')';\n      if (sub.indexOf(brand) >= 0) return 'uses the name \"' + brand + '\" in front of a different domain (' + org + ')';\n    }\n    if (\/\\.(?:com|gov|net|org|edu)\\.au\\.\/.test(h + '.')) {\n      if (!\/\\.(?:com|gov|net|org|edu)\\.au$\/.test(h)) return 'has an Australian-looking ending in the middle, but really belongs to ' + org;\n    }\n    return '';\n  }\n\n  \/\/ ---------------------------------------------------------------- header parsing\n  function parseAddress(v) {\n    var s = str(v).slice(0, 500);\n    var m = \/^\\s*\"?([^\"<]{0,200}?)\"?\\s*<\\s*([^<>\\s@]{1,64}@[^<>\\s@]{1,253})\\s*>\/.exec(s);\n    var name = '', addr = '';\n    if (m) { name = m[1].trim(); addr = m[2]; }\n    else { var m2 = \/([^\\s<>\"@]{1,64}@[^\\s<>\"@]{1,253})\/.exec(s); if (!m2) return null; addr = m2[1]; name = s.replace(m2[1], '').replace(\/[<>\"]\/g, '').trim(); }\n    addr = addr.toLowerCase().replace(\/[.,;]+$\/, '');\n    var dom = addr.slice(addr.lastIndexOf('@') + 1);\n    if (!\/^[a-z0-9\u00a0-\uffff.-]{1,253}$\/.test(dom)) return null;\n    return { name: name, addr: addr, domain: dom };\n  }\n  function headers(text) {\n    \/\/ Unfold continuation lines (RFC 5322), then read the first header of each kind.\n    var head = text.slice(0, 8000).replace(\/\\r?\\n[ \\t]+\/g, ' ');\n    var lines = head.split(\/\\r?\\n\/), out = Object.create(null);\n    for (var i = 0; i < lines.length; i++) {\n      if (i > 200) break;\n      var m = \/^(from|reply-to|return-path|sender|subject|authentication-results)\\s*:\\s*(.{0,2000})$\/i.exec(lines[i]);\n      if (!m) continue;\n      var k = m[1].toLowerCase();\n      if (!out[k]) out[k] = m[2];\n    }\n    return out;\n  }\n\n  \/\/ ---------------------------------------------------------------- URL helpers\n  var URL_RE = \/\\b(?:(?:https?|hxxps?):\\\/\\\/|www\\.)[^\\s<>\"'\\])}]{1,2000}\/gi;\n  function hostOf(u) {\n    var s = u.replace(\/^(?:https?|hxxps?):\\\/\\\/\/i, '');\n    var auth = s.split(\/[\\\/?#\\\\]\/)[0];\n    var user = '';\n    var at = auth.lastIndexOf('@');\n    if (at >= 0) { user = auth.slice(0, at); auth = auth.slice(at + 1); }\n    var host = auth.replace(\/:\\d{1,5}$\/, '').replace(\/\\[\\.\\]\/g, '.').toLowerCase().replace(\/\\.$\/, '');\n    return { host: host, user: user };\n  }\n  function trimUrl(u) { return u.replace(\/[.,;:!?]+$\/, ''); }\n\n  \/\/ ---------------------------------------------------------------- analysis\n  function analyse(input) {\n    var raw = str(input);\n    var truncated = raw.length > MAX_INPUT;\n    var text = truncated ? raw.slice(0, MAX_INPUT) : raw;\n    var found = Object.create(null), order = [];\n    function add(cat, ev) {\n      if (!found[cat]) { found[cat] = []; order.push(cat); }\n      if (found[cat].length < MAX_EVIDENCE) { if (!inList(found[cat], ev)) found[cat].push(ev); }\n    }\n    if (text.trim() === '') return { empty: true, flags: [], counts: { high: 0, medium: 0, low: 0 }, truncated: false, length: 0 };\n\n    \/\/ 1. Keyword rules\n    for (var r = 0; r < RULES.length; r++) {\n      var re = RULES[r].re, m, hits = 0;\n      re.lastIndex = 0;\n      while ((m = re.exec(text)) !== null) {\n        if (m[0] === '') { re.lastIndex++; continue; }\n        add(RULES[r].cat, snippet(text, m.index, m[0].length));\n        hits++;\n        if (hits >= MAX_EVIDENCE) break;\n      }\n      re.lastIndex = 0;\n    }\n\n    \/\/ 2. Hidden or direction-changing characters\n    var hid = \/[\u200b-\u200d\u2060\ufeff\u202a-\u202e\u2066-\u2069]\/.exec(text);\n    if (hid) add('lookalike', 'The text contains hidden or right-to-left override characters (code U+' + hid[0].charCodeAt(0).toString(16).toUpperCase() + '), used to disguise file names and links.');\n\n    \/\/ 3. Headers\n    var h = headers(text);\n    var from = h.from ? parseAddress(h.from) : null;\n    if (from) {\n      var nameEmail = \/([^\\s<>\"@]{1,64}@([^\\s<>\"@]{1,253}))\/.exec(from.name);\n      if (nameEmail) {\n        if (orgDomain(nameEmail[2].toLowerCase()) !== orgDomain(from.domain)) add('sender', 'The display name shows ' + defang(nameEmail[1]) + ' but the message is really from ' + defang(from.addr) + '.');\n      } else {\n        var nameDom = \/\\b((?:[a-z0-9-]{1,63}\\.){1,5}(?:com|net|org|gov|edu|au|io|co)(?:\\.au)?)\\b\/i.exec(from.name);\n        if (nameDom) { if (orgDomain(nameDom[1].toLowerCase()) !== orgDomain(from.domain)) add('sender', 'The display name mentions ' + defang(nameDom[1]) + ' but the address is ' + defang(from.addr) + '.'); }\n      }\n      if (inList(FREE_MAIL, from.domain)) {\n        if (ORGISH.test(from.name)) add('sender', '\"' + from.name.slice(0, 60) + '\" writes from a free email account (' + defang(from.domain) + '). Organisations send official requests from their own domain.');\n      }\n      var why = lookalikeReason(from.domain);\n      if (why) add('lookalike', 'The sender domain ' + defang(from.domain) + ' ' + why + '.');\n      var rt = h['reply-to'] ? parseAddress(h['reply-to']) : null;\n      if (rt) { if (orgDomain(rt.domain) !== orgDomain(from.domain)) add('sender', 'Replies would go to ' + defang(rt.addr) + ', a different domain from the sender (' + defang(from.domain) + ').'); }\n    }\n    if (h['authentication-results']) {\n      var ar = h['authentication-results'].toLowerCase();\n      var fails = [];\n      if (\/\\bspf=(?:fail|softfail)\\b\/.test(ar)) fails.push('SPF');\n      if (\/\\bdkim=fail\\b\/.test(ar)) fails.push('DKIM');\n      if (\/\\bdmarc=fail\\b\/.test(ar)) fails.push('DMARC');\n      if (\/\\bcompauth=fail\\b\/.test(ar)) fails.push('composite authentication');\n      if (fails.length) add('sender', 'The Authentication-Results header shows ' + fails.join(', ') + ' failing, so the message may not be from the domain it claims.');\n    }\n\n    \/\/ 4. Links shown with different text (markdown, pasted HTML source, or \"text <url>\" plain-text style)\n    var pairs = [], pm, guard = 0;\n    var MD = \/\\[([^\\]\\n]{1,200})\\]\\(\\s*([^)\\s]{1,2000})\\s*\\)\/g;\n    while ((pm = MD.exec(text)) !== null) { pairs.push([pm[1], pm[2]]); if (++guard > 50) break; }\n    \/\/ Pasted anchor source: found by a linear scan, not one big regex (overlapping quantifiers in a\n    \/\/ single pattern backtrack catastrophically on input such as \"<a\/href=x\" repeated).\n    var lower = text.toLowerCase(), pos = 0, starts = 0;\n    guard = 0;\n    while (guard <= 50) {\n      var open = lower.indexOf('<a', pos);\n      if (open < 0) break;\n      if (++starts > 2000) break;\n      pos = open + 2;\n      if (\/[a-z0-9_]\/.test(lower.charAt(open + 2))) continue;\n      var close = lower.indexOf('>', open);\n      if (close < 0) break;\n      if (close - open > 1000) continue;\n      var hm = \/\\bhref\\s*=\\s*[\"']?([^\"'\\s>]{1,2000})\/i.exec(text.slice(open, close));\n      if (!hm) continue;\n      var after = text.slice(close + 1, close + 301), lt = after.indexOf('<');\n      pairs.push([lt >= 0 ? after.slice(0, lt) : after, hm[1]]);\n      guard++;\n    }\n    \/\/ Outlook-style \"text <url>\": match the bracketed URL, then read the word before it by hand.\n    var PT = \/<((?:https?|hxxps?):\\\/\\\/[^\\s<>]{1,2000})>\/gi;\n    guard = 0;\n    while ((pm = PT.exec(text)) !== null) {\n      var before = text.slice(Math.max(0, pm.index - 201), pm.index).replace(\/\\s$\/, '');\n      var wm = \/(\\S{1,200})$\/.exec(before);\n      if (wm) pairs.push([wm[1], pm[1]]);\n      if (++guard > 50) break;\n    }\n    for (var p = 0; p < pairs.length; p++) {\n      var shown = oneLine(pairs[p][0]).replace(\/^[\"'(]+|[\"')]+$\/g, '');\n      var dm = \/^(?:(?:https?|hxxps?):\\\/\\\/)?((?:[a-z0-9-]{1,63}\\.){1,10}[a-z]{2,24})(?:[\\\/:?#]|$)\/i.exec(shown);\n      if (!dm) continue;\n      var shownHost = dm[1].toLowerCase(), realHost = hostOf(pairs[p][1]).host;\n      if (realHost === '') continue;\n      if (orgDomain(shownHost) !== orgDomain(realHost)) add('linktext', 'The link text shows ' + defang(shownHost) + ' but it really goes to ' + defang(realHost) + '.');\n    }\n\n    \/\/ 5. Every URL in the text\n    var hosts = [], seenHost = Object.create(null), um, count = 0;\n    URL_RE.lastIndex = 0;\n    while ((um = URL_RE.exec(text)) !== null) {\n      if (++count > MAX_URLS) break;\n      var url = trimUrl(um[0]);\n      var parts = hostOf(url);\n      if (parts.user !== '') add('link', 'The link ' + defang(url) + ' has an \"@\" in it: browsers ignore everything before the @, so \"' + defang(parts.user.slice(0, 60)) + '\" is only decoration.');\n      var host = parts.host;\n      if (host === '') continue;\n      if (\/^\\d{1,3}(?:\\.\\d{1,3}){3}$\/.test(host)) add('link', 'The link goes to a raw IP address (' + defang(host) + ') instead of a named website.');\n      else if (\/^(?:0x[0-9a-f]{1,8}|\\d{8,10})$\/.test(host)) add('link', 'The link uses a disguised numeric address (' + defang(host) + ').');\n      if (inList(SHORTENERS, host)) add('link', 'The link uses a shortener (' + defang(host) + '), which hides the real destination.');\n      if (\/^hxxp\/i.test(url)) add('link', 'The link was already defanged (hxxp), which usually means someone has flagged it as dangerous.');\n      if (host.split('.').length >= 6) add('link', 'The link has an unusually long chain of subdomains (' + defang(host) + '), a common way to bury the real domain.');\n      if (!seenHost[host]) { seenHost[host] = true; hosts.push(host); }\n    }\n    URL_RE.lastIndex = 0;\n    var scheme = \/\\b(?:javascript|vbscript|data):[^\\s]{0,40}\/i.exec(text);\n    if (scheme) add('link', 'The text contains a script or data link (' + scheme[0].slice(0, 40) + '...). These are never needed in a normal email.');\n\n    \/\/ 6. Email addresses in the body and link hosts: lookalike checks\n    var ADDR = \/[^\\s<>\"'(),;:@]{1,64}@((?:[^\\s<>\"'(),;:@.]{1,63}\\.){1,10}[^\\s<>\"'(),;:@.]{2,24})\/g, am, n2 = 0;\n    while ((am = ADDR.exec(text)) !== null) {\n      if (++n2 > MAX_HOSTS) break;\n      var ad = am[1].toLowerCase().replace(\/\\.$\/, '');\n      if (!seenHost[ad]) { seenHost[ad] = true; hosts.push(ad); }\n    }\n    for (var k = 0; k < hosts.length; k++) {\n      if (k >= MAX_HOSTS) break;\n      if (from) { if (hosts[k] === from.domain) continue; }\n      var w = lookalikeReason(hosts[k]);\n      if (w) add('lookalike', defang(hosts[k]) + ' ' + w + '.');\n    }\n\n    \/\/ Result\n    var flags = [], counts = { high: 0, medium: 0, low: 0 };\n    for (var f = 0; f < CATS.length; f++) {\n      var id = CATS[f].id;\n      if (!found[id]) continue;\n      flags.push({ id: id, label: CATS[f].label, severity: CATS[f].severity, why: CATS[f].why, evidence: found[id] });\n      counts[CATS[f].severity]++;\n    }\n    return { empty: false, flags: flags, counts: counts, truncated: truncated, length: text.length, headers: !!from, summary: summarise(flags, counts) };\n  }\n\n  function summarise(flags, counts) {\n    if (!flags.length) return 'No red flags matched these rules. That does not make the email safe: rules can\\'t catch everything. If it asks you to do anything (pay, sign in, open a file), check with the sender through a channel you already trust.';\n    var n = flags.length;\n    var s = n + (n === 1 ? ' type of red flag' : ' types of red flag') + ' found';\n    if (counts.high) s += ', including ' + counts.high + ' serious';\n    return s + '. Treat this email as suspicious: don\\'t click, reply, scan or pay. Verify through a channel you already trust and report it.';\n  }\n\n  \/\/ ---------------------------------------------------------------- training examples (invented)\n  var EXAMPLES = [\n    { title: 'Supplier bank details', expect: ['payment', 'sender', 'urgency', 'threat', 'secrecy'],\n      note: 'A payment-redirection attempt. The reply address is on a different domain, the bank details have \"changed\", and there is pressure plus a request for secrecy. Call the supplier on a number you already hold before changing any payment details.',\n      text: 'From: \"Accounts - Northwind Supplies\" <accounts@northwind-supplies.test>\\nReply-To: accounts.northwind@mail-box.test\\nSubject: Updated banking details - urgent\\n\\nHi,\\n\\nPlease note our banking details have changed following an audit. All outstanding invoices must be paid to the new account below from today.\\n\\nBSB: 000-000  Account: 00000000\\n\\nPlease process this straight away as the old account will be closed. Keep this confidential while the change is finalised and reply only to this email.\\n\\nRegards,\\nAccounts Team' },\n    { title: 'Password expiry', expect: ['credentials', 'lookalike', 'linktext', 'urgency', 'threat', 'greeting'],\n      note: 'A credential phish. The sender domain swaps a letter for a number, the visible link shows the real domain but goes somewhere else, and the deadline is there to rush you.',\n      text: 'From: \"IT Service Desk\" <it-servicedesk@examp1e.test>\\nSubject: Your password expires in 24 hours\\n\\nDear user,\\n\\nYour Example password expires today. To keep your current password, confirm your account within 24 hours or your mailbox will be suspended.\\n\\nKeep my password: www.example.com\/keep-password <https:\/\/example.com.password-check.test\/login>\\n\\nExample IT Service Desk' },\n    { title: 'Boss needs gift cards', expect: ['giftcard', 'secrecy', 'sender'],\n      note: 'Executive impersonation. A \"CEO\" on a free email account, who can\\'t talk, wants gift card codes and secrecy. Check with the person directly, by phone or in person.',\n      text: 'From: \"Alex Chen (CEO)\" <alex.chen.office@freemail.test>\\nSubject: Quick favour\\n\\nAre you at your desk? I\\'m in meetings all day and can\\'t talk.\\n\\nI need you to buy five gift cards for a client thank-you. Scratch the back and send me photos of the codes.\\n\\nKeep this between us, it is a surprise for the team.\\n\\nAlex' },\n    { title: 'Read me the code', expect: ['mfa', 'lookalike'],\n      note: 'An MFA code theft. The real domain is secure-alerts.test, with a trusted name in front. No security team ever needs your verification code.',\n      text: 'From: \"Example Security\" <security@example.com.secure-alerts.test>\\nSubject: Unusual sign-in blocked\\n\\nWe blocked a sign-in to your account from a new device. A member of our security team will call you shortly.\\n\\nTo confirm it is you, read the verification code we just sent to your phone back to the caller.' },\n    { title: 'Scan to keep MFA', expect: ['qr', 'credentials', 'urgency', 'threat', 'lookalike'],\n      note: 'A QR code phish (\"quishing\"). The code hides the link and moves you to your phone, outside work protections. The sender domain borrows a trusted name.',\n      text: 'From: \"Example 365 Admin\" <no-reply@example-365-admin.test>\\nSubject: Action required: renew your MFA\\n\\nYour multi-factor settings must be renewed. Scan the QR code below with your phone camera and verify your account.\\n\\nIf this is not completed within 48 hours we will lock your account.\\n\\n[QR code image]' },\n    { title: 'Invoice with macros', expect: ['attachment', 'greeting', 'urgency'],\n      note: 'A malware lure. A macro-enabled document (.docm) plus an instruction to click Enable Content is how many ransomware infections start.',\n      text: 'From: \"Accounts Receivable\" <billing@contoso-invoices.test>\\nSubject: Invoice INV-20931 overdue\\n\\nDear customer,\\n\\nPlease find attached INV-20931.docm. The document is protected: click Enable Content to view it.\\n\\nPayment is overdue.' },\n    { title: 'Parcel on hold', expect: ['reward', 'link', 'greeting', 'urgency', 'threat'],\n      note: 'A delivery scam. A small \"redelivery fee\" and a link to a bare IP address instead of a named website. Track parcels in the courier\\'s own app or website.',\n      text: 'From: \"Parcel Delivery\" <notify@parcel-track.test>\\nSubject: Your parcel is on hold\\n\\nHello customer,\\n\\nYour parcel is on hold because of an unpaid redelivery fee. Pay the small fee to release it: http:\/\/192.0.2.44\/pay\\n\\nIf not paid within 12 hours your parcel will be returned to sender.' },\n    { title: 'Team lunch', expect: [],\n      note: 'No red flags. The sender, the link and the request all match, and nothing asks for money, a password or a code. Most email is like this: the skill is noticing when something is different.',\n      text: 'From: \"Priya Shah\" <priya.shah@example.com>\\nSubject: Team lunch on Friday\\n\\nHi all,\\n\\nWe are booking a table for the team lunch on Friday. Add your name to the list on the intranet if you can come: https:\/\/intranet.example.com\/lunch\\n\\nThanks,\\nPriya' }\n  ];\n\n  function grade(exampleIndex, picked) {\n    var ex = EXAMPLES[exampleIndex];\n    if (!ex) return null;\n    var want = Object.create(null), got = Object.create(null), i;\n    for (i = 0; i < ex.expect.length; i++) want[ex.expect[i]] = true;\n    var list = Array.isArray(picked) ? picked.slice(0, CATS.length) : [];\n    for (i = 0; i < list.length; i++) { if (CAT[list[i]]) got[list[i]] = true; }\n    var spotted = [], missed = [], extra = [];\n    for (i = 0; i < CATS.length; i++) {\n      var id = CATS[i].id;\n      if (want[id]) { if (got[id]) spotted.push(id); else missed.push(id); }\n      else if (got[id]) extra.push(id);\n    }\n    return { spotted: spotted, missed: missed, extra: extra, total: ex.expect.length, note: ex.note };\n  }\n\n  function parseHash(h) {\n    var m = \/^#?example=([1-9])$\/.exec(str(h));\n    if (!m) return -1;\n    var n = +m[1] - 1;\n    return n < EXAMPLES.length ? n : -1;\n  }\n\n  var api = { analyse: analyse, grade: grade, parseHash: parseHash, lookalikeReason: lookalikeReason, defang: defang, CATS: CATS, EXAMPLES: EXAMPLES, MAX_INPUT: MAX_INPUT };\n  if (typeof module !== 'undefined') { if (module.exports) { module.exports = api; return; } }\n\n  \/\/ ---------------------------------------------------------------- page wiring (textContent only)\n  function el(tag, text, cls) { var e = document.createElement(tag); if (text !== undefined) e.textContent = text; if (cls) e.className = cls; return e; }\n  function clear(node) { while (node.firstChild) node.removeChild(node.firstChild); }\n  function show(node, yes) { node.hidden = !yes; }\n  var SEV = { high: 'Serious', medium: 'Warning', low: 'Minor' };\n\n  function flagItem(f) {\n    var li = el('li', undefined, 'cat-flag cat-sev-' + f.severity);\n    var head = el('p', undefined, 'cat-flag-head');\n    head.appendChild(el('span', SEV[f.severity], 'cat-badge'));\n    head.appendChild(el('strong', f.label));\n    li.appendChild(head);\n    li.appendChild(el('p', f.why, 'cat-why'));\n    if (f.evidence.length) {\n      var ul = el('ul', undefined, 'cat-ev');\n      for (var i = 0; i < f.evidence.length; i++) ul.appendChild(el('li', f.evidence[i]));\n      li.appendChild(ul);\n    }\n    return li;\n  }\n\n  function init() {\n    var root = document.getElementById('cat-phishing-check');\n    if (!root) return;\n    var q = function (s) { return root.querySelector(s); };\n\n    var tabs = root.querySelectorAll('[role=\"tab\"]');\n    function selectTab(btn) {\n      for (var i = 0; i < tabs.length; i++) {\n        var on = tabs[i] === btn;\n        tabs[i].setAttribute('aria-selected', on ? 'true' : 'false');\n        tabs[i].tabIndex = on ? 0 : -1;\n        show(document.getElementById(tabs[i].getAttribute('aria-controls')), on);\n      }\n    }\n    for (var t = 0; t < tabs.length; t++) {\n      tabs[t].addEventListener('click', function (e) { selectTab(e.currentTarget); });\n      tabs[t].addEventListener('keydown', function (e) {\n        var i = Array.prototype.indexOf.call(tabs, e.currentTarget), j = -1;\n        if (e.key === 'ArrowRight') j = (i + 1) % tabs.length; else if (e.key === 'ArrowLeft') j = (i - 1 + tabs.length) % tabs.length;\n        else if (e.key === 'Home') j = 0; else if (e.key === 'End') j = tabs.length - 1;\n        if (j >= 0) { e.preventDefault(); tabs[j].focus(); selectTab(tabs[j]); }\n      });\n    }\n\n    \/\/ Check an email\n    var input = q('#cat-ph-input'), counter = q('#cat-ph-count'), out = q('#cat-ph-out');\n    function updateCount() { counter.textContent = input.value.length.toLocaleString('en-AU') + ' of ' + MAX_INPUT.toLocaleString('en-AU') + ' characters'; }\n    function renderCheck() {\n      clear(out);\n      var r = analyse(input.value);\n      if (r.empty) { out.appendChild(el('p', 'Paste the text of an email first.', 'cat-err')); return; }\n      \/\/ No green 'all clear' styling: finding no flags never means the email is safe.\n      out.appendChild(el('p', r.summary, r.flags.length ? 'cat-summary cat-bad' : 'cat-summary'));\n      if (r.truncated) out.appendChild(el('p', 'Only the first ' + MAX_INPUT.toLocaleString('en-AU') + ' characters were checked.', 'cat-note'));\n      if (!r.headers) out.appendChild(el('p', 'Tip: include the From, Reply-To and Authentication-Results lines (from \"View source\" or \"View message details\") to check the sender as well.', 'cat-note'));\n      if (r.flags.length) {\n        var ul = el('ul', undefined, 'cat-flags');\n        for (var i = 0; i < r.flags.length; i++) ul.appendChild(flagItem(r.flags[i]));\n        out.appendChild(ul);\n      }\n    }\n    input.addEventListener('input', updateCount);\n    q('#cat-ph-form').addEventListener('submit', function (e) { e.preventDefault(); renderCheck(); });\n    q('#cat-ph-clear').addEventListener('click', function () { input.value = ''; updateCount(); clear(out); input.focus(); });\n    updateCount();\n\n    \/\/ Training\n    var current = 0;\n    var pick = q('#cat-tr-pick'), mail = q('#cat-tr-mail'), boxes = q('#cat-tr-boxes'), result = q('#cat-tr-out'), title = q('#cat-tr-title');\n    for (var x = 0; x < EXAMPLES.length; x++) {\n      var opt = el('option', 'Example ' + (x + 1) + ': ' + EXAMPLES[x].title);\n      opt.value = String(x);\n      pick.appendChild(opt);\n    }\n    for (var b = 0; b < CATS.length; b++) {\n      var lab = el('label');\n      var cb = document.createElement('input');\n      cb.type = 'checkbox'; cb.value = CATS[b].id; cb.name = 'cat-tr-flag';\n      lab.appendChild(cb);\n      lab.appendChild(el('span', CATS[b].label));\n      boxes.appendChild(lab);\n    }\n    function loadExample(n) {\n      current = n;\n      pick.value = String(n);\n      title.textContent = 'Example ' + (n + 1) + ' of ' + EXAMPLES.length + ' (invented for training)';\n      mail.textContent = EXAMPLES[n].text;\n      var cbs = boxes.querySelectorAll('input');\n      for (var i = 0; i < cbs.length; i++) cbs[i].checked = false;\n      clear(result);\n    }\n    function labelsOf(ids) { var o = []; for (var i = 0; i < ids.length; i++) o.push(CAT[ids[i]].label); return o; }\n    function renderGrade() {\n      var cbs = boxes.querySelectorAll('input'), picked = [];\n      for (var i = 0; i < cbs.length; i++) if (cbs[i].checked) picked.push(cbs[i].value);\n      var g = grade(current, picked);\n      clear(result);\n      var head;\n      if (g.total === 0) head = g.extra.length ? 'This one was genuine: there were no red flags to find.' : 'Correct: this one has no red flags.';\n      else head = 'You spotted ' + g.spotted.length + ' of ' + g.total + ' red flags' + (g.extra.length ? ', and ticked ' + g.extra.length + ' that aren\\'t in this email.' : '.');\n      result.appendChild(el('p', head, 'cat-summary'));\n      result.appendChild(el('p', g.note, 'cat-why'));\n      var groups = [['Spotted', g.spotted], ['Missed', g.missed], ['Not in this email', g.extra]];\n      for (var k = 0; k < groups.length; k++) {\n        if (!groups[k][1].length) continue;\n        result.appendChild(el('h4', groups[k][0], 'cat-h'));\n        bulletList(result, labelsOf(groups[k][1]));\n      }\n      var r = analyse(EXAMPLES[current].text);\n      if (r.flags.length) {\n        result.appendChild(el('h4', 'Why each one matters', 'cat-h'));\n        var ul = el('ul', undefined, 'cat-flags');\n        for (var f = 0; f < r.flags.length; f++) ul.appendChild(flagItem(r.flags[f]));\n        result.appendChild(ul);\n      }\n      var next = el('button', current + 1 < EXAMPLES.length ? 'Next example' : 'Start again', 'cat-btn');\n      next.type = 'button';\n      next.addEventListener('click', function () { loadExample((current + 1) % EXAMPLES.length); mail.focus(); });\n      result.appendChild(next);\n    }\n    function bulletList(target, items) { var ul = el('ul', undefined, 'cat-msgs'); for (var i = 0; i < items.length; i++) ul.appendChild(el('li', items[i])); target.appendChild(ul); }\n    pick.addEventListener('change', function () { var n = parseInt(pick.value, 10); if (n >= 0) { if (n < EXAMPLES.length) loadExample(n); } });\n    q('#cat-tr-form').addEventListener('submit', function (e) { e.preventDefault(); renderGrade(); });\n\n    \/\/ A shared link may open a training example (#example=3), validated like typed input.\n    var h = '';\n    try { h = decodeURIComponent(String(location.hash || '')); } catch (e) { h = ''; }\n    var start = parseHash(h);\n    loadExample(start >= 0 ? start : 0);\n    if (start >= 0) selectTab(q('#cat-ph-tab-train'));\n  }\n  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init); else init();\n})();\n<\/script>\n<\/div>\n\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"the-red-flags-one-by-one\">The red flags, one by one<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1. The sender doesn&#8217;t add up<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The display name (&quot;IT Service Desk&quot;, &quot;Accounts&quot;, your CEO&#8217;s name) is typed by whoever sends the email, so it proves nothing. Scamwatch&#8217;s warning signs include sender details that don&#8217;t match the business or agency the message claims to be from.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>The address is on a domain that isn&#8217;t the organisation&#8217;s, or on a free email service for something &quot;official&quot;.<\/li>\n\n\n<li>Replies go to a different address from the sender (a different Reply-To).<\/li>\n\n\n<li>The display name contains an email address that isn&#8217;t the real one.<\/li>\n\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Check:<\/strong> open the sender details and read the full address (on a phone, tap the name).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2. A lookalike domain<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Scamwatch warns about website addresses that are only slightly different from the real one. Common tricks:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>A swapped character: a zero for an &quot;o&quot;, &quot;rn&quot; for &quot;m&quot;, or a missing letter.<\/li>\n\n\n<li>A trusted name in front of someone else&#8217;s domain. In <code>yourbank.com.au.secure-login.example<\/code>, the real owner is <code>secure-login.example<\/code>, not your bank.<\/li>\n\n\n<li>A trusted name with extra words: <code>yourbank-verify.example<\/code>.<\/li>\n\n\n<li>Characters from other alphabets that look like Latin letters.<\/li>\n\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Check:<\/strong> read a domain from the right. The part just before the ending (<code>.com.au<\/code>, <code>.com<\/code>, <code>.gov.au<\/code>) is who owns it. Everything to its left can be made up.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3. Link text that doesn&#8217;t match the link<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">In an email, the visible text of a link and the address it opens are separate. &quot;www.mygov.au&quot; can open anywhere.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Check:<\/strong> hover over the link on a computer, or press and hold on a phone, and read the real address before you tap. If it differs from the text, or uses a link shortener, don&#8217;t use it. Go to the site yourself.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">4. It asks you to sign in or confirm a password<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">&quot;Your password expires today&quot;, &quot;Your mailbox is full&quot;, or &quot;A document has been shared with you, sign in to view&quot;. These lead to a fake sign-in page that captures what you type. The ACSC&#8217;s warning signs include requests for passwords, authentication codes or personal information.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Check:<\/strong> never sign in from an email link. Open the app or your bookmark and see whether the alert is really there.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">5. It asks for a code, or to approve a sign-in<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Your one-time code is the last thing protecting your account. Scamwatch is blunt: never share passwords or one-time codes with anyone who contacts you unexpectedly, even if they claim to be from your bank. A related trick, device-code phishing, sends you a code to type into Microsoft&#8217;s genuine sign-in page. The attacker started that sign-in on their own device, so when you enter the code and complete your usual MFA, Microsoft signs in the attacker&#8217;s session as you. Hovering over the link shows a real Microsoft address, which is why the request itself is the red flag. We explain it, and the Conditional Access setting that blocks it, in <a href=\"https:\/\/catharsis.net.au\/blog\/device-code-phishing-microsoft-365\/\" target=\"_blank\" rel=\"noreferrer noopener\">device-code phishing<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Check:<\/strong> if you didn&#8217;t start a sign-in, don&#8217;t approve it and don&#8217;t read out or enter any code. Tell IT.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">6. Bank details have &quot;changed&quot;<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A supplier&#8217;s or employee&#8217;s bank details are suddenly different, often in an email that looks like it&#8217;s from the real supplier. This is payment redirection, the second-costliest scam type by reported losses in Australia in 2025, after investment scams.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Check:<\/strong> before paying a new or changed account, phone the supplier on a number you already hold (not one in the email) and confirm the details. Our <a href=\"https:\/\/catharsis.net.au\/blog\/christmas-invoice-fraud-call-back-checklist\/\" target=\"_blank\" rel=\"noreferrer noopener\">Christmas invoice fraud call-back checklist<\/a> turns this into a process for accounts teams.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">7. Gift cards, crypto or another odd way to pay<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">&quot;I&#8217;m in meetings and can&#8217;t talk. Can you buy five gift cards for a client and send me photos of the codes?&quot; Genuine managers don&#8217;t run purchasing like this. Once the codes are shared, the money is gone.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Check:<\/strong> confirm any unusual purchase request in person or by phone with the person who supposedly sent it.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">8. An attachment that asks you to &quot;Enable Content&quot;<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Documents that ask you to click Enable Content or Enable Editing, macro-enabled files (<code>.docm<\/code>, <code>.xlsm<\/code>), disc images (<code>.iso<\/code>, <code>.img<\/code>), shortcuts (<code>.lnk<\/code>), scripts, HTML attachments and password-protected zips are common ways to deliver malware. Microsoft describes macros as a common way for attackers to deploy malware and ransomware, and since 2022 Office on Windows blocks macros in files from the internet (such as email attachments) by default. So a document that tells you to change its file properties or &quot;unblock&quot; it is just as suspicious as one asking you to enable content.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Check:<\/strong> don&#8217;t enable content on a document you weren&#8217;t expecting. Ask the sender, through another channel, whether they sent it.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">9. A QR code instead of a link<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">&quot;Scan this QR code to keep your MFA working.&quot; The ACSC calls this quishing. A QR code hides its link, and scanning it on a personal phone takes you outside your work security controls.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Check:<\/strong> be very wary of QR codes in email, especially about sign-in, MFA or payments. Go to the service directly instead.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">10. Pressure, threats and secrecy<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Every flag above is usually wrapped in pressure: &quot;within 24 hours&quot;, &quot;your account will be suspended&quot;, &quot;keep this between us&quot;. The ACSC lists pressure to act quickly, threats of serious consequences and requests to skip normal security steps as warning signs.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Check:<\/strong> treat urgency as a reason to slow down. A genuine request will still be genuine after a five-minute phone call.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">11. Generic greetings and prizes<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">&quot;Dear customer&quot;, &quot;you&#8217;ve won&quot;, &quot;your parcel is on hold, pay the small fee&quot;. On their own these prove little, but with a link or a payment request they are typical of mass phishing. The ACSC lists generic greetings like &quot;Dear customer&quot; among its warning signs, and Scamwatch&#8217;s advice is to reach an organisation through its own app or portal, never through a link in a message.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Check:<\/strong> check parcels, refunds and tolls in the organisation&#8217;s own app or website, never through the message.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"real-patterns-explained-with-the-links-removed\">Real patterns, explained (with the links removed)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">These are typical of what Australian organisations receive. The domains are made-up placeholders, so nothing here is clickable.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>The supplier bank change.<\/strong> From &quot;Accounts, Northwind Supplies&quot;, with replies going to a different domain. &quot;Our banking details have changed following an audit. Please pay all outstanding invoices to the new account below. Keep this confidential while the change is finalised.&quot; The red flags are the reply address, the change of details, and the pressure plus secrecy. The fix is a phone call to the number already in your system.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>The password expiry.<\/strong> From &quot;IT Service Desk&quot; at a domain one character off your own, saying &quot;Your password expires today&quot;. The visible link shows your real domain, but hovering shows <code>yourcompany.com.password-check.example<\/code>. The red flags are the lookalike sender, the mismatched link and the sign-in request.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>The boss on a free email account.<\/strong> &quot;Alex (CEO)&quot; from a personal webmail address wants gift cards, can&#8217;t talk, and asks you to keep it quiet.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>The MFA code call.<\/strong> &quot;We blocked a sign-in to your account. Our security team will call. Read them the verification code we just sent.&quot; No security team ever needs your code.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>The QR code re-registration.<\/strong> &quot;Scan the QR code with your phone camera and verify your account within 48 hours or we will lock it.&quot; The QR code hides the destination, and the deadline does the rest.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">All of these are in the trainer above as practice emails, along with one genuine email, because spotting what&#8217;s normal is part of the skill.<\/p>\n\n\n\n<div class=\"wp-block-group has-pale-cyan-blue-background-color has-background\" style=\"padding-top:28px;padding-right:32px;padding-bottom:28px;padding-left:32px;margin-top:32px;margin-bottom:32px\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-container-core-group-is-layout-40de7cf3 wp-block-group-is-layout-constrained\">\n\n<p class=\"wp-block-paragraph\"><strong>Your people are your best filter.<\/strong> Our security awareness training and phishing simulations teach staff to spot the scams that get past technology.<\/p>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/catharsis.net.au\/security-awareness-training\/?utm_source=blog&amp;utm_medium=article&amp;utm_campaign=value-guides&amp;utm_content=how-to-spot-a-phishing-email-security-awareness-training\" target=\"_blank\" rel=\"noreferrer noopener\">See awareness training<\/a><\/div>\n\n<\/div>\n\n<\/div><\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"how-to-check-the-headers-when-the-email-looks-right\">How to check the headers (when the email looks right)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">When everything looks genuine, the message details can help. In most email programs you can open &quot;View message details&quot; or &quot;View source&quot;. Look for:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><strong>From<\/strong> and <strong>Reply-To<\/strong>: do they match, and are they on the organisation&#8217;s real domain?<\/li>\n\n\n<li><strong>Authentication-Results<\/strong>: entries like <code>spf=fail<\/code>, <code>dkim=fail<\/code> or <code>dmarc=fail<\/code> mean the receiving system couldn&#8217;t confirm the message came from the domain it claims. A pass doesn&#8217;t prove the email is safe, because attackers can send from domains they own or from a compromised real account.<\/li>\n\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Paste those lines into the trainer along with the message text and it will flag SPF, DKIM, DMARC or compauth failures and a mismatched Reply-To. Like the rest of the trainer, it points out red flags; it can&#8217;t confirm an email is safe.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Whether a lookalike of <em>your<\/em> domain gets through also depends on your own domain&#8217;s email authentication. If you run Microsoft 365, our guide to <a href=\"https:\/\/catharsis.net.au\/blog\/spf-dkim-dmarc-microsoft-365-com-au\/\" target=\"_blank\" rel=\"noreferrer noopener\">SPF, DKIM and DMARC for a .com.au domain<\/a> shows how to stop others sending as you.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"what-to-do-with-a-suspicious-email\">What to do with a suspicious email<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n\n<li><strong>Don&#8217;t click, reply, scan, open or pay.<\/strong><\/li>\n\n\n<li><strong>Report it inside your organisation.<\/strong> Use your email&#8217;s Report button if it has one (Outlook in Microsoft 365 does) or forward it to IT as instructed. Reporting helps them remove the same email from everyone else&#8217;s inbox.<\/li>\n\n\n<li><strong>Verify the request separately<\/strong> if it might be real: phone the person or organisation on a number you already have.<\/li>\n\n\n<li><strong>Report scams<\/strong> to Scamwatch at scamwatch.gov.au. If you have lost money or data to a cybercrime, or a business account was compromised, report it at cyber.gov.au\/submit-a-report.<\/li>\n\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>If you already clicked or entered details:<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n\n<li>Change the password for that account (and anywhere else you reuse it) from a trusted device.<\/li>\n\n\n<li>Tell IT straight away. They can sign the account out of all devices and remove forwarding or inbox rules an attacker may have set up.<\/li>\n\n\n<li>If bank or card details were involved, call your bank on the number on your card or its website.<\/li>\n\n\n<li>Report it at cyber.gov.au\/submit-a-report. For business email compromise, the ACSC&#8217;s guidance is to report to your bank or financial institution and to ASD immediately.<\/li>\n\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">For the full checklist after an account takeover, see <a href=\"https:\/\/catharsis.net.au\/blog\/business-email-hacked-first-hour\/\" target=\"_blank\" rel=\"noreferrer noopener\">business email hacked: what to do in the first hour<\/a>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"a-simple-anti-phishing-routine-for-your-organisation\">A simple anti-phishing routine for your organisation<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Some phishing will always reach people. What matters is a routine that makes the dangerous requests hard to act on.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><input type=\"checkbox\" disabled=\"\" \/> <strong>A call-back rule for payments.<\/strong> Any new or changed bank details are confirmed by phone on a known number before the first payment, with no exceptions for urgency or seniority.<\/li>\n\n\n<li><input type=\"checkbox\" disabled=\"\" \/> <strong>No codes, ever.<\/strong> Everyone knows that IT, the bank and the boss will never ask for a one-time code or ask you to approve a sign-in.<\/li>\n\n\n<li><input type=\"checkbox\" disabled=\"\" \/> <strong>One way to report.<\/strong> Staff know where the Report button is, and reporting is thanked, not blamed, including &quot;I clicked it&quot;.<\/li>\n\n\n<li><input type=\"checkbox\" disabled=\"\" \/> <strong>Practice on realistic examples.<\/strong> Short, regular training on the patterns above, using tools like the trainer in this post and, if you want to measure it, a simulated phishing campaign.<\/li>\n\n\n<li><input type=\"checkbox\" disabled=\"\" \/> <strong>Email security underneath.<\/strong> Filtering, link and attachment checking, and SPF, DKIM and DMARC on your own domains reduce how much reaches people in the first place.<\/li>\n\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Our <a href=\"https:\/\/catharsis.net.au\/security-awareness-training\/\" target=\"_blank\" rel=\"noreferrer noopener\">security awareness training<\/a> covers the human side. <a href=\"https:\/\/catharsis.net.au\/email-protection\/\" target=\"_blank\" rel=\"noreferrer noopener\">Email protection<\/a> covers the filtering and domain authentication.<\/p>\n\n\n\n<div class=\"wp-block-group has-pale-cyan-blue-background-color has-background\" style=\"padding-top:28px;padding-right:32px;padding-bottom:28px;padding-left:32px;margin-top:32px;margin-bottom:32px\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-container-core-group-is-layout-40de7cf3 wp-block-group-is-layout-constrained\">\n\n<p class=\"wp-block-paragraph\"><strong>Stop invoice fraud and spoofed email at the door.<\/strong> We set up email security properly: SPF, DKIM and DMARC, filtering, and the settings that make business email compromise harder.<\/p>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/catharsis.net.au\/email-protection\/?utm_source=blog&amp;utm_medium=article&amp;utm_campaign=value-guides&amp;utm_content=how-to-spot-a-phishing-email-email-protection\" target=\"_blank\" rel=\"noreferrer noopener\">See email security<\/a><\/div>\n\n<\/div>\n\n<\/div><\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"key-takeaways\">Key takeaways<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Check four things before acting: the real sender, the request, the real link destination, and the pressure.<\/li>\n\n\n<li>Any request involving money, passwords, codes, gift cards or &quot;enable content&quot; means stop and verify through a channel you already trust.<\/li>\n\n\n<li>Read domains from the right. The part before the ending is the owner, and anything to its left can be faked.<\/li>\n\n\n<li>Urgency and secrecy are red flags in themselves. Real organisations give you time.<\/li>\n\n\n<li>Report suspicious emails inside your organisation, and report scams to Scamwatch and losses at cyber.gov.au\/submit-a-report.<\/li>\n\n\n<li>Practise. The trainer above is a learning aid, not a filter. It runs in your browser, never opens a link and sends nothing, so it&#8217;s safe to use with your team.<\/li>\n\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"sources\">Sources<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Australian Cyber Security Centre, <a href=\"https:\/\/www.cyber.gov.au\/guidance\/learn-about-phishing-scams\" target=\"_blank\" rel=\"noreferrer noopener\">Learn about phishing scams<\/a> (last reviewed 9 April 2026): warning signs, quishing and what to do.<\/li>\n\n\n<li>Scamwatch, <a href=\"https:\/\/www.scamwatch.gov.au\/types-of-scams\/phishing-scams\" target=\"_blank\" rel=\"noreferrer noopener\">Phishing scams<\/a>: warning signs, checking who it really is, and never sharing one-time codes.<\/li>\n\n\n<li>ACCC and National Anti-Scam Centre, <a href=\"https:\/\/www.accc.gov.au\/media-release\/continued-action-critical-to-combat-fraud-as-annual-scam-losses-exceed-2-billion\" target=\"_blank\" rel=\"noreferrer noopener\">Continued action critical to combat fraud as annual scam losses exceed $2 billion<\/a> (30 March 2026): phishing was the most reported scam to Scamwatch in 2025 (65,361 reports), and the top combined losses by scam type.<\/li>\n\n\n<li>Scamwatch, <a href=\"https:\/\/www.scamwatch.gov.au\/research-and-resources\/targeting-scams-report\" target=\"_blank\" rel=\"noreferrer noopener\">Targeting scams report<\/a>: 2025 combined losses by scam type (payment redirection $166.8 million, phishing $97.6 million), drawn from Scamwatch, ReportCyber and other data-sharing organisations.<\/li>\n\n\n<li>Australian Cyber Security Centre, <a href=\"https:\/\/www.cyber.gov.au\/guidance\/recover-from-business-email-compromise\" target=\"_blank\" rel=\"noreferrer noopener\">Recover from business email compromise<\/a>: report to your bank and ASD immediately, sign out of all devices, remove rules you don&#8217;t recognise.<\/li>\n\n\n<li>Australian Cyber Security Centre, <a href=\"https:\/\/www.cyber.gov.au\/submit-a-report\" target=\"_blank\" rel=\"noreferrer noopener\">Submit a Report<\/a>.<\/li>\n\n\n<li>Microsoft Learn, <a href=\"https:\/\/learn.microsoft.com\/en-us\/microsoft-365-apps\/security\/internet-macros-blocked\" target=\"_blank\" rel=\"noreferrer noopener\">Macros from the internet are blocked by default in Office<\/a>: why macros are blocked, and the versions affected.<\/li>\n\n\n<li>Microsoft Security Blog, <a href=\"https:\/\/www.microsoft.com\/en-us\/security\/blog\/2026\/04\/06\/ai-enabled-device-code-phishing-campaign-april-2026\/\" target=\"_blank\" rel=\"noreferrer noopener\">Inside an AI-enabled device code phishing campaign<\/a> (6 April 2026): how device-code phishing works.<\/li>\n\n\n<li>Microsoft Learn, <a href=\"https:\/\/learn.microsoft.com\/en-us\/entra\/identity\/conditional-access\/policy-block-authentication-flows\" target=\"_blank\" rel=\"noreferrer noopener\">Block authentication flows with Conditional Access policy<\/a>: blocking the device code flow.<\/li>\n\n\n<li>Microsoft Learn, <a href=\"https:\/\/learn.microsoft.com\/en-us\/defender-office-365\/email-authentication-dmarc-configure\" target=\"_blank\" rel=\"noreferrer noopener\">Set up DMARC to validate email in Microsoft 365<\/a>: Authentication-Results fields.<\/li>\n\n<\/ul>\n\n\n\n<div class=\"wp-block-group has-light-green-cyan-background-color has-background\" style=\"padding-top:28px;padding-right:32px;padding-bottom:28px;padding-left:32px;margin-top:40px;margin-bottom:32px\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-container-core-group-is-layout-40de7cf3 wp-block-group-is-layout-constrained\">\n\n<h2 class=\"wp-block-heading\">Want a second pair of eyes?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Catharsis Cyber Security is a Sydney cyber security company, certified to ISO\/IEC 27001:2022. We help organisations protect, test and run their technology, and explain it in plain English.<\/p>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/catharsis.net.au\/contact-us\/?type=contact&amp;service=consult&amp;utm_source=blog&amp;utm_medium=article&amp;utm_campaign=value-guides&amp;utm_content=how-to-spot-a-phishing-email-contact\" target=\"_blank\" rel=\"noreferrer noopener\">Talk to us<\/a><\/div>\n\n\n<div class=\"wp-block-button is-style-outline is-style-outline--1\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/catharsis.net.au\/contact-us\/?type=contact&amp;service=security-health-check&amp;utm_source=blog&amp;utm_medium=article&amp;utm_campaign=value-guides&amp;utm_content=how-to-spot-a-phishing-email-end-health-check\" target=\"_blank\" rel=\"noreferrer noopener\">Free security health check<\/a><\/div>\n\n<\/div>\n\n<\/div><\/div>\n\n\n\n<style>pre.wp-block-code{max-width:100%;overflow-x:auto}pre.wp-block-code code{white-space:pre}.wp-block-list a,.wp-block-table a{overflow-wrap:anywhere;word-break:break-word}<\/style>\n","protected":false},"excerpt":{"rendered":"<p>Most phishing emails give themselves away in four places: the sender, the request, the links and the pressure. Here are the red flags to check, how the common Australian scams work, and a free trainer you can paste a suspicious email into or practise on with your team.<\/p>\n","protected":false},"author":4,"featured_media":1249,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[34],"tags":[157,174,207,206,208,209,210,186],"class_list":["post-1250","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-cyber-security-explained","tag-acsc","tag-business-email-compromise","tag-how-to-spot-a-phishing-email","tag-phishing","tag-phishing-red-flags","tag-quishing","tag-scamwatch","tag-security-awareness"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>How do you spot a phishing email? Red flags and a free trainer - Catharsis | Blog<\/title>\n<meta name=\"description\" content=\"How to spot a phishing email: the red flags to check in the sender, the request and the links, real patterns explained, and a free trainer to practise on.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/catharsis.net.au\/blog\/how-to-spot-a-phishing-email\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How do you spot a phishing email? Red flags and a free trainer - Catharsis | Blog\" \/>\n<meta property=\"og:description\" content=\"How to spot a phishing email: the red flags to check in the sender, the request and the links, real patterns explained, and a free trainer to practise on.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/catharsis.net.au\/blog\/how-to-spot-a-phishing-email\/\" \/>\n<meta property=\"og:site_name\" content=\"Catharsis | Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-16T23:45:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-11-03T10:46:53+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/catharsis.net.au\/blog\/wp-content\/uploads\/2026\/11\/how-to-spot-a-phishing-email.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1280\" \/>\n\t<meta property=\"og:image:height\" content=\"720\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Catharsis\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Catharsis\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"15 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/how-to-spot-a-phishing-email\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/how-to-spot-a-phishing-email\\\/\"},\"author\":{\"name\":\"Catharsis\",\"@id\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/#\\\/schema\\\/person\\\/ab309c676ceb9762b5c09091d50f4074\"},\"headline\":\"How do you spot a phishing email? Red flags and a free trainer\",\"datePublished\":\"2026-09-16T23:45:00+00:00\",\"dateModified\":\"2026-11-03T10:46:53+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/how-to-spot-a-phishing-email\\\/\"},\"wordCount\":3128,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/how-to-spot-a-phishing-email\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/how-to-spot-a-phishing-email.jpg\",\"keywords\":[\"ACSC\",\"business email compromise\",\"how to spot a phishing email\",\"phishing\",\"phishing red flags\",\"quishing\",\"Scamwatch\",\"security awareness\"],\"articleSection\":[\"Cyber Security Explained\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/how-to-spot-a-phishing-email\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/how-to-spot-a-phishing-email\\\/\",\"url\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/how-to-spot-a-phishing-email\\\/\",\"name\":\"How do you spot a phishing email? Red flags and a free trainer - Catharsis | Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/how-to-spot-a-phishing-email\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/how-to-spot-a-phishing-email\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/how-to-spot-a-phishing-email.jpg\",\"datePublished\":\"2026-09-16T23:45:00+00:00\",\"dateModified\":\"2026-11-03T10:46:53+00:00\",\"description\":\"How to spot a phishing email: the red flags to check in the sender, the request and the links, real patterns explained, and a free trainer to practise on.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/how-to-spot-a-phishing-email\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/how-to-spot-a-phishing-email\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/how-to-spot-a-phishing-email\\\/#primaryimage\",\"url\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/how-to-spot-a-phishing-email.jpg\",\"contentUrl\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/how-to-spot-a-phishing-email.jpg\",\"width\":1280,\"height\":720,\"caption\":\"How do you spot a phishing email? Red flags and a free trainer\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/how-to-spot-a-phishing-email\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How do you spot a phishing email? Red flags and a free trainer\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/\",\"name\":\"Catharsis | Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/#organization\",\"name\":\"Catharsis | Blog\",\"url\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/01\\\/catharsis_au.jpg\",\"contentUrl\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/01\\\/catharsis_au.jpg\",\"width\":215,\"height\":60,\"caption\":\"Catharsis | Blog\"},\"image\":{\"@id\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/#\\\/schema\\\/person\\\/ab309c676ceb9762b5c09091d50f4074\",\"name\":\"Catharsis\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/e27fcf8abb5a2806de5f16ab76102b4c22bda3fbd37a2fa8dc934e8d725f4bad?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/e27fcf8abb5a2806de5f16ab76102b4c22bda3fbd37a2fa8dc934e8d725f4bad?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/e27fcf8abb5a2806de5f16ab76102b4c22bda3fbd37a2fa8dc934e8d725f4bad?s=96&d=mm&r=g\",\"caption\":\"Catharsis\"},\"description\":\"Catharsis Cyber Security is a Sydney cyber security company, certified to ISO\\\/IEC 27001:2022. We help organisations protect, test and run their technology: managed security, penetration testing, security-first managed IT, secure AI and secure development.\",\"sameAs\":[\"https:\\\/\\\/catharsis.net.au\\\/\"],\"url\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/author\\\/catharsis-team\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"How do you spot a phishing email? Red flags and a free trainer - Catharsis | Blog","description":"How to spot a phishing email: the red flags to check in the sender, the request and the links, real patterns explained, and a free trainer to practise on.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/catharsis.net.au\/blog\/how-to-spot-a-phishing-email\/","og_locale":"en_US","og_type":"article","og_title":"How do you spot a phishing email? Red flags and a free trainer - Catharsis | Blog","og_description":"How to spot a phishing email: the red flags to check in the sender, the request and the links, real patterns explained, and a free trainer to practise on.","og_url":"https:\/\/catharsis.net.au\/blog\/how-to-spot-a-phishing-email\/","og_site_name":"Catharsis | Blog","article_published_time":"2026-09-16T23:45:00+00:00","article_modified_time":"2026-11-03T10:46:53+00:00","og_image":[{"width":1280,"height":720,"url":"https:\/\/catharsis.net.au\/blog\/wp-content\/uploads\/2026\/11\/how-to-spot-a-phishing-email.jpg","type":"image\/jpeg"}],"author":"Catharsis","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Catharsis","Est. reading time":"15 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/catharsis.net.au\/blog\/how-to-spot-a-phishing-email\/#article","isPartOf":{"@id":"https:\/\/catharsis.net.au\/blog\/how-to-spot-a-phishing-email\/"},"author":{"name":"Catharsis","@id":"https:\/\/catharsis.net.au\/blog\/#\/schema\/person\/ab309c676ceb9762b5c09091d50f4074"},"headline":"How do you spot a phishing email? Red flags and a free trainer","datePublished":"2026-09-16T23:45:00+00:00","dateModified":"2026-11-03T10:46:53+00:00","mainEntityOfPage":{"@id":"https:\/\/catharsis.net.au\/blog\/how-to-spot-a-phishing-email\/"},"wordCount":3128,"commentCount":0,"publisher":{"@id":"https:\/\/catharsis.net.au\/blog\/#organization"},"image":{"@id":"https:\/\/catharsis.net.au\/blog\/how-to-spot-a-phishing-email\/#primaryimage"},"thumbnailUrl":"https:\/\/catharsis.net.au\/blog\/wp-content\/uploads\/2026\/11\/how-to-spot-a-phishing-email.jpg","keywords":["ACSC","business email compromise","how to spot a phishing email","phishing","phishing red flags","quishing","Scamwatch","security awareness"],"articleSection":["Cyber Security Explained"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/catharsis.net.au\/blog\/how-to-spot-a-phishing-email\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/catharsis.net.au\/blog\/how-to-spot-a-phishing-email\/","url":"https:\/\/catharsis.net.au\/blog\/how-to-spot-a-phishing-email\/","name":"How do you spot a phishing email? Red flags and a free trainer - Catharsis | Blog","isPartOf":{"@id":"https:\/\/catharsis.net.au\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/catharsis.net.au\/blog\/how-to-spot-a-phishing-email\/#primaryimage"},"image":{"@id":"https:\/\/catharsis.net.au\/blog\/how-to-spot-a-phishing-email\/#primaryimage"},"thumbnailUrl":"https:\/\/catharsis.net.au\/blog\/wp-content\/uploads\/2026\/11\/how-to-spot-a-phishing-email.jpg","datePublished":"2026-09-16T23:45:00+00:00","dateModified":"2026-11-03T10:46:53+00:00","description":"How to spot a phishing email: the red flags to check in the sender, the request and the links, real patterns explained, and a free trainer to practise on.","breadcrumb":{"@id":"https:\/\/catharsis.net.au\/blog\/how-to-spot-a-phishing-email\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/catharsis.net.au\/blog\/how-to-spot-a-phishing-email\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/catharsis.net.au\/blog\/how-to-spot-a-phishing-email\/#primaryimage","url":"https:\/\/catharsis.net.au\/blog\/wp-content\/uploads\/2026\/11\/how-to-spot-a-phishing-email.jpg","contentUrl":"https:\/\/catharsis.net.au\/blog\/wp-content\/uploads\/2026\/11\/how-to-spot-a-phishing-email.jpg","width":1280,"height":720,"caption":"How do you spot a phishing email? Red flags and a free trainer"},{"@type":"BreadcrumbList","@id":"https:\/\/catharsis.net.au\/blog\/how-to-spot-a-phishing-email\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/catharsis.net.au\/blog\/"},{"@type":"ListItem","position":2,"name":"How do you spot a phishing email? Red flags and a free trainer"}]},{"@type":"WebSite","@id":"https:\/\/catharsis.net.au\/blog\/#website","url":"https:\/\/catharsis.net.au\/blog\/","name":"Catharsis | Blog","description":"","publisher":{"@id":"https:\/\/catharsis.net.au\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/catharsis.net.au\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/catharsis.net.au\/blog\/#organization","name":"Catharsis | Blog","url":"https:\/\/catharsis.net.au\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/catharsis.net.au\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/catharsis.net.au\/blog\/wp-content\/uploads\/2019\/01\/catharsis_au.jpg","contentUrl":"https:\/\/catharsis.net.au\/blog\/wp-content\/uploads\/2019\/01\/catharsis_au.jpg","width":215,"height":60,"caption":"Catharsis | Blog"},"image":{"@id":"https:\/\/catharsis.net.au\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/catharsis.net.au\/blog\/#\/schema\/person\/ab309c676ceb9762b5c09091d50f4074","name":"Catharsis","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/e27fcf8abb5a2806de5f16ab76102b4c22bda3fbd37a2fa8dc934e8d725f4bad?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/e27fcf8abb5a2806de5f16ab76102b4c22bda3fbd37a2fa8dc934e8d725f4bad?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/e27fcf8abb5a2806de5f16ab76102b4c22bda3fbd37a2fa8dc934e8d725f4bad?s=96&d=mm&r=g","caption":"Catharsis"},"description":"Catharsis Cyber Security is a Sydney cyber security company, certified to ISO\/IEC 27001:2022. We help organisations protect, test and run their technology: managed security, penetration testing, security-first managed IT, secure AI and secure development.","sameAs":["https:\/\/catharsis.net.au\/"],"url":"https:\/\/catharsis.net.au\/blog\/author\/catharsis-team\/"}]}},"_links":{"self":[{"href":"https:\/\/catharsis.net.au\/blog\/wp-json\/wp\/v2\/posts\/1250","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/catharsis.net.au\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/catharsis.net.au\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/catharsis.net.au\/blog\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/catharsis.net.au\/blog\/wp-json\/wp\/v2\/comments?post=1250"}],"version-history":[{"count":1,"href":"https:\/\/catharsis.net.au\/blog\/wp-json\/wp\/v2\/posts\/1250\/revisions"}],"predecessor-version":[{"id":1285,"href":"https:\/\/catharsis.net.au\/blog\/wp-json\/wp\/v2\/posts\/1250\/revisions\/1285"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/catharsis.net.au\/blog\/wp-json\/wp\/v2\/media\/1249"}],"wp:attachment":[{"href":"https:\/\/catharsis.net.au\/blog\/wp-json\/wp\/v2\/media?parent=1250"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/catharsis.net.au\/blog\/wp-json\/wp\/v2\/categories?post=1250"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/catharsis.net.au\/blog\/wp-json\/wp\/v2\/tags?post=1250"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}