Daily
Check links in reported emails for phishing
Links in new mail are checked against a threat database and your security channel hears about any that look dangerous.
- Runs
- Daily
- Apps
- Outlook, Slack
- AI
- Not needed
- Access
- Mail.Read; chat:write
Send this to your assistant
Create a ClickRuntime automation: every 30 minutes, check the links in new emails in my Outlook Phishing folder against a URL reputation service and post anything risky to #security in Slack.
First time? Adding ClickRuntime to your assistant takes about two minutes.
Why use it
Why teams use this automation
At a small accounting firm, staff forward anything suspicious to one person who checks each link by hand. On busy days that review waits until the evening, and a convincing fake invoice can sit in someone's inbox all afternoon.
Checking every link automatically means the security channel gets a verdict within half an hour, so a warning can go out to the whole office before anyone else clicks.
What you get out of it
Faster warnings
A dangerous link is flagged within the half hour, not at the end of the day. The team can warn colleagues while the same email is still landing in other inboxes.
Less manual checking
Nobody has to paste links into a lookup site one at a time. Clean emails are passed over quietly and only the risky ones reach the channel.
A record of what was reported
Every finding sits in Slack with the sender and subject. That helps when a client asks whether a strange email came from you.
Works with your existing habit
Staff keep forwarding or moving suspicious mail to one folder. The checking happens behind the scenes without new tools to learn.
How it works
What happens, step by step
Every 30 minutes it looks for new emails in your chosen Outlook folder.
It pulls the web addresses out of each new email.
Each address is checked against a threat database without opening the page.
Anything flagged is posted to your security channel in Slack with the sender and subject.
Emails already checked are remembered, so nothing is reported twice.
Before it runs live
- Connect Outlook
- Connect Slack, then invite the app to the channel (type /invite @ClickRuntime there)
What you get
Build your own
Need it to work differently?
Your own rules
Conditions, thresholds, filters and exceptions, written the way you'd explain them to a colleague.
Any number of apps
One automation can read from one app and update several others. Over 248 apps are ready, and anything with an API works too.
AI where it helps
Summaries, classification, extraction and drafts use ClickRuntime's built-in AI, with no extra key.
On a schedule or on each event
Runs as often as every 5 minutes, or the moment an app sends an event, and keeps track of what it already handled.
Changes you can ask for
- Run it at a different time, more or less often, or only on weekdays
- Add an AI step, for example to summarize, sort or draft a reply
- Add another app, for example also send it to Google Sheets
- Combine it with other Outlook and Slack steps into one automation
Under the hood
The code that runs this automation
GRAPH = "https://graph.microsoft.com/v1.0"
import re
from clickruntime import on_trigger, credentials, http, state, notify, report_fetched
@on_trigger
def run(event):
h = {"Authorization": f"Bearer {credentials.connection('microsoft', 'work')}"}
seen = state.get("seen") or []
msgs = http.get(f"{GRAPH}/me/mailFolders/Phishing/messages", headers=h,
params={"$select": "id,subject,from,body", "$top": 25}).json()["value"]
new = [m for m in msgs if m["id"] not in seen]
report_fetched(len(new))
if not new:
return {"summary": "Nothing new"}
key = credentials.secret("SAFE_BROWSING_KEY")
for m in new:
urls = sorted(set(re.findall(r"https?://[^\s\"'<>]+", m["body"]["content"])))[:20]
body = {"threatInfo": {"threatTypes": ["MALWARE", "SOCIAL_ENGINEERING"], "platformTypes": ["ANY_PLATFORM"],
"threatEntryTypes": ["URL"], "threatEntries": [{"url": u} for u in urls]}}
hits = http.post(f"https://safebrowsing.googleapis.com/v4/threatMatches:find?key={key}", json=body).json().get("matches", [])
if hits:
bad = ", ".join(sorted({x["threat"]["url"] for x in hits}))
notify.slack(f":warning: {m['subject']} from {m['from']['emailAddress']['address']}: {bad}", channel="#security")
state.set("seen", (seen + [m["id"] for m in new])[-500:])
return {"checked": len(new)}FAQ
Common questions
Which emails are checked?
What service checks the links?
Does it click the links?
What permissions does it need?
Does it need AI?
How many runs does it use?
Can I change how it works?
Related
You might also like
Post a daily KPI report to Slack and email it to managers
Every weekday morning your key numbers, with the change from yesterday, are in Slack and in managers' inboxes.
See how it worksSend contact form enquiries to Slack and confirm by email
Each enquiry appears in Slack straight away and the person who wrote in gets a confirmation from your Outlook address.
See how it worksSummarise Microsoft 365 outage emails in Slack
Microsoft service-health emails become a short Slack post saying what is broken and who is affected.
See how it worksKeep exploring
Set up “Check links in reported emails for phishing” from your assistant
Copy the prompt above, or connect your assistant first. Free plan, no credit card.