Autorizačný kód SMTP. Odosielanie emailov (SMTP vs. mail PHP). Ako posielať e-maily pomocou ASP
Keďže posielanie anonymných správ z virtuálnych hostingových serverov Windows je zakázané, posielanie listov by sa malo uskutočňovať cez SMTP server, na ktorý je možné využiť aj náš poštový systém.
Ako posielať e-maily pomocou PHP?
Použitie akejkoľvek triedy PHP, ktorá podporuje autorizáciu na serveri smtp. Môžete napríklad použiť sadu tried PHPMailer.
Môžete tiež použiť náš príklad, ktorý implementuje odosielanie listov pomocou smtp servera, ktorý vyžaduje autorizáciu. Preto nezabudnite do skriptu pridať príslušné prístupové údaje, napríklad:
// Ak potrebujete zobraziť protokol relácie SMTP, môžete odkomentovať nasledujúci riadok. // $_SERVER["debug"] = true; function MailSmtp ($reciever, $subject, $content, $headers, $debug = 0) ( $smtp_server = "smtp.site"; // Adresa servera SMTP$smtp_port = 25 ; // Port servera SMTP$smtp_user = " [e-mail chránený]" ; // Používateľské meno pre autorizáciu na serveri SMTP$smtp_password = "pAsSwORd" ; // Heslo pre autorizáciu na serveri SMTP$mail_from = " [e-mail chránený]" ; // Schránka, z ktorej je list odoslaný$sock = fsockopen ($smtp_server, $smtp_port, $errno, $errstr, 30); $str = fgets ($sock, 512); if (! $sock ) ( printf ( "Zásuvka nie je vytvorená\n" ); exit(1 ); ) smtp_msg ($sock , "HELO " . $_SERVER [ "NÁZOV_SERVERU" ]); smtp_msg($sock, "AUTH LOGIN"); smtp_msg ($sock, base64_encode ($smtp_user)); smtp_msg ($sock, base64_encode ($smtp_password)); smtp_msg ($sock , "MAIL OD:<" . $mail_from . ">" ); smtp_msg ($sock , "RCPT TO:<" . $reciever . ">" ); smtp_msg ($sock , "DATA" ); $headers = "Predmet: " . $predmet . "\r\n" . $hlavičky ; $data = $hlavičky . "\r\n\r\n" . $content . "\r\n." ; smtp_msg ($sock , $data ); smtp_msg ($sock , "QUIT" ); fclose ($sock ); ) funkcia smtp_msg ($sock , $msg ) (ak ( ! $sock ) ( printf ("Zlomená zásuvka!\n" ); exit(1 ); ) if (isset($_SERVER [ "ladenie" ]) && $_SERVER [ "ladenie" ]) ( printf ( "Odoslať od nás : %s" , nl2br (htmlspecialchars ($msg)); ) fputs ($sock, " $msg \r\n" ); $str = fgets ($sock , 512 ); if (! $sock ) ( printf ( "Socket je dole\n" ); exit(1); ) else ( if (isset($_SERVER [ "ladenie" ]) && $_SERVER [ "ladenie" ]) ( printf ("Prijaté zo servera: %s
" , nl2br (htmlspecialchars ($str )); ) $e = explode (" " , $str ); $code = array_shift ($e); $str = implode ( " ", $e); if ($code > 499 ) ( printf ( "Problémy s konverzáciou SMTP.
Kód %d.
Správa %s
" , $kód , $str ); exit(1); ) ) ? >
Stiahnite si príklad hotového skriptu s funkciou MailSmtp(): smtpauth.php.sample
Na priame nahradenie funkcie mail() môžete použiť funkciu MailSmtp() opísanú vyššie; zvážte príklad najjednoduchšieho formulára v PHP:
// Hlavičky správ, definujú kódovanie správy, polia From, To atď.$headers = "MIME verzia: 1.0\r\n" ; $headers .= "Typ obsahu: text/html; charset=windows-1251\r\n"; $hlavičky .= "Komu: $do \r\n" ; $headers .= „Od: Meno odosielateľaZa účelom tento formulár fungovali bez funkcie mail(), zahrnuli sme súbor smtpauth.php cez require_once a zavolali v ňom popísanú funkciu MailSmtp() s argumentmi podobnými mail(). Zároveň sme zakomentovali samotné volanie mail() v kóde, aby sme sa vyhli chybám pri vykonávaní skriptu.
Ako posielať e-maily pomocou ASP.NET?
Ak používate verziu 2.0, použite triedu MailMessage System.Net.Mail), dobre popísané.
Nižšie sú uvedené príklady jeho použitia pre jazyky C# a VisualBasic:
Príklad pre jazyk C#:
<% @Page Language="c#" %> <% @Import Namespace="System.Net.Mail" %> <% @Import Namespace="System.Net" %> <% MailMessage message = new MailMessage(); // vytvorenie nového písmena message.To.Add(" [e-mail chránený]"); // pridanie adresy príjemcu message.From = new MailAddress("from@ doména.tld", "Meno odosielateľa"); // s uvedením mena a adresy odosielateľa message.Subject = "Predmet správy"; // s uvedením predmetu listu message.BodyEncoding = System.Text.Encoding.UTF8; // určenie kódovania písmen message.IsBodyHtml = false; // určenie formátu písmena (true - HTML, false - nie HTML) message.Body = "Text správy"; // špecifikovanie textu (telo) listu Klient SmtpClient = new SmtpClient("smtp.site",25); // vytvorenie nového pripojenia k serveru "smtp.site" client.DeliveryMethod = SmtpDeliveryMethod.Network; // definuje spôsob odosielania správ client.EnableSsl = false; // zakáže potrebu používať zabezpečené pripojenie k serveru client.UseDefaultCredentials = false; // zakáže používanie predvolených podrobností autorizácie client.Credentials = new NetworkCredential("postmaster@ doména.tld", "***heslo***"); // špecifikovanie potrebných údajov (používateľské meno a heslo) na autorizáciu na serveri SMTP klient.Odoslať(správu); // poslať správu %>Stiahnite si príklad vyplneného formulára preukazujúceho použitie túto metódu: MailForm.aspx.
Príklad jazyka VisualBasic:
<% @Page Language="VB" Debug="true" %> <% @Import Namespace="System.Net.Mail" %> <% @Import Namespace="System.Net" %> <% Dim smtpMssg AS new MailMessage smtpMssg.From = New MailAddress ("admin@doména.tld", "Sender_name") smtpMssg.To.Add (" [e-mail chránený]") “ pridanie adresy príjemcu smtpMssg.Subject = "Predmet e-mailu" „označenie predmetu listu smtpMssg.Body = "Text správy" “ označenie textu (telo) listu smtpMssg.BodyEncoding = System.Text.Encoding.UTF8 “ označenie kódovania písmen smtpMssg.IsBodyHtml = false " označenie formátu písmena (true - HTML, false - nie HTML) Dim SmtpMail as New SmtpClient("smtp.site", 25) " deklarácia nového objektu typu "SmtpClient" SmtpMail.DeliveryMethod = SmtpDeliveryMethod.Network „označenie spôsobu doručenia listu SmtpMail.UseDefaultCredentials = False "štandardne zakázanie používania autorizačných poverení" SmtpMail.EnableSsl = False " zakáže potrebu používať zabezpečené pripojenie k serveru SmtpMail.Credentials = new NetworkCredential("postmaster@ doména.tld", "***heslo***") "uvedenie potrebných údajov (používateľské meno a heslo) na autorizáciu na serveri SMTP SmtpMail.Send(smtpMssg) “ odoslanie správy %>Existuje aj zastaraná (a zastaraná) trieda SmtpMail (používajúca menný priestor System.Web.Mail). Nižšie je uvedený príklad jeho použitia pre jazyk VisualBasic:
<% @Page Language="VB" Debug="true" %> <% @Import Namespace="System.Web" %> <% @Import Namespace="System.Web.Mail" %> <% Dim smtpMssg = new MailMessage " deklarácia nového objektu typu "MailMessage" smtpMssg.From = "Meno_odosielateľaAko posielať e-maily pomocou ASP?
Upozorňujeme, že pri používaní nášho smtp servera je potrebná autorizácia, preto nezabudnite do skriptu pridať príslušné prístupové údaje, napríklad:
<% iConfig = Server.CreateObject("CDO.Configuration") Set iConfig = Server.CreateObject("CDO.Configuration") With iConfig.Fields .Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.сайт" .Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25 .Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2 .Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1 .Item("http://schemas.microsoft.com/cdo/configuration/languagecode") = "ru" .Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = "postmaster@doména.tld" .Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "heslo" .Update End with Set cdoMessage = CreateObject("CDO.Message") S cdoMessage Set .Configuration = iConfig .From = "Test používateľaNiektoré CMS už majú vstavané nástroje na odosielanie korešpondencie alebo zodpovedajúce moduly; pozrime sa na tie najpopulárnejšie.
Wordpress
Pre tento CMS existuje špeciálny modul „WP Mail SMTP“, príklad jeho konfigurácie je popísaný na stránke modulu.
Venujte pozornosť ilustrácii v príklade, v našom poštovom systéme je potrebné použiť port 25 a nevyžaduje sa šifrovanie SSL.
Joomla
V administračnom paneli prejdite do časti „Všeobecné nastavenia“, vyberte kartu „Server“. V poli „Pošta“ musíte vybrať spôsob odoslania ako „Server SMTP“, v poliach „Adresa servera SMTP“ a „Prihlásenie SMTP“ a „Heslo SMTP“ zadajte príslušné podrobnosti o poštovom systéme, napríklad: smtp.site, box@vaša_doména a zodpovedajúce heslo.
Drupal
Tento CMS má aj vlastný modul pre prácu so serverom SMTP, založený na PHPMailer. Tento modul si môžete stiahnuť na jeho stránke na webe CMS Drupal, popis inštalácie modulu je dostupný v archíve spolu s ním.
NetCat
Tento CMS nemá vstavané funkcie pre prácu so serverom SMTP. Ak chcete odosielať poštu pomocou skriptov lokality, môžeme vám ponúknuť používanie nášho riešenia, na pripojenie je potrebné vykonať nasledujúce kroky:
- Stiahnite si archív s potrebnými súbormi z našej webovej stránky ( send_auth_mail.php A mail.inc.php) a rozbaľte ho v počítači;
Upraviť súbor send_auth_mail.php z archívu s uvedením podrobností o pripojení k požadovanému serveru SMTP:
- $mail_smtpServer = "smtp.site"; (adresa servera SMTP)
- $mail_port = "25" ; (pripojovací port)
- $mail_username = "[e-mail chránený]" ; (používateľské meno na autorizáciu na serveri SMTP)
- $mail_password = "heslo"; (heslo pre autorizáciu na SMTP serveri)
- Vytvorte záložnú kópiu súboru domain.tld/www/netcat/admin/mail.inc.php;
- sťahovať súbory send_auth_mail.php A mail.inc.php na virtuálnu stránku v adresári doména.tld/www/netcat/admin/
doména.tld by mal byť nahradený názvom vašej domény.
Navrhované riešenie funguje so všetkými modulmi NetCat, ktoré na odosielanie pošty využívajú štandardné funkcie tohto CMS.
Dlho som hľadal riešenie, ako posielať listy používateľom nie cez funkciu mail() v PHP, ale cez mailové servery SMTP. Na internete nie je veľa rôznorodých informácií a to, čo tam je, nefunguje celkom správne alebo nefunguje vôbec. Preto som dal všetko dokopy a napísal som si vlastný kód, založený na už hotových, ktoré sú prezentované na stránkach.
Prečo posielať cez SMTP a nie mail()
Moja odpoveď je celkom jednoduchá – nejaký čas mi vírusy posielali cez môj server tony listov, čo viedlo k tomu, že moja IP adresa bola zakázaná mnohými mailermi, najmä gmail.com, a v súvislosti s tým mohli užívatelia dostávať listy, takže som musel som hľadať alternatívu a našiel som ju - toto je SMTP
Možno vás bude zaujímať, prečo je môj scenár lepší ako ostatné, ktoré sa povaľujú vonku?! ja odpoviem
- Funguje s Yandex, Rambler, Mail (gmail nemohol vyhrať)
- Vymazať kód. Ak ho chcete nakonfigurovať, stačí zmeniť niekoľko riadkov
- Posiela e-maily vo formáte HTML
Tu sú výhody môjho scenára, ktorý som nikde na internete nenašiel, ale z každého som si zobral všetko potrebné. Pozrime sa teda na kód.
Funkcia smtpmail($mail_to, $subject, $message, $service="yandex") ( $config["smtp_charset"] = "windows-1251"; //kódovanie správy. (alebo UTF-8 atď.) $config [ "smtp_from"] = "mashintop.ru"; //Vaše meno - alebo názov vašej stránky. Zobrazí sa pri prečítaní v poli "Od" $config["smtp_debug"] = false; //Ak chcete na zobrazenie chybových hlásení zadajte true namiesto false $config["smtp_port"] = "25"; // Pracovný port. Ak si nie ste istý, nemeňte. if($service=="yandex") ( $config[ "smtp_searcher"] = "yandex. ru"; $config["smtp_email"] = " [e-mail chránený]"; $config["smtp_username"] = "mashintop"; //Zmena názvu vašej poštovej schránky. $config["smtp_host"] = "smtp.yandex.ru"; //server na odosielanie pošty $config[" smtp_password "] = "moi_parol"; //Zmeňte heslo ) elseif($service=="rambler") ( $config["smtp_searcher"] = "rambler.ru"; $config["smtp_email"] = " [e-mail chránený]"; $config["smtp_username"] = "mashintop"; //Zmena názvu vašej poštovej schránky. $config["smtp_host"] = "smtp.rambler.ru"; //server na odosielanie pošty $config[" smtp_password "] = "moi_parol"; //Zmeňte heslo ) elseif($service=="mail") ( $config["smtp_searcher"] = "mail.ru"; $config["smtp_email"] = " [e-mail chránený]"; $config["smtp_username"] = "mashintop"; //Zmena názvu vašej poštovej schránky. $config["smtp_host"] = "smtp.mail.ru"; //server na odosielanie pošty $config[" smtp_password "] = "moi_parol"; //Zmeniť heslo ) elseif($service=="gmail") ( $config["smtp_searcher"] = "gmail.com"; $config["smtp_email"] = " [e-mail chránený]"; $config["smtp_username"] = "alexeybertram"; //Zmena názvu vašej poštovej schránky. $config["smtp_host"] = "smtp.gmail.com"; //server na odosielanie pošty $config[" smtp_password "] = "moi_parol"; //Zmena hesla ) $header="Dátum: ".date("D, j M Y G:i:s")." +0700rn"; $header.="Od: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode("".$config[" smtp_from"]."")))"?=<".$config["smtp_email"].">rn"; $header.="X-Mailer: The Bat! (v3.99.3) Professionalrn"; $header.="Odpoveď: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode(" ".$config["smtp_from"]."")))"?=<".$config["smtp_email"].">rn"; $header.="Priorita X: 3 (normálna)rn"; $header.="ID správy:<172562218.".date("YmjHis")."@".$config["smtp_searcher"].">rn"; $header.="Komu: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode("")))."? =<$mail_to>rn"; $header.="Predmet: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode("".$subject."" )))."?=rn"; $header.="Verzia MIME: 1.0rn"; $header.="Typ obsahu: text/html; charset=windows-1251rn"; $header.="Content-Transfer-Encoding: 8bitrn"; $smtp_conn = fsockopen("".$config["smtp_host"]."", $config["smtp_port"],$errno , $errstr, 10); if(!$smtp_conn) (tlač "pripojenie zo serverov zlyhalo"; fclose($smtp_conn); exit;) $data = get_data($smtp_conn); fputs($smtp_conn,"EHLO ". $ config["smtp_searcher"]."rn"); $code = substr(get_data($smtp_conn),0,3000); if($code != 250) (tlač "EHLO hello error"; fclose($smtp_conn) ; exit; ) fputs($smtp_conn,"AUTH LOGINrn"); $code = substr(get_data($smtp_conn),0,3000); if($code != 334) (tlač „server nepovolil spustenie autorizácie“; fclose ($ smtp_conn); exit;) fputs($smtp_conn,base64_encode("".$config["smtp_username"]."")."rn"); $code = substr(get_data($smtp_conn),0,3000) ; ak ($code != 334) (tlač "chyba pri prístupe k tomuto používateľovi"; fclose($smtp_conn); exit;) fputs($smtp_conn,base64_encode("".$config["smtp_password"]."). "rn" );$code = substr(get_data($smtp_conn),0,3000); if($code != 235) (vytlačte "nesprávne heslo"); fclose($smtp_conn); exit;) fputs($smtp_conn,"MAIL FROM:".$config["smtp_email"]."rn"); $code = substr(get_data($smtp_conn),0,3000); if($code != 250) (tlač "server odmietol príkaz MAIL FROM"; fclose($smtp_conn); exit;) fputs($smtp_conn,"RCPT TO:".$mail_to."rn"); $code = substr(get_data($smtp_conn),0,3000); if($code != 250 AND $code != 251) (tlač "Server neprijal príkaz RCPT TO"; fclose($smtp_conn); exit;) fputs($smtp_conn,"DATArn"); $code = substr(get_data($smtp_conn),0,3000); if($code != 354) (tlač "server neprijal DATA"; fclose($smtp_conn); exit;) fputs($smtp_conn,$header."rn".$message."rn.rn"); $code = substr(get_data($smtp_conn),0,3000); if($code != 250) (tlač "chyba pri odosielaní listu"; fclose($smtp_conn); exit;) fputs($smtp_conn,"QUITrn"); fclose($smtp_conn); ) funkcia get_data($smtp_conn) ( $data=""; while($str = fgets($smtp_conn,515)) ( $data .= $str; if(substr($str,3,1) == " " ) ( break; ) ) return $data; ) $text_email = "
Práve ste pridali inzerát na webovú stránku mashintop.ru. Pozrieť si ho môžete tuVáš kľúč: ".$key."
Pomocou tohto kľúča môžete spravovať svoju reklamu.
"; $text_email .= " "; smtpmail(" [e-mail chránený]", "Kľúč k reklame na mashintop.ru", $text_email, "yandex"); //použite Yandex smtpmail(" [e-mail chránený]", "Kľúč k reklame na mashintop.ru", $text_email, "mail"); //použite e-mail smtpmail(" [e-mail chránený]", "Kľúč k reklame na mashintop.ru", $text_email, "rambler"); //použite rambler smtpmail(" [e-mail chránený]", "Kľúč k reklame na mashintop.ru", $text_email, "gmail"); // ale gmail nefunguje :(
To je všetko, hotový skript je vo vašich rukách, stačí ho skopírovať, zmeniť hodnoty poľa $config a všetko bude fungovať.
Teraz sa pozrime na niektoré prvky, na ktoré by som sa chcel zamerať.
Napríklad chyba, ktorú dostaneme, keď sa pokúšame odoslať cez SMTP do Google. Na začiatku vidíme tento chybový text:
Aby sme videli niečo konkrétnejšie, poďme trochu upraviť kód
Fputs($smtp_conn,"AUTH LOGINrn"); $code = substr(get_data($smtp_conn),0,3000); echo $code; if($code != 334) (tlač "server nepovolil spustenie autorizácie"; fclose($smtp_conn); exit;)
A nakoniec dostaneme veľmi špecifickú chybu
530 5.7.0 Najprv musíte vydať príkaz STARTTLS. x4sm16408296lbn.2 – gsmtp
Neviem, čo to presne znamená, ale verím, že to má niečo spoločné s bezpečným, nezabezpečeným pripojením. Zatiaľ neviem, ako sa toho zbaviť, takže gmail zostáva momentálne neporazený.
2019-08-05
Dobrý deň, milý návštevník!
Odpustite mi, prosím, meškanie s aktualizáciou blogu. Ale na to existuje úplne pochopiteľné vysvetlenie. Predsa len bolo leto, dačo, hostia, les, voda a mnoho iného, čo mi nedovolilo popasovať sa s tvorbou webu. Ale teraz som sa trochu uvoľnil, hostia odišli a myslím, že teraz tomu určite budem môcť venovať náležitú pozornosť.
Takže potom, čo sme v minulom článku pripojili poštu našej domény k jednej z poštových služieb, teraz sa pozrime, ako môžete posielať e-maily z lokality. Navyše tak, aby naše listy nekončili v SPAM-e, ale boli spoľahlivo, s vysokou mierou pravdepodobnosti doručené našim adresátom.
Vo všeobecnosti je v PHP zabudovaná funkcia mail() na odosielanie listov. Treba však poznamenať, že napriek jednoduchosti tejto metódy (v tomto prípade na odosielanie listov stačí zadať iba jeden riadok kódu s určitými parametrami) má použitie tejto možnosti významnú nevýhodu spojenú s problémom SPAM .
Faktom je, že anti-SPAM filtre poštových serverov na strane príjemcu skutočne neuprednostňujú listy odoslané prostredníctvom funkcie mail(). A vo väčšine prípadov sú takéto správy filtrované alebo dokonca vymazané skôr, ako sa dostanú k adresátovi.
A aby sa takéto prípady čo najviac eliminovali, zvyčajne sa používa iná možnosť, pri ktorej sa listy posielajú tak, ako keby to robila poštová služba tretej strany.
Táto metóda sa nazýva odosielanie pošty cez SMTP s autorizáciou. Na čo sa dnes pozrieme na príklade odoslania formulára spätnej väzby. Navyše na to použijeme pomerne známu a populárnu knižnicu PHPMailer, ktorá vám umožňuje pomerne jednoducho organizovať odosielanie listov cez SMTP.
- Ako budeme posielať listy so spätnou väzbou
- Vytvorenie formulára spätnej väzby
- Inštalácia knižnice PHPMailer
- Vytvárame skript na odosielanie pošty cez SMTP
- Kontrola odosielania e-mailov
- Zdrojové súbory lokality
Ako budeme posielať listy so spätnou väzbou
Predtým, ako začneme s praktickou prácou s odosielaním listov so spätnou väzbou, najprv sa rozhodnime, ako to urobíme.
Formulár spätnej väzby je navrhnutý tak, aby umožnil používateľovi komunikovať so správcom stránky a odovzdať mu jeho správu. Tento formulár sa zvyčajne skladá z niekoľkých polí a tlačidla „Odoslať“.
V zásade na odoslanie e-mailu stačí použiť iba niekoľko polí, ktoré poskytujú dostatočné informácie o používateľovi a obsahu správy, ako napríklad:
- "Meno" - zadajte meno odosielateľa správy;
- "E-mail" - pre e-mailovú adresu odosielateľa;
- "Predmet správy";
- "Text správy".
Aj keď môžete pridať ďalšie. Napríklad telefónne číslo, ak je to naozaj potrebné.
V našom prípade budú takéto listy zasielané na adresu správcu stránky zo skutočnej poštovej schránky s autorizáciou na poštovej službe, ku ktorej je pripojená naša doména.
Keďže v predchádzajúcom článku sme sa zamerali na kontrolu pripojenia doménovej pošty k službe Yandex.Mail, budeme posielať poštu pre túto možnosť. Aj keď to nie je dôležité. Nižšie uvidíte tie možnosti, ktoré vám po zmene umožnia odosielať e-maily cez poštový server Mail.ru.
Ako skutočnú schránku, z ktorej sa budú posielať listy, použijeme účet novovytvoreného doménového poštového užívateľa, povedzme s adresou [e-mail chránený]. A tieto listy budeme posielať do schránky správcu [e-mail chránený], ktorý sme predtým vytvorili v predchádzajúcom článku.
Odosielateľom listu z formulára spätnej väzby bude teda poštová schránka [e-mail chránený]., a príjemca - [e-mail chránený]. V tomto prípade budú všetky informácie o používateľovi, ktorý odoslal správu s jej obsahom, prenesené v tele odoslaného listu.
Vytvorenie formulára spätnej väzby
Potom, čo sme sa rozhodli pre postup odosielania listov, teraz vytvoríme formulár spätnej väzby, pomocou ktorého to urobíme.
Nižšie je uvedený HTML kód tohto formulára, ktorý umiestnime na stránku "Kontakty" (súbor kontakty.php v adresári článkov).