Skip to content

Instantly share code, notes, and snippets.

@BananaAcid
Last active April 3, 2025 13:11
Show Gist options
  • Save BananaAcid/60907fdd56f346fcb2dd42df0b537f2f to your computer and use it in GitHub Desktop.
Save BananaAcid/60907fdd56f346fcb2dd42df0b537f2f to your computer and use it in GitHub Desktop.
Powershell Spamtest per KI im eigenen Outlook

Powershell Spamtest per KI im eigenen Outlook

Starten

in der Powershell

& ./test-spam.ps1

oder

& ./test-spam.ps1 -watchTarget "#checkspam"

KI Auswertung einzeln starten (nach E-Mail-Inhalt wird gefragt)

& ./spam-test.ai.google.ps1 | Show-Markdown

oder

& ./spam-test.ai.openai.ps1 | Show-Markdown

Dabei kann eine SPAM-E-Mail in spam-test-mail.txt abgelegt werden (Bei der Eingabe kann es sonst zu Problemen kommen, wenn man eine E-Mail mit mehreren leeren Zeilen in die Kommandozeile einfügt).

Schritte:

  1. gehe alle 3 Minuten die E-Mails im Posteingang durch und suche nach E-Mails mit '#spamcheck' im Betreff
  2. übergebe diese an eine KI
  3. erstelle im eigenen Outlook im Ordner --Prüf Mich-- eine E-Mail mit der Auswertung
  4. Zeige ein Toast rechts unten am Bildschirm, dass eine E-Mail verarbeitet wurde.

Einstellungen

  • in spam-test.ps1 Variablen anpassen, das entsprechende Skript für OpenAI/Ollama oder GoogleAI eingeben
  • die entsprechende spam-test.ai...ps1 anpassen (Zugangs-Key, URL, Model)
  • optional: in spam-test.outlook.ps1 Variablen anpassen, besonders die E-Mail-Daten anpassen

Beispielausgabe der Analyse (mit Google gemini-2.0-flash)

Die Ausgabe kann vaiieren. Gerne in den Prompts Fine-Tunen und verbesserungen in die Kommentare.

Okay, ich analysiere die E-Mail auf Spam:

1. Betreff:

  • Schlagworte/Begriffe: "rezeptf-rei Online bestellen" deutet auf Pharmazeutika hin, was oft in Spam vorkommt.
  • Länge: Mittellang.

2. Absender:

  • Bekannte Absender: Nein.
  • Domain-Präfixe: @ruelaautopecas.com – ungewöhnliche Domain für eine Apotheke.
  • Schreibfehler: Keine offensichtlichen.

3. Empfänger:

  • Empfangsprofil: Unklar, aber die E-Mail ist an eine spezifische Adresse (@redmann.de) adressiert.
  • Häufigkeit: Nicht bekannt.

4. Inhalt:

  • Sprachliche Struktur/Grammatik: Akzeptabel, aber mit einigen stilistischen Mängeln und ungewöhnlichen Formulierungen.
  • Smilies/Zahlen in Worten: Keine.
  • Großbuchstaben: Normale Verwendung.

5. Textformate:

  • HTML-verschachtelte Texte: Ja, die E-Mail enthält sowohl Klartext als auch HTML-Versionen.
  • Bildverweise: Keine direkten Bildverweise im Text sichtbar, aber die HTML-Version könnte Bilder laden. (Wird aber ignoriert).

6. Grafiken:

  • Anzahl/Größe: Kann nicht beurteilt werden (wird ignoriert).
  • Begriffe wie "bild" oder "pic": Keine im Text.

7. Hyperlinks:

  • Menge: Ein Hyperlink.
  • Unbekannte URL-Verbindungen: "weltapotheke.nl" könnte eine legitime Apotheke sein, aber die Domain sollte überprüft werden.

8. Zeitpunkt:

  • Zeit des Tages: 01:03 Uhr – könnte ungewöhnlich sein.
  • Häufigkeit: Nicht bekannt.

9. Mime-Type:

  • Typ der E-Mail-Struktur: Multipart/alternative (Klartext und HTML) ist typisch für Marketing-E-Mails, kann aber auch in Spam vorkommen.

10. Kontext:

  • Bezug zu früheren E-Mails: Unbekannt.
  • Referenzierung an bekannte Themen: Die E-Mail behauptet, ein persönliches Problem anzusprechen (Erektionsstörung).

Zusammenfassung der Kriterien:

  • Betreff: Erfüllt (verdächtige Keywords)
  • Absender: Erfüllt (unbekannte/ungewöhnliche Domain)
  • Empfänger: Nicht erfüllt (spezifische Adresse)
  • Inhalt: Erfüllt (fragwürdige Formulierungen, Ansprechen persönlicher Probleme)
  • Textformate: Neutral (typisch für Marketing-E-Mails)
  • Grafiken: Nicht relevant (ignoriert)
  • Hyperlinks: Erfüllt (unbekannte/zu überprüfende URL)
  • Zeitpunkt: Erfüllt (ungewöhnliche Zeit)
  • Mime-Type: Neutral (typisch für Marketing-E-Mails)
  • Kontext: Erfüllt (Ansprechen persönlicher Probleme)

