#
.SYNOPSIS
Ruft eine Webseite ab, extrahiert die Textausgabe und oeffnet damit eine neue Mail
im Standard-Mailprogramm.
.DESCRIPTION
- Laedt die URL (PowerShell 5.1 / Windows 10 kompatibel, TLS 1.2 erzwungen).
- text/plain wird direkt uebernommen, HTML wird in lesbaren Text umgewandelt.
- Ist Outlook (klassisch) der Standard-Mailclient, wird die Mail per COM erstellt
(keine Laengenbegrenzung). Andernfalls per mailto:, bei ueberlaenge gekuerzt;
der vollstaendige Text liegt dann in der Zwischenablage.
.EXAMPLE
.\Send-WebTextToMail.ps1 -Url "https://check.example.de/report/abc123.txt"
.EXAMPLE
.\Send-WebTextToMail.ps1 -Url "https://intern.local/status" -SkipCertificateCheck -ForceMailto
#>
[CmdletBinding()]
param(
[Parameter(Mandatory)]
[string]$Url = 'https://internetdb.shodan.io',
[string]$To = 'ticket@hsp-edv.de',
[string]$Subject = 'php2shell: Offene Ports auf primaerem WAN-Interface',
# Maximale Gesamtlaenge der mailto-URL (Outlook/Windows-Shell ca. 2048)
[int]$MaxMailtoLength = 1800,
# Selbstsignierte Zertifikate akzeptieren (nur fuer interne Ziele!)
[switch]$SkipCertificateCheck,
# Immer mailto verwenden, auch wenn Outlook Standard ist
[switch]$ForceMailto
)
$ErrorActionPreference = 'Stop'
# --- TLS / Zertifikate (PS 5.1) -------------------------------------------------
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 -bor [Net.SecurityProtocolType]::Tls11
if ($SkipCertificateCheck) {
if ($PSVersionTable.PSVersion.Major -ge 6) {
$PSDefaultParameterValues['Invoke-WebRequest:SkipCertificateCheck'] = $true
} else {
[Net.ServicePointManager]::ServerCertificateValidationCallback = { $true }
}
}
# --- Abruf -----------------------------------------------------------------------
try {
$resp = Invoke-WebRequest -Uri $Url -UseBasicParsing -TimeoutSec 30
} catch {
Write-Error "Abruf von $Url fehlgeschlagen: $($_.Exception.Message)"
exit 1
}
# Inhalt explizit als UTF-8 dekodieren (PS 5.1 raet sonst ISO-8859-1, wenn charset fehlt)
$charset = 'utf-8'
$ct = [string]$resp.Headers['Content-Type']
if ($ct -match 'charset=([\w\-]+)') { $charset = $Matches[1] }
$bytes = $resp.RawContentStream.ToArray()
$raw = [Text.Encoding]::GetEncoding($charset).GetString($bytes)
# --- HTML -> Text ----------------------------------------------------------------
function ConvertFrom-HtmlToText([string]$html) {
$t = $html
$t = [regex]::Replace($t, '(?is)<(script|style|noscript|head)[^>]*>.*?\1>', '')
$t = [regex]::Replace($t, '(?i)
', "`n")
$t = [regex]::Replace($t, '(?i)(p|div|tr|li|h[1-6]|table|pre|section|article)>', "`n")
$t = [regex]::Replace($t, '(?i)