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

_Jenda

  • *****
  • 1 550
    • Zobrazit profil
    • https://jenda.hrach.eu/
    • E-mail
Re:Odesílá php mail() přímo cílovému SMTP?
« Odpověď #15 kdy: 03. 01. 2022, 06:45:44 »
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.
Jestli jste si ještě nevšiml, tak pro submission z internetu se používá 25. (no a podobně úspěšné budou vaše další pokusy o přímé doručování pošty - počkejte si třeba na ten greylisting  ::) )


Re:Odesílá php mail() přímo cílovému SMTP?
« Odpověď #16 kdy: 03. 01. 2022, 07:28:57 »
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.
Jestli jste si ještě nevšiml, tak pro submission z internetu se používá 25. (no a podobně úspěšné budou vaše další pokusy o přímé doručování pošty - počkejte si třeba na ten greylisting  ::) )
Pro submission se používá 587/STARTTLS - ale je to skutečně submission - tedy pro oprávněného uživatele serveru příslušné domény s autentizací.
Port 465 je totéž, co port 25, ale SSL - tedy pro komunikaci mezi servery. S autentizací se používá i jako submit, ale to je spíš pozůstatek minulosti. Autentizace na portu 25/465 pak rozliší, zda server bude ochoten dělat relay nebo ne.
Ať tak nebo tak, mail odesílaný z domény x.y musí odesílat server (ne nějaká aplikace), který má přímý i reverzní záznam v DNS, zná klíč pro DKIM, má IP adresu, která je v SPF, spravuje fronty, přijímá zprávy o nedoručení atd.
Pro webovou aplikaci php.ini jen říká, jak udělat submit - tedy kde je server mé vlastní domény a jak mu prokážu, že jsem oprávněný odesílatel, případně která lokální aplikace se o tohle postará za mě.
Aplikace (webová/php) je KLIENT a tazatel se pokouší z ní udělat SERVER. To je nesmysl, fungovat to nemůže.

Re:Odesílá php mail() přímo cílovému SMTP?
« Odpověď #17 kdy: 03. 01. 2022, 10:16:23 »
Ať tak nebo tak, mail odesílaný z domény x.y musí odesílat server (ne nějaká aplikace), který má přímý i reverzní záznam v DNS, zná klíč pro DKIM, má IP adresu, která je v SPF, spravuje fronty, přijímá zprávy o nedoručení atd.
Když něco odesílá e-mail, je to klient – navazuje SMTP spojení k serveru. Server (třeba Postfix) je také aplikace, a jakákoli aplikace může odesílat e-maily přímo cílovým serverům z počítače, který je uvedený v SPF, má správný reverzní záznam. Jenom ta aplikace musí umět e-mail podepsat pomocí DKIM. Teda ona by se o to aplikace mohla pokoušet i bez toho všeho, ale pak by e-mail byl s velmi vysokou pravděpodobností vyhodnocen jako spam. No a pak je samozřejmě nutné vyřešit to, že se e-mail nemusí podařit odeslat na první pokus (tj. nějaká fronta zpráv).

Vedle plnohodnotného klienta, který umí e-maily odesílat přímo cílovým serverům, existuje i „hloupý“ klient, který umí e-mail předat jenom nějakému chytřejšímu serveru (smart relay) a nic jiného neřeší. Takovýhle hloupý klient je třeba v poštovích klientech (Thunderbird, Outlook), je v PHP na Windows (implementace funkce mail()) nebo to existuje jako samostatná aplikace (např. sSmtp). Pro tuhle komunikaci od hloupého SMTP klienta k chytrému se nově používá port 587 (dříve se používal také port 25). Smart relay samozřejmě nemůže rozesíla te-maily pro každého, kdo mu e-mail předá – toho by okamžitě začali zneužívat spameři. Musí nějak poznat „své“ hloupé klienty, kterým důvěřuje, že nebuduo rozesílat spam. Dříve bylo běžné, že smart relay dovoloval posílat e-maily všem počítačům z místní sítě, nyní to obvykle bývá chráněné navíc ještě jménem a heslem – aby to útočník, který napadne nějaký počítač v místní síti a chce rozesílat spam, neměl tak jednoduché.

Pro někoho může být matoucí, že to, co se obvykle nazývá e-mailový server (třeba ten Postfix) obvykle plní úlohu klienta i serveru. Ale je to poměrně jednoduché, ta strana, která e-mail přes SMTP odesílá, je vždy klient; ta, která přes SMTP e-mail přijímá, je vždy server.

Klidně by bylo možné v PHP implementovat plnohodnotného SMTP klienta, ale proč by to někdo dělal?

Re:Odesílá php mail() přímo cílovému SMTP?
« Odpověď #18 kdy: 04. 01. 2022, 07:02:18 »
Když něco odesílá e-mail, je to klient – navazuje SMTP spojení k serveru. Server (třeba Postfix) je také aplikace, a jakákoli aplikace může odesílat e-maily přímo cílovým serverům z počítače, který je uvedený v SPF, má správný reverzní záznam. Jenom ta aplikace musí umět e-mail podepsat pomocí DKIM. Teda ona by se o to aplikace mohla pokoušet i bez toho všeho, ale pak by e-mail byl s velmi vysokou pravděpodobností vyhodnocen jako spam. No a pak je samozřejmě nutné vyřešit to, že se e-mail nemusí podařit odeslat na první pokus (tj. nějaká fronta zpráv).
...
No, chtěl jsem se tomu vyhnout, ale pořád se tady pletou dohromady a zaměňují MUA, MTA a MDA.
mail() v php je funkce pro odeslání MUA (mail user agent). Postfix/sendmail/exchange je MTA (message transfer agent) a někdy současně MDA (message delivery agent - v cílové doméně doručuje do schránek, exchange sám, jinde je to třeba procmail).
Ten, kdo posílá mail do cílové domény, je MTA, běží jako service (aby mohl spravovat fronty, přijímat maily, předávat  atd.).
MUA nemá co dělat s MX záznamy apod., ten jen předá příslušnému MTA mail od uživatele k odeslání (analogie ve fyzickém světě: dáte dopis na poštu). MTA zařídí předání správným směrem k cílovému MTA (analogie: převoz zásilek z Prahy do Tábora), který v cíli dopis předá MDA (analogie: poštovní doručovatel dopis vhodí do domovní schránky), odkud si to adresát prostřednictvím MUA vyzvedne a přečte.

Re:Odesílá php mail() přímo cílovému SMTP?
« Odpověď #19 kdy: 04. 01. 2022, 08:55:05 »
Dá se to i pěkně schematicky znázornit, jak e-mail putuje:

MUA odesílatele → MTA → MDA → poštovní schránka (ze které si jej vyzvedne MUA adresáta)

Případně těch MTA může být několik za sebou:

MUA odesílatele → MTA → MTA → MTA → MDA → poštovní schránka.