Meine Einschätzung ist, dass es sich um Spam handelt.

# Schritt 2 - GOOGLE AI
param (
[string]$message # E-Mail-Inhalt kann an dieses Script übergeben werden
)
. .\spam-test.prompts.ps1
if (-not $systemPrompt) {
echo "⚠️ KEIN SYSTEM PROMPT GELADEN!"
$systemPrompt = "Du bist ein hilfreicher Assistent für die Spam-Erkennung."
}
# Falls keine Nachricht übergeben wurde, Benutzer fragen
if (-not $message -or $message.Trim() -eq "") {
$message = Get-Content "spam-test-mail.txt" || Read-Host "Bitte gib den E-Mail-Inhalt (mit Headern) ein"
}
# FREE API KEY: https://aistudio.google.com/apikey
$apiKey = ".........."
$url = "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=" + $apiKey
$headers = @{
"Content-Type" = "application/json"
}
$body = @{
"system_instruction" = @{
"parts" = @( @{"text"=$systemPrompt} )
}
"contents" = @(
@{"role"="user"; "parts" = @( @{ "text"=$userPrompt+"\n\n"+$message } ) }
)
} | ConvertTo-Json -Depth 10
$response = Invoke-RestMethod -Uri $url -Method Post -Headers $headers -Body $body
$result = $response.candidates[0].content.parts[0].text
## Debug output:
# $result | Show-Markdown
return $result
# Schritt 2 - OpenAI (ChatGPT) and Ollama
param (
[string]$message # E-Mail-Inhalt kann an dieses Script übergeben werden
)
. .\spam-test.prompts.ps1
if (-not $systemPrompt) {
echo "⚠️ KEIN SYSTEM PROMPT GELADEN!"
$systemPrompt = "Du bist ein hilfreicher Assistent für die Spam-Erkennung."
}
# Falls keine Nachricht übergeben wurde, Benutzer fragen
if (-not $message -or $message.Trim() -eq "") {
$message = Get-Content "spam-test-mail.txt" || Read-Host "Bitte gib den E-Mail-Inhalt (mit Headern) ein"
}
#$apiKey = "sk-proj-..............."
# OpenAI https://api.openai.com/v1/chat/completions -- needs API Key -> Bearer Header
# Ollama Local: http://127.0.0.1:11434/v1/chat/completions
$url = "http://127.0.0.1:11434/v1/chat/completions"
$headers = @{
#"Authorization" = "Bearer $apiKey" # for OpenAI (ChatGPT), not needed for Ollama
"Content-Type" = "application/json"
}
$body = @{
"model" = "gemma3:12b" #"goekdenizguelmez/JOSIEFIED-Qwen2.5:latest" # "gemma3:12b" for Ollama. For ChatGPT enter "gpt-4-turbo"
"messages" = @(
@{"role"="system"; "content"=$systemPrompt},
@{"role"="user"; "content"=$userPrompt+"\n\n"+$message}
)
"temperature" = 0.7
} | ConvertTo-Json -Depth 10
$response = Invoke-RestMethod -Uri $url -Method Post -Headers $headers -Body $body
$result = $response.choices[0].message.content
## Debug output:
# $result | Show-Markdown
return $result
# Schritt 3 - E-Mail in Outlook mit Auswertung anlegen und Toast anzeigen
param (
[string]$emailContent # Nimmt den von der KI übergebenen Inhalt der Auswertung an
)
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
# Variablen definieren
$empfaenger = "[email protected]"
$absender_ich = "[email protected]"
$targetFolderName = "--Prüf Mich--" # Ordner für die E-Mail
$emailSubject = "Zu prüfen: Wichtige E-Mail" # E-Mail-Betreff
# Outlook-Instanz starten
$outlook = New-Object -ComObject Outlook.Application
$namespace = $outlook.GetNamespace("MAPI")
# Posteingang abrufen
$inbox = $namespace.GetDefaultFolder(6) # 6 = olFolderInbox
# Prüfen, ob der Ordner existiert, sonst erstellen
$targetFolder = $null
foreach ($folder in $inbox.Folders) {
if ($folder.Name -eq $targetFolderName) {
$targetFolder = $folder
break
}
}
if (-not $targetFolder) {
$targetFolder = $inbox.Folders.Add($targetFolderName)
}
# Neue E-Mail erstellen
$mail = $outlook.CreateItem(0) # 0 = olMailItem
$mail.To = $empfaenger
$mail.Sender = $absender_ich
$mail.Subject = $emailSubject # Betreff aus Variable
$mail.Body = $emailContent # Nutzt den übergebenen Parameter
# E-Mail speichern und in den Zielordner verschieben
$mail.Save()
$savedMail = $inbox.Items | Where-Object { $_.Subject -eq $emailSubject -and $_.To -eq $empfaenger }
if ($savedMail) {
$savedMail.Move($targetFolder)
}
# Windows-Benachrichtigung mit NotifyIcon
$global:balmsg = New-Object System.Windows.Forms.NotifyIcon
$path = (Get-Process -id $pid).Path
$balmsg.Icon = [System.Drawing.Icon]::ExtractAssociatedIcon($path)
$balmsg.BalloonTipIcon = [System.Windows.Forms.ToolTipIcon]::Info
$balmsg.BalloonTipText = "Die E-Mail wurde erfolgreich in '$targetFolderName' verschoben."
$balmsg.BalloonTipTitle = "E-Mail gespeichert"
$balmsg.Visible = $true
$balmsg.ShowBalloonTip(5000)
Write-Host "E-Mail mit Betreff '$emailSubject' gespeichert und in '$targetFolderName' verschoben."
# Alle benötigten Prompts für die KI (Arbeitsanweisungen)
$userPrompt = "Überprüfe diese E-MAIL:"
$systemPrompt = @"
Antworte auf Deutsch.
Du bist ein hilfreicher Spam-Analyse-Assistent.
Du überprüfst nach gängignen Regeln die E-Mails **NUR** auf Spam, die dir gegeben werden.
Ignoriere Bilder und Anhänge.
Am Ende unbedingt eine Liste mit den unten aufgelistetn Kriterien anzeigen, und jedweils einen Listenpunkt, ob die E-Mail den jeweiligen Punkt erfüllt oder nicht.
Als letzen Satz unbedingt angeben, wie deine Einschätzung ausgefallen ist: ob es Spam ist oder nicht.
Verwendete Kriterien zur Überprüfung von E-Mails auf Spam:
1. **Betreff**:
- Schlagworte oder ausgewählte Begriffe (z.B. "sicher", "zahlen", "versenden").
- Längen des Betreffs, ob kurz oder lang.
2. **Absender**:
- Kennzeichnung von bekannten Absendern.
- Domain-Präfixe (z.B. @gmail.com).
- Schreibfehler im Namen des Absenders.
3. **Empfänger**:
- Vergleich mit dem Empfangsprofil des Benutzers.
- Häufigkeit der E-Mail-Adresse.
4. **Inhalt**:
- Sprachliche Struktur und Grammatik.
- Viele Smilies oder Zahlen in Worten.
- Verwendung von Großbuchstaben.
5. **Textformate**:
- HTML-verschachtelte Texte.
- Bildverweise.
6. **Grafiken**:
- Anzahl und Größe der eingebetteten Grafiken.
- Verwendung von Begriffen wie "bild" oder "pic".
7. **Hyperlinks**:
- Menge an Hyperlinken.
- Unbekannte URL-Verbindungen.
8. **Zeitpunkt**:
- Vorkommnisse zu bestimmte Zeiten des Tages (z.B. Morgen, Nachmittag).
- Häufigkeit der E-Mails von bestimmten Absendern in einem bestimmten Zeitraum.
9. **Mime-Type**:
- Typ der E-Mail-Struktur (z.B. eine einfache Text-E-Mail oder eine komplexere
HTML-E-Mail).
10. **Kontext**:
- Bezug zu früheren E-Mails zwischen gleichen Empfänger/Absender-Paaren.
- Referenzierung an bereits bekannte Themen.
Diese Kriterien können kombiniert und gewichtet werden, um die Wahrscheinlichkeit des
Status einer E-Mail als Spam mit größerer Genauigkeit zu bestimmen.
"@
# Scrhitt 1 - Start Datei
param (
[string]$watchTarget = "#checkspam" # Stichwort im Betreff
)
# Variablen definieren
$aiScript = ".\spam-test.ai.openai.ps1"
# Outlook-Instanz starten
$outlook = New-Object -ComObject Outlook.Application
$namespace = $outlook.GetNamespace("MAPI")
# Schleife, die alle 3 Minuten erneut prüft
while ($true) {
Write-Host "Überprüfung gestartet: $(Get-Date)"
# Posteingang abrufen
$inbox = $namespace.GetDefaultFolder(6) # 6 = olFolderInbox
$mails = $inbox.Items
# Prüfen, ob neue E-Mails mit "#checkspam" im Betreff vorhanden sind
foreach ($mail in $mails) {
if ($mail.Subject -match $watchTarget) {
# Inhalt der E-Mail in Variable speichern
$mailContent = $mail.Body
Write-Host "Gefundene E-Mail: $mail.Subject"
Write-Host "Weiterleitung an die KI"
# Skript zur AI-Prüfung aufrufen und Ergebnis speichern
$result = & $aiScript -emailContent $mailContent
# E-Mail als gelesen markieren
$mail.UnRead = $false
$mail.Save()
# Ergebnis in Outlook speichern
Write-Host "Ergebnis wird in Outlook gespeichert..."
& ".\spam-test.outlook.ps1" -emailContent $result
}
}
Write-Host "Überprüfung abgeschlossen. Warte 3 Minuten..."
Start-Sleep -Seconds 180 # 3 Minuten warten
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment