Odesílá php mail() přímo cílovému SMTP?

Odesílá php mail() přímo cílovému SMTP?
« kdy: 29. 12. 2021, 23:59:19 »
Umí  php funkce mail zvlášť pro win i linux posílat mail tak, že komunikuje přímo s mx serverem (MRA asi) příjemce? Tedy není potřeba tuším MSA ani MTA-žádný odesílající smtp server.

V nápovědě php jsem četl že se liší verze: win verze ne(rozumím tím že chce znát odesílající smtp ,linux ano (posílá příkazu sendmail, ale neznamená to že  hovno spadne jen o level níž a.sendmail bude chtít znát odesílající smtp....)

Zdá se mi to divné, tak.si to chci ověřit.
« Poslední změna: 30. 12. 2021, 00:39:35 od Petr Krčmář »


Re:odesílá php mail() přímo cílovému SMTP
« Odpověď #1 kdy: 30. 12. 2021, 00:09:41 »
Ne a byl by hodně špatný nápad to tak dělat. Sendmail je normální poštovní server, akorát mu PHP nepředává e-mail SMTP protokolem ale přímo voláním binárky. Jak s e-mailem dál naloží Sendmail je už věcí jeho konfigurace. Případně můžete použít jiný poštovní server, je obvyklé, že umí příkazový řádek sendmailu emulovat (alespoň do té míry, aby přes to šlo odeslat e-mail).

Re:Odesílá php mail() přímo cílovému SMTP?
« Odpověď #2 kdy: 30. 12. 2021, 12:47:26 »
A jaký software by toto zvládl? Třeba nějaký webový framework? (Neptám se pro'ć jetošpatný nápaD.).

Re:Odesílá php mail() přímo cílovému SMTP?
« Odpověď #3 kdy: 30. 12. 2021, 13:09:25 »
Zvládl by co? Odesílat e-maily? Žádný webový framework, to zvládají poštovní servery. Osobně doporučuju Postfix, ale může to být klidně Exim, Qmail, Sendmail…

Nebo v dnešní době je určitě lepší použít na to nějakou službu – SendGrid, Mailgun, něco má v sobě určitě AWS, Google Cloud i Azure.
« Poslední změna: 30. 12. 2021, 13:11:11 od Filip Jirsák »

Re:Odesílá php mail() přímo cílovému SMTP?
« Odpověď #4 kdy: 30. 12. 2021, 16:34:08 »
PHPMailer umi komunikovat se vzdalenym SMTP, jestli je to to, o co vam jde.



Re:Odesílá php mail() přímo cílovému SMTP?
« Odpověď #5 kdy: 30. 12. 2021, 17:00:45 »
PHPMailer umi komunikovat se vzdalenym SMTP, jestli je to to, o co vam jde.
Vzdálený SMTP znamená, že mám někde v síti SMTP server, k němu se přihlásím jménem a heslem a všechny e-maily k odeslání předávám tomu jednomu serveru.

Mikesznovu se ptal na komunikaci přímo s cílovým SMTP serverem. Tj. podepsat e-mail pomocí DKIM, v DNS zjistit MX, A nebo AAAA záznam, navázat spojení s cílovým serverem, případně ho povýšit na TLS, pomocí SMTP předat e-mail k doručení –  a pokud server odpoví (třeba kvůli greylistingu) dočasným chybovým kódem, uložit e-mail do fronty a pokusit se ho za chvíli odeslat znovu. I kdyby napadlo někoho tohle celé řešit v rámci jednoho HTTP požadavku a modlit se, aby nevypršel timeout, to odesílání z fronty by takto řešit nešlo a musel by tam být nějaký časovač. Vlastně by to znamenalo naprogramovat celou odesílací část SMTP serveru (včetně fronty) v PHP – a proč by někdo něco takového dělal, když tu dávno máme hotové a spolehlivé SMTP servery, které tohle umí?

A pokud si na počítač nechcete instalovat plnohodnotný SMTP server, dá se tam nainstalovat sSMTP, který umí akorát poslat e-mail nějakému chytřejšímu SMTP serveru, který už se postará o doručení e-mailu.

Re:Odesílá php mail() přímo cílovému SMTP?
« Odpověď #6 kdy: 01. 01. 2022, 22:58:35 »
Skvělé ½. Víte na co se ptám. Co jsem ale koukal na to sSMTP, zdá se mi že to není. ono. Ale Ten  zmíněný chytřejší SMTP, to asi není cílový SMTP server pro příjemce,  ale  je pořád nějaký mezičlánek, že?

RDa

  • *****
  • 2 465
    • Zobrazit profil
    • E-mail
Re:Odesílá php mail() přímo cílovému SMTP?
« Odpověď #7 kdy: 02. 01. 2022, 00:11:19 »
Jako nerozumim co chcete. PHP mail() na linuxu pouzije sendmail binarku (na win ale nic takoveho neni.. takze to nejspis MUSI komunikovat s cilovym MX), a co se stane dal, je otazkou toho, zda mate treba lokalni postfix instalaci, nebo nejaky relay typu ssmtp (ten pouzivam na serverech, ktere se hlasi na muj korporatni smtp skrze prideleny ucet).

Ceho chcete dosahnout??

Skier

  • ***
  • 110
    • Zobrazit profil
    • E-mail
Re:Odesílá php mail() přímo cílovému SMTP?
« Odpověď #8 kdy: 02. 01. 2022, 10:04:18 »
Skvělé ½. Víte na co se ptám. Co jsem ale koukal na to sSMTP, zdá se mi že to není. ono. Ale Ten  zmíněný chytřejší SMTP, to asi není cílový SMTP server pro příjemce,  ale  je pořád nějaký mezičlánek, že?
Jestli tomu dobře rozumím, hledáte takové řešení, kdy by se PHP mail() spojil přímo s cílovým mail serverem a zprávu mu "nějak" předal.

Jestli to je opravdu tak, je to hned z více důvodů nesmysl. Ten hlavní bude asi ten, že se nedá očekávat, že na všech cílových SMTP serverech budete mít Váš vlastní účet, kterým se na ně přihlásíte.

Předpokládám, že se na to celé ptáte kvůli tomu, že ve Vaší síti jsou nějaké restrikce na odchozí traffic na SMTP portech.

Asi by bylo lepší popsat svůj primární problém a na ten potom hledat řešení.

Re:Odesílá php mail() přímo cílovému SMTP?
« Odpověď #9 kdy: 02. 01. 2022, 10:12:07 »
na win ale nic takoveho neni.. takze to nejspis MUSI komunikovat s cilovym MX
Ano, na Windows nic takového není. PHP mail() pak ale nekomunikuje přímo s cílovým serverem, ale s nějakým místním serverem, kterému předá e-mail k odeslání. Stejně, jako to dělá třeba Thunderbird nebo jakýkoli jiný poštovní klient.

Ten hlavní bude asi ten, že se nedá očekávat, že na všech cílových SMTP serverech budete mít Váš vlastní účet, kterým se na ně přihlásíte.
Tohle je nesmysl. Když někam posíláte e-mail, žádný účet na tom serveru samozřejmě nemáte.

Důvod, proč běžný klient (ať už funkce mail() nebo třeba Thunderbird) neposílá rovnou cílovému serveru, je ten, že  takové odesílání je docela komplikovaná věc, která zahrnuje např. udržování fronty zpráv k odeslání a opakované pokusy o odeslání e-mailů z té fronty. Je nesmyslné něco takového programovat v každém klientovi zvlášť, navíc PHP ani Thunderbird neběží trvale, takže by nemohly obsluhovat tu frontu zpráv k odeslání.

Asi by bylo lepší popsat svůj primární problém a na ten potom hledat řešení.
Souhlas.

RDa

  • *****
  • 2 465
    • Zobrazit profil
    • E-mail
Re:Odesílá php mail() přímo cílovému SMTP?
« Odpověď #10 kdy: 02. 01. 2022, 16:14:44 »
na win ale nic takoveho neni.. takze to nejspis MUSI komunikovat s cilovym MX
Ano, na Windows nic takového není. PHP mail() pak ale nekomunikuje přímo s cílovým serverem, ale s nějakým místním serverem, kterému předá e-mail k odeslání. Stejně, jako to dělá třeba Thunderbird nebo jakýkoli jiný poštovní klient.

Jo, to me pak vzapeti napadlo, ze by byla blbost komunikovat naprimo.

Ale pokud jsou ty php.ini optiony ohledne nastaveni "serveru odchozi posty" (host/port/user/pass) aplikacne menitelne, asi nic nebrani si resolvnout MX, pre-nastavit konfiguraci a poslat to tam naprimo (bez uctu, bez hesla). Jen nevim co by pak jako uzivatel (skript) delal s docasnymi chybami, pokud to ma zaroven bezet zpod http requestu :-) U cli-php jsou ty moznosti o neco lepsi.

Re:Odesílá php mail() přímo cílovému SMTP?
« Odpověď #11 kdy: 02. 01. 2022, 19:03:27 »
>Skier
Ano, hledám řešení, které bude komunikovat  přímo s MX serverem pro danou doménu příjemce
Ne, na síti restrikce nemám.  Spojení na port 25 mi fungovalo, posílání mailů fungovalo. Ale šlo o odlišnou věc než je téma dotazu, tam jsem se přihlašoval na "SMTP" server poskytovatele mé schránky "pod mým" účtem- klasické údaje pro  odeslání ze skriptů nebo údaje pro TheBat,Mozilla







>Filip Jirsák > Skier
Ano, to je nesmysl, vždyť přece nelze očekávat, že uživatel gmailu (nebo vlastní služby) bude mít  (rozdá)své přihlašovací údaje všem možný poskytovatelům mailu  (a seznamu). když chce  někdo z gmail poslat mail někomu na seznamu,  se hlásí jen na gmail a smtp servery gmail už to posílají na smtp seznamu bez nich*


>RDa (2.)
To už jsem taky bezúšpěně zkusil na dvě domény  přes PHPMailer (s Debuglevel 4) - jako smtp server nastavit `host -tMX prijemcuvmailzazavinacem.cz`, zkoušel jsem 587 i 465. Samozřejmě bez autentizace, jak psal Filip Jirsák. V jednom případě to psalo,že to chce autentizaci uživatele*., v druhé asi taky . Tedy nenastavoval jsem přesně php.ini, protože jsem používal knihovnu $m=new PHPMailer();$m->isSMTP();


* No a tady vzniká spor: proč tedy mx server (ne smtp) těch domén po mě chtěl credentials, když posílám z jiné domény? Nebo existuje nějaký způsob mezi-smtp autentizace? (když zpráva přechází z serveru jednoho poskytovatele na druhého?)

----
A jde mi spíš o proof of concept, něco takového naostro provozovat je šílenost jak psali někteří. Hned teď mě napadá taková samozřejmost jako odeslání mailu více příjemcům na různých doménách. Na "místní" SMTP by stačilo odeslat zprávu jednou, kdežto takhle by se muselo rozparsovat (roz"partition"ovat po anglicko-česku) seznam příjemců dle domén.
« Poslední změna: 02. 01. 2022, 19:05:51 od mikesznovu »

Re:Odesílá php mail() přímo cílovému SMTP?
« Odpověď #12 kdy: 02. 01. 2022, 19:47:58 »
Jako nerozumim co chcete. PHP mail() na linuxu pouzije sendmail binarku (na win ale nic takoveho neni.. takze to nejspis MUSI komunikovat s cilovym MX), a co se stane dal, je otazkou toho, zda mate treba lokalni postfix instalaci, nebo nejaky relay typu ssmtp (ten pouzivam na serverech, ktere se hlasi na muj korporatni smtp skrze prideleny ucet).

Ceho chcete dosahnout??
Ano, otázka je, co je cílem.
Ale aplikace nemůže odesílat maily (SMTP) přímo cílovým serverům, protože:
1) nemá jak podepsat zprávu (DKIM - nemá privátní klíč)
2) nejspíš nebude IP stroje v SPF (a pokud by používal stejnou IP - NAT - je to ideální způsob, jak dostat svou doménu a IP adresu na blacklist/blocklist)
3) nezařídí frontu (momentálně nedostupný, greylisting)
4) neumožní přijmout a zpracovat odpověď (což může být zpráva o chybě doručení)
Ty parametry v php.ini jen umožní definovat, jak se mail k odeslání předá místnímu mail serveru ke zpracování - jestli přímo lokálnímu maileru v režimu relay, nebo přes SMTP - ale zase jen serveru v místní síti), kde ta volitelná autentizace je pro místní účet odesílatele.

