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

Interesting!

If you don't want to lose your cool over the fact that you have to figure out everything via the EWS-API on your own, and you want it to be easier and more effective, then this is the solution for you. https://penaltykickonline.com 
Theodore Cooley on 2.2.2023 10:11

Re: Jak poslat email pomocí EWS na outlook.com a PowerShellu

Powyższy kod pokazuje podstawowy sposób wysyłania https://slopeonline.org wiadomości e-mail za pomocą EWS w PowerShellu. Możesz dostosować kod do swoich indywidualnych potrzeb, na przykład dodając załączniki lub inne elementy.

Slope on 11.7.2023 10:30

nemuste

 Its simplicity, accessibility, and nostalgic charm make it a classic choice for gamers of all ages. https://spacebar-clicker.com/
good on 26.9.2023 8:43

Re: Jak poslat email pomocí EWS na outlook.com a PowerShellu

Great blog. Reading your article was interesting. To me, this is really an interesting website. I bookmarked it and would love to read more from it. Continue your great efforts! https://motox3mgame.io/
ok on 9.10.2023 6:54

fnaf

Díky za sdílení této informace, která může být pro některé uživatele PowerShellu velmi užitečná.
https://fnafgo.com
delwy rosa on 26.10.2023 16:19

GOOD

V tomto online školicích videu se dozvíte, jak vytvářet a posílat e-mailové zprávy  https://slopegameonline.io
victoriaemmy68 on 13.11.2023 3:41

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