Skip Ribbon Commands
Skip to main content

Ondrej Sevecek's Blog

:

Engineering and troubleshooting by Directory Master!
Ondrej Sevecek's Blog > Posts > Jak poslat email pomocí EWS na outlook.com a PowerShellu
květen 03
Jak poslat email pomocí EWS na outlook.com a PowerShellu

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.

Comments

EWS

k EWS jsou perfektni ukazky zde
http://gsexdev.blogspot.cz/search/label/EWS%20Basics

a pokud se nechcete rozcilovat s tim, ze pres EWS-API si vse musite resit sami a chcete to jednoduseji a lepe, tak tohle:
http://www.rebex.net/secure-mail.net/features/ews-sending-emails.aspx
VasekB on 4.5.2017 0:44

pri posilani pozor na limity

VasekB on 4.5.2017 0:55

EWS authentication

VasekB on 4.5.2017 1:04

Add Comment

Title


Pole Title nemusíte vyplňovat, doplní se to samo na stejnou hodnotu jako je nadpis článku.

Author *


Pole Author nesmí být stejné jako pole Title! Mám to tu jako ochranu proti spamu. Roboti to nevyplní dobře :-)

Body *


Type number two as digit *


Semhle vyplňte číslici dvě. Předchozí antispemové pole nefunguje úplně dokonale, zdá se, že jsou i spamery, které pochopily, že je občas potřeba vyplnit autora :-)

Email


Emailová adresa, pokud na ni chcete ode mě dostat odpověď. Nikdo jiný než já vaši emailovou adresu neuvidí.

Attachments