Re:Odesílá php mail() přímo cílovému SMTP?
« Odpověď #13 kdy: 02. 01. 2022, 20:24:53 »
Ano, hledám řešení, které bude komunikovat  přímo s MX serverem pro danou doménu příjemce
Libovolný plnohodnotný poštovní server – Postfix, Exim, qmail, Sendmail, Microsoft Exchange. Už jsem to tu psal. Nějaké řešení jako naprogramovat si plnohodtného SMTP klienta s frontou a DKIM podepisováním je nesmysl.

No a tady vzniká spor: proč tedy mx server (ne smtp) těch domén po mě chtěl credentials, když posílám z jiné domény?
Protože ten server neobsluhuje doménu, na kterou e-mail posíláte. Server tedy usoudí, že po něm chcete, aby zařídil odeslání předávaného e-mailu – a to dělá jenom pro „své“ uživatele, kteří se autentizují jménem a heslem.

Je to rozdíl mezi MTA (Mail transfer agent) a MDA (Mail delivery agent). MDA naslouchá na portu 25 a doručuje e-maily pro konkrétní doménu (nebo domény) do schránek. MTA naproti tomu převezme e-mail od klienta (poštovní program jako Thunderbird nebo funkce mail() v PHP), zařadí jej do fronty a pak se jej pokouší předat cílovému MTA. MDA vyžaduje obvykle autentizaci jménem a heslem – musí vědět, že doručuje e-mail pro „své“ klienty. MDA naslouchá na portu 587. Dříve ale MDA také naslouchal na portu 25, obvykle to z důvodu zpětné kompatibility zůstává zachováno – takže v tom vašem případě jste se připojil právě k MDA.

