| Pokud chcete odesílat mail z nějakého PowerShell skriptu, máte všude návody, jak to udělat pomocí SMTP. Problém je, že někdy SMTP prostě není dostupné, například kvůli tomu, že vám firewall blokuje porty. Blokování TCP 25 je vcelku klasika, ale to jsem ani nepoužíval. Pro odesílání mailu po ověřeném spojení, tzn. po zadání nějakého loginu a hesla, se používá na Exchange, Office365 i outlook.com na portu TCP 587. Stejně chcete mnohdy posílat do jiných domén - relay. Jenže i to pomalu končí, jak pozoruju :-)
Takže jiná cesta je použít web service, to znamená HTTPS komunikaci s nějakou webovou službou, kterou ten Exchange/Office365/outlook.com nabízí. To je již velmi dlouho EWS (Exchange Web Services). Kdo máte Exchange, tak jste zajisté v IIS viděli virtuální adresář ews a případně jste tomu nastavovali nějaké parametry pomocí Set-WebServicesVirtualDirectory, ne?
Když to chcete použít z PowerShellu, stačí si k tomu stáhnout z Microsoftu knihovnu nazvanou Exchange Web Services Managed API (odkaz je na verzi 2.2), která jde načíst jak do PowerShell 2.0 tak i do novější verze, takže je jedno, jestli máte netfx 2.0 nebo netfx 4.x.
No a potom už vesele posíláte. Já jsem si k tomu zařídil zadarmo účet na outlook.com. Odesílání funguje i do jiných domén, dokonce se odeslané maily ani neukládají v odchozí poště :-)
function Send-OutlookEwsMail (
[string] $login,
[string] $password,
[string] $rcptTo,
[string] $subject,
[string] $message,
[string] $dllPath = [IO.Directory]::GetCurrentDirectory()
)
{
[string] $ewsAssemblyPath = Join-Path $dllPath 'Microsoft.Exchange.WebServices.dll'
if (-not (Test-Path $ewsAssemblyPath)) {
throw ('The EWS assembly file does not exist: {0}' -f $ewsAssemblyPath)
}
[System.Reflection.Assembly] $exchAssembly = [System.Reflection.Assembly]::LoadFile($ewsAssemblyPath)
if (-not ([object]::Equals($exchAssembly, $null))) {
[Microsoft.Exchange.WebServices.Data.ExchangeService] $exchSvc = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService
$exchSvc.Credentials = New-Object Microsoft.Exchange.WebServices.Data.WebCredentials ($login, $password)
$exchSvc.Url = New-Object System.Uri 'https://outlook.com/EWS/Exchange.asmx'
[Microsoft.Exchange.WebServices.Data.EmailMessage] $exchMail = New-Object Microsoft.Exchange.WebServices.Data.EmailMessage ($exchSvc)
[void] $exchMail.ToRecipients.Add($rcptTo)
$exchMail.Subject = $subject
$exchMail.Body = New-Object Microsoft.Exchange.WebServices.Data.MessageBody ($message)
$exchMail.Send()
}
}
Jenom bych k tomu účtu na outlook.com dodal jednu poznámečku - ze začátku to posílalo v pohodě, až se to najednou zaseklo na hlášce:
An internal server error occurred. The operation failed. WASCL UserAction verdict is not None. Actual verdict is HipSend, ShowTierUpgrade.
No prostě se tam musíte po nějakém čase (u mě to bylo cca 8 hodin) přihlásit přes webové rozhraní a potvrdit nějakou kapču (captcha), že nejste spamovací robot - Help us fight spam email. We're sorry to have to ask you to prove you're a person. Most spam comes from automated programs, which can't solve puzzles like this. |