No a tady vzniká spor: proč tedy mx server (ne smtp) těch domén po mě chtěl credentials, když posílám z jiné domény?
Chtěl je po vás proto, že jste komunikoval se serverem, který neobsluhuje schránky pro doménu, kam jste chtěl e-mail doručit. Nekomunikoval jste se serverem, který byste nalezl v DNS (pod MX nebo jako A/AAAA záznam). Pokud jste se k němu chtěl připojit, ale připojil jste se k jinému serveru, nejspíš váš ISP unáší provoz na portu 25 na svůj server.

A jde mi spíš o proof of concept
Pořád ale envím, co má být cílem. Naimplementovat plnohodnotný MTA v PHP?

Re:Odesílá php mail() přímo cílovému SMTP?
« Odpověď #14 kdy: 02. 01. 2022, 21:08:23 »
Pane mikeshznovu, možná máte nějaké důvody, proč věc chcete řešit tak, jak jste uvedl v prvním příspěvku. Ale spíš se domnívám, že neznáte všechny souvislosti týkající se mailového provozu. Zkusím napsat, jak a proč bych podobnou věc řešil já. Kolegové vás stejným směrem v rámci debaty jak vidím tlačí, já to zkusím shrnout a snad tomu dát nějaký zastřešující nadhled.

Vycházím z této situace: Mám linuxový či obecně unixový stroj (k případnému řešení na Windows se nevyjadřuji). Na tom linuxu běží webová aplikace psaná v php, je potřeba z ní odesílat maily. S použitím phpmaileru, budiž. K tomu serveru mám plný (rootovský) přístup. Není to školní či hobby úloha, budeme uvažovat produkční nasazení, ať už to slovo znamená cokoliv.

Phpmailer nastavím tak, aby maily odesílal na smtp server s adresou 127.0.0.1, port 25, bez autentizace. Tedy nějaké smtp službě běžící na tom serveru s webovou aplikací. Z pohledu té aplikace jde o jednoduché, přímočaré řešení. Aplikace mail předala smtp protokolem někam dál, a o další existenci a způsobu doručování toho mailu se nestará, nechce starat ani zajímat.

Na tom vašem serveru nechť je instalován postfix (nebo exim či sendmail). Budiž nastaven tak, aby naslouchal pouze na loopbacku 127.0.0.1, čili není potřeba řešit o něco složitější nastavení kvůli tomu, aby server nemohl být zneužíván třetí stranou k šíření spamu (open relay). Na veřejném rozhraní maily tedy nepřijímá, ale odesílat je v režimu smtp klienta dokáže.

To co vidím jako zásadní je, že od tohoto okamžiku dokážete na úrovni php aplikace mail rychle předat nějakému poštovnímu serveru. A nemusíte řešit situace kdy cílový či nějaký zprostředkující smtp server maily dočasně z jakéhokoliv důvodu nepřijímá, nebo stav kdy došlo někde "na cestě" ke ztrátě ip konektivity. Váš lokální postfix drží mail u sebe ve frontě a sám podniká opakované pokusy o doručení.

Aby ten mail byl protistranou úspěšně přijat a nebyl protějším smtp serverem považován za spam, tak k tomu je potřeba splnit celou řadu dalších požadavků a použít technologie, jejichž zkratkami tu raději ani nebudu pohazovat. Jen takové zahřívací dotazy: generujete maily včetně správně sestaveného řádku Message-Id:? Máte správné MIME hlavičky počínaje MIME-Version:? (phpmailer znám jen z rychlíku, možná se o to stará sám)

Abyste těmi poštovními technologiemi neztrácel zbytečně mnoho úsilí a času, tak kvůli tomu jednotliví ISP provozují skutečné poštovní servery. Do vašeho lokálního postfixu stačí doplnit pár dalších řádek (adresa takového serveru plus autentizační údaje). Server Vašeho ISP pak je ochoten Váš mail převzít a sám už zařídí vše potřebné, např. DKIM podpisy. Nu a pak ten mail odešle na cestu směrem k příjemci. Samozřejmě obdobně můžete místo Vašeho ISP využít i servery gmailu či seznamu.

Nezmínil jsem otázku zpráv o nedoručitelnosti. Adresa příjemce může být chybná, nebo zanikla atp. Zprávy o nedoručení nebudete schopen přijímat smtp serverem na Vašem webovém stroji, protože on zprávy ze světa vůbec nedokáže přijmout. Je potřeba mít celkové nastavení takové, aby nedoručenky končily ve vašem mailboxu u ISP.