Cod de autorizare smtp. Trimiterea de e-mailuri (SMTP vs. mail PHP). Cum se trimite e-mailuri folosind ASP
Deoarece trimiterea de mesaje anonime de pe serverele virtuale de găzduire Windows este interzisă, trimiterea de scrisori ar trebui să se facă prin intermediul unui server SMTP, pentru care este posibil să folosim și sistemul nostru de e-mail.
Cum se trimit e-mailuri folosind PHP?
Folosind orice clasă PHP care acceptă autorizarea pe serverul smtp. De exemplu, puteți utiliza setul de clase PHPMailer.
De asemenea, puteți folosi exemplul nostru, care implementează trimiterea de scrisori folosind un server smtp, care necesită autorizare. Prin urmare, nu uitați să adăugați detaliile de acces adecvate la script, de exemplu:
// Dacă trebuie să afișați jurnalul de sesiune SMTP, puteți decomenta următoarea linie. // $_SERVER["depanare"] = adevărat; function MailSmtp ($reciever, $subject, $content, $headers, $debug = 0) ( $smtp_server = "smtp.site"; // Adresa serverului SMTP$smtp_port = 25 ; // Port server SMTP$smtp_user = " [email protected]" ; // Nume de utilizator pentru autorizare pe serverul SMTP$smtp_password = "parolă" ; // Parola pentru autorizare pe serverul SMTP$mail_from = " [email protected]" ; // Cutia poștală din care este trimisă scrisoarea$sock = fsockopen ($smtp_server, $smtp_port, $errno, $errstr, 30); $str = fgets ($sock, 512); if (! $sock ) ( printf ("Socket nu este creat\n" ); exit(1 ); ) smtp_msg ($sock , "HELO " . $_SERVER [ "SERVER_NAME" ]); smtp_msg($sock, "AUTH LOGIN"); smtp_msg ($sock, base64_encode ($smtp_user)); smtp_msg ($sock, base64_encode ($smtp_parola)); smtp_msg ($sock , „MAIL FROM:<" . $mail_from . ">" ); smtp_msg ($sock , "RCPT TO:<" . $reciever . ">" ); smtp_msg ($sock , "DATE" ); $headers = "Subiect: " . $subiect . "\r\n" . $headers ; $date = $headers . "\r\n\r\n" . $conținut . „\r\n ; _SERVER [ „depanare” ]) && $_SERVER [ „depanare” ]) ( printf ( „Trimite de la noi: %s" , nl2br (htmlspecialchars ($msg )); ) fputs ($sock , " $msg \r\n" ); $str = fgets ($sock , 512 ); if (! $sock ) ( printf ( "Socket este jos\n" ); ieșire(1); ) else ( if (isset($_SERVER [ "depanare" ]) && $_SERVER [ "depanare" ]) ( printf ("Ați primit de la server: %s
" , nl2br (htmlspecialchars ($str )); ) $e = explode (" " , $str ); $cod = array_shift ($e ); $str = implod ( " " , $e ); dacă ($cod > 499 ) ( printf ( „Probleme cu conversația SMTP.
Codul %d.
Mesaj %s
" , $cod , $str ); ieșire(1); ) ) ) ?>
Descărcați un exemplu de script gata făcut cu funcția MailSmtp(): smtpauth.php.sample
Puteți utiliza funcția MailSmtp() descrisă mai sus pentru a înlocui direct funcția mail() să luați în considerare un exemplu de cea mai simplă formă în PHP:
// Anteturile mesajelor, ele definesc codificarea mesajului, câmpurile De la, Către etc.$headers = "Versiune MIME: 1.0\r\n" ; $headers .= „Tip de conținut: text/html; set de caractere=windows-1251\r\n”; $headers .= "Către: $la \r\n" ; $headers .= „De la: numele expeditoruluiPentru a acest formular a funcționat fără funcția mail(), am inclus fișierul smtpauth.php prin require_once și am numit funcția MailSmtp() descrisă în acesta, cu argumente similare cu mail(). În același timp, am comentat apelul mail() în cod pentru a evita erorile la executarea scriptului.
Cum se trimit e-mailuri folosind ASP.NET?
Dacă utilizați versiunea 2.0, atunci utilizați clasa MailMessage System.Net.Mail), bine descris.
Mai jos sunt exemple de utilizare a acestuia pentru limbajele C# și VisualBasic:
Exemplu pentru limbajul C#:
<% @Page Language="c#" %> <% @Import Namespace="System.Net.Mail" %> <% @Import Namespace="System.Net" %> <% MailMessage message = new MailMessage(); // crearea unei noi litere mesaj.Pentru.Adăugare(" [email protected]"); // adăugarea adresei destinatarului mesaj.De la = new MailAddress("de la@ domeniu.tld", "Numele expeditorului"); // precizând numele și adresa expeditorului message.Subject = "Subiectul mesajului"; // precizând subiectul scrisorii message.BodyEncoding = System.Text.Encoding.UTF8; // specificând codificarea literelor mesaj.IsBodyHtml = fals; // specificând formatul literei (adevărat - HTML, fals - nu HTML) message.Body = „Textul mesajului”; // precizând textul (corpul) scrisorii Client SmtpClient = SmtpClient nou("smtp.site",25); // creează o nouă conexiune la serverul „smtp.site” client.DeliveryMethod = SmtpDeliveryMethod.Network; // definește metoda de trimitere a mesajelor client.EnableSsl = false; // dezactivează necesitatea utilizării unei conexiuni securizate la server client.UseDefaultCredentials = false; // dezactivează utilizarea detaliilor de autorizare implicite client.Credentials = new NetworkCredential("postmaster@ domeniu.tld", "***parola***"); // specificarea detaliilor necesare (nume utilizator și parola) pentru autorizarea pe serverul SMTP client.Trimite(mesaj); // Trimite un mesaj %>Descărcați un exemplu de formular completat care demonstrează utilizarea aceasta metoda: MailForm.aspx.
Exemplu pentru limbajul 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@domeniu.tld", "Nume_expeditor") smtpMssg.To.Add (" [email protected]") " adăugând adresa destinatarului smtpMssg.Subject = „Subiectul e-mailului” „indicarea subiectului scrisorii smtpMssg.Body = „Textul mesajului” " indicarea textului (corpului) scrisorii smtpMssg.BodyEncoding = System.Text.Encoding.UTF8 " indicație a codificării literei smtpMssg.IsBodyHtml = fals " indicarea formatului literei (adevărat - HTML, fals - nu HTML) Dim SmtpMail ca SmtpClient nou ("smtp.site", 25) " declararea unui nou obiect de tip "SmtpClient" SmtpMail.DeliveryMethod = SmtpDeliveryMethod.Network „indicarea modului de livrare a scrisorilor SmtpMail.UseDefaultCredentials = Fals „dezactivarea utilizării acreditărilor de autorizare în mod implicit” SmtpMail.EnableSsl = Fals " dezactivează necesitatea utilizării unei conexiuni securizate la server SmtpMail.Credentials = new NetworkCredential("postmaster@ domeniu.tld", "***parola***") „indicând detaliile necesare (nume de utilizator și parolă) pentru autorizarea pe serverul SMTP SmtpMail.Send(smtpMssg) " trimiterea unui mesaj %>Există, de asemenea, o clasă SmtpMail depreciată (și depreciată) (folosind spațiul de nume System.Web.Mail). Mai jos este un exemplu de utilizare a acestuia pentru limbajul VisualBasic:
<% @Page Language="VB" Debug="true" %> <% @Import Namespace="System.Web" %> <% @Import Namespace="System.Web.Mail" %> <% Dim smtpMssg = new MailMessage " declararea unui nou obiect de tip "MailMessage" smtpMssg.From = „Nume_expedientCum se trimit e-mailuri folosind ASP?
Vă rugăm să rețineți că atunci când utilizați serverul nostru smtp, este necesară autorizarea, așa că nu uitați să adăugați detaliile de acces adecvate la script, de exemplu:
<% 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@domeniu.tld" .Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "parolă" .Actualizare Încheiere cu Set cdoMessage = CreateObject("CDO.Message") Cu set cdoMessage .Configuration = iConfig .From = „Testează utilizatorulUnele CMS au deja instrumente încorporate pentru trimiterea corespondenței sau modulele corespunzătoare, să ne uităm la cele mai populare.
Wordpress
Pentru acest CMS există un modul special „WP Mail SMTP”, un exemplu de configurare a acestuia este descris pe pagina modulului.
Fiți atenți la ilustrația din exemplu în sistemul nostru de e-mail, este necesar să folosiți portul 25 și nu este necesară criptarea SSL.
Joomla
În panoul de administrare, accesați secțiunea „Setări generale”, selectați fila „Server”. În câmpul „Poștă”, trebuie să selectați metoda de trimitere ca „Server SMTP”, în câmpurile „Adresă server SMTP” și „Autentificare SMTP” și „Parola SMTP” specificați detaliile adecvate ale sistemului de e-mail, de exemplu: smtp.site, caseta@domeniul_dvs si corespunzatoare parola.
Drupal
Acest CMS are, de asemenea, propriul modul pentru lucrul cu un server SMTP, bazat pe PHPMailer. Puteți descărca acest modul de pe pagina sa de pe site-ul CMS Drupal, o descriere a instalării modulului este disponibilă în arhivă.
NetCat
Acest CMS nu are funcții încorporate pentru lucrul cu un server SMTP. Pentru a trimite e-mail folosind scripturi de site, vă putem oferi să utilizați soluția noastră pentru a o conecta, trebuie să efectuați următorii pași:
- Descărcați o arhivă cu fișierele necesare de pe site-ul nostru ( send_auth_mail.phpȘi mail.inc.php) și despachetați-l pe computer;
Editați fișierul send_auth_mail.php din arhivă, indicând în ea detaliile de conectare la serverul SMTP dorit:
- $mail_smtpServer = "smtp.site"; (adresa serverului SMTP)
- $mail_port = "25" ; (port de conectare)
- $mail_username = "[email protected]" ; (nume de utilizator pentru autorizare pe serverul SMTP)
- $mail_parola = "Parola"; (parola pentru autorizare pe serverul SMTP)
- Creați o copie de rezervă a fișierului domain.tld/www/netcat/admin/mail.inc.php;
- descărcați fișiere send_auth_mail.phpȘi mail.inc.php la site-ul virtual din director domain.tld/www/netcat/admin/
domeniu.tld ar trebui să fie înlocuit cu numele dvs. de domeniu.
Soluția propusă funcționează cu toate modulele NetCat care utilizează funcțiile standard ale acestui CMS pentru a trimite e-mail.
De multă vreme am căutat o soluție pentru a trimite scrisori către utilizatori nu prin funcția mail() din PHP, ci prin servere de mail SMTP. Nu există o mulțime de informații variate pe Internet și ceea ce este acolo nu funcționează destul de bine sau nu funcționează deloc. Prin urmare, am pus totul cap la cap și am scris propriul cod, pe baza celor gata făcute care sunt prezentate pe site-uri.
De ce trimiteți prin SMTP și nu prin e-mail()
Răspunsul meu este destul de simplu - de ceva timp, virușii au trimis tone de scrisori prin serverul meu, ceea ce a dus la interzicerea adresei mele IP de mulți maileri, în special gmail.com, iar în legătură cu aceasta, utilizatorii puteau primi scrisori, așa că am a trebuit să caut o alternativă și am găsit-o - acesta este SMTP
S-ar putea să fiți interesat de ce scenariul meu este mai bun decât alții care zac în aer liber?! voi raspunde
- Funcționează cu Yandex, Rambler, Mail (gmail nu a putut câștiga)
- Șterge codul. Pentru a-l configura, schimbați doar câteva rânduri
- Trimite e-mailuri în format HTML
Iată care sunt avantajele scriptului meu, pe care nu l-am găsit nicăieri pe internet, dar de la fiecare am luat tot ce aveam nevoie. Deci, să ne uităm la cod.
Funcția smtpmail($mail_to, $subject, $message, $service="yandex") ( $config["smtp_charset"] = "windows-1251"; //codarea mesajului. (sau UTF-8, etc.) $config [ "smtp_from"] = "mashintop.ru" //Numele dvs. - sau numele site-ului dvs. va fi afișat în câmpul "De la" când citiți $config["smtp_debug"] = false; pentru a vedea mesajele de eroare, specificați true în loc de false $config["smtp_port"] = "25" // Nu schimbați portul de lucru dacă nu sunteți sigur"; $config["smtp_email"] = ". [email protected]"; $config["smtp_username"] = "mashintop"; //Schimbați la numele căsuței dvs. poștale. $config["smtp_host"] = "smtp.yandex.ru"; //server pentru trimiterea e-mailului $config[" smtp_password "] = "moi_parol"; //Schimbați parola ) elseif($service=="rambler") ( $config["smtp_searcher"] = "rambler.ru"; $config["smtp_email"] = " [email protected]"; $config["smtp_username"] = "mashintop"; //Schimbați la numele căsuței dvs. poștale. $config["smtp_host"] = "smtp.rambler.ru"; //server pentru trimiterea e-mailului $config[" smtp_password "] = "moi_parol"; //Schimbați parola ) elseif($service=="mail") ( $config["smtp_searcher"] = "mail.ru"; $config["smtp_email"] = " [email protected]"; $config["smtp_username"] = "mashintop"; //Schimbați la numele căsuței dvs. poștale. $config["smtp_host"] = "smtp.mail.ru"; //server pentru trimiterea e-mailului $config[" smtp_password "] = "moi_parol"; //Schimbați parola ) elseif($service=="gmail") ( $config["smtp_searcher"] = "gmail.com"; $config["smtp_email"] = " [email protected]"; $config["smtp_username"] = "alexeybertram"; //Schimbați numele cutiei poștale. $config["smtp_host"] = "smtp.gmail.com"; //server pentru trimiterea e-mailului $config[" smtp_password "] = "moi_parol"; //Modifică parola ) $header="Data: ".date("D, j M Y G:i:s")." +0700rn"; $header.="De la: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode("".$config[" smtp_from"]."")))."?=<".$config["smtp_email"].">rn"; $header.="X-Mailer: Liliacul! (v3.99.3) Professionalrn"; $header.="Răspuns la: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode(") ".$config["smtp_from"]."")))."?=<".$config["smtp_email"].">rn"; $header.="Prioritate X: 3 (Normal)rn"; $header.="ID-Mesaj:<172562218.".date("YmjHis")."@".$config["smtp_searcher"].">rn"; $header.="Către: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode("")))."? =<$mail_to>rn"; $header.="Subiect: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode("".$subiect."" )))."?=rn"; $header.="Versiune MIME: 1.0rn"; charset=windows-1251rn"; $header.="Codare de transfer de conținut: 8bitrn"; $smtp_conn = fsockopen("".$config["smtp_host"]."", $config["smtp_port"], $errno , $errstr, 10); if(!$smtp_conn) (printează „conexiunea de la servere a eșuat”; fclose($smtp_conn); exit;) $data = get_data($smtp_conn, „EHLO”; config["smtp_searcher"]."rn"); $code = substr(get_data($smtp_conn),0,3000; if($code != 250) (print "EHLO greeting error"; fclose($smtp_conn)); exit;) fputs($smtp_conn,"AUTH LOGINrn"); $code = substr(get_data($smtp_conn),0,3000 if($code != 334) (printează "serverul nu a permis autorizarea"; fclose ($smtp_conn); exit;) fputs($smtp_conn,base64_encode("".$config["smtp_username"]."")."rn"); ); if($code != 334) (printează „eroare la accesarea acestui utilizator”; fclose($smtp_conn); exit;) fputs($smtp_conn,base64_encode("".$config["smtp_conn"].""). "rn"); $code = substr(get_data($smtp_conn),0,3000 if($code != 235) (printează "parolă greșită"); fclose($smtp_conn); exit;) fputs($smtp_conn,"MAIL FROM:".$config["smtp_email"]."rn"); $cod = substr(get_data($smtp_conn),0.3000); if($code != 250) (printează „serverul a refuzat comanda MAIL FROM”; fclose($smtp_conn); exit;) fputs($smtp_conn,"RCPT TO:".$mail_to."rn"); $cod = substr(get_data($smtp_conn),0.3000); if($code != 250 AND $code != 251) (printează „Serverul nu a acceptat comanda RCPT TO”; fclose($smtp_conn); exit;) fputs($smtp_conn,"DATArn"); $cod = substr(get_data($smtp_conn),0.3000); if($code != 354) (printează „serverul nu a acceptat DATE”; fclose($smtp_conn); exit;) fputs($smtp_conn,$header."rn".$message."rn.rn"); $cod = substr(get_data($smtp_conn),0.3000); if($cod != 250) (printează „eroare la trimiterea scrisorii”; fclose($smtp_conn); exit;) fputs($smtp_conn,”QUITrn”); fclose($smtp_conn); ) funcția get_data($smtp_conn) ( $date=""; while($str = fgets($smtp_conn,515)) ( $date .= $str; if(substr($str,3,1) == " " ) ( break; ) ) return $date ) $text_email = "
Tocmai ați adăugat un anunț pe site-ul mashintop.ru. O puteți vizualiza aiciCheia dvs.: ".$key."
Folosind această cheie vă puteți gestiona anunțul.
"; $text_email .= " "; smtpmail(" [email protected]", "Cheia anunțului pe mashintop.ru", $text_email, "yandex"); //utilizați Yandex smtpmail(" [email protected]", "Cheia anunțului pe mashintop.ru", $text_email, "mail"); //utilizați e-mailul smtpmail(" [email protected]", "Cheia anunțului pe mashintop.ru", $text_email, "rambler"); //utilizați rambler smtpmail(" [email protected]", "Cheia reclamei pe mashintop.ru", $text_email, "gmail"); // dar Gmail nu funcționează :(
Asta e tot, scriptul terminat este în mâinile tale, doar copiați-l, schimbați valorile matricei $config și totul va funcționa bine.
Acum să ne uităm la câteva elemente pe care aș dori să mă concentrez.
De exemplu, eroarea pe care o primim atunci când încercăm să trimitem prin SMTP către Google. Inițial vedem acest text de eroare:
Pentru a vedea ceva mai specific, haideți să modificăm puțin codul
Fputs($smtp_conn,"AUTH LOGINrn"); $cod = substr(get_data($smtp_conn),0.3000); echo $cod; if($code != 334) (printează „serverul nu a permis autorizarea să înceapă”; fclose($smtp_conn); ieșire;)
Și până la urmă obținem o eroare foarte specifică
530 5.7.0 Mai întâi trebuie să emită o comandă STARTTLS. x4sm16408296lbn.2 - gsmtp
Nu știu ce înseamnă exact, dar cred că are ceva de-a face cu o conexiune sigură, nesecurizată. Încă nu știu cum să scap de el, așa că Gmail rămâne neînvins în acest moment.
2019-08-05
Bună, dragă vizitatoare!
Vă rog să mă iertați pentru întârzierea actualizării blogului. Dar există o explicație complet de înțeles pentru asta. La urma urmei, a fost vara, dacha, oaspeți, pădure, apă și multe altele, ceea ce nu mi-a permis să abordez problemele creării unui site web. Dar acum m-am eliberat puțin, oaspeții au plecat și cred că acum voi putea să acord cu siguranță atenția cuvenită acestui lucru.
Așadar, după ce în ultimul articol am conectat mail-ul domeniului nostru la unul dintre serviciile de mail, acum să vedem cum poți trimite email de pe site. Mai mult, în așa fel încât scrisorile noastre să nu ajungă în SPAM, ci să fie livrate în mod fiabil, cu un grad ridicat de probabilitate, destinatarilor noștri.
În general, există o funcție încorporată mail() pentru trimiterea de scrisori în PHP. Dar trebuie remarcat faptul că, în ciuda simplității acestei metode (în acest caz, pentru a trimite scrisori este suficient să specificați o singură linie de cod cu anumiți parametri), utilizarea acestei opțiuni are un dezavantaj semnificativ asociat cu problema SPAM-ului .
Cert este că filtrele anti-SPAM ale serverelor de e-mail din partea destinatarului nu prea favorizează scrisorile trimise prin funcția mail(). Și în cele mai multe cazuri, astfel de mesaje sunt filtrate sau chiar șterse înainte de a ajunge la destinatar.
Și pentru a elimina cât mai mult posibil astfel de cazuri, se folosește de obicei o altă opțiune, în care scrisorile sunt trimise ca și cum ar fi făcut de un serviciu de poștă terță parte.
Această metodă se numește trimiterea de e-mailuri prin SMTP cu autorizare. Pe care îl vom analiza astăzi folosind exemplul trimiterii unui formular de feedback. Mai mult, pentru aceasta vom folosi biblioteca PHPMailer destul de cunoscută și populară, care vă permite să organizați pur și simplu trimiterea de scrisori prin SMTP.
- Cum vom trimite scrisori de feedback
- Crearea unui formular de feedback
- Instalarea bibliotecii PHPMailer
- Creăm un script pentru trimiterea e-mailurilor prin SMTP
- Se verifică trimiterea e-mailului
- Fișierele sursă ale site-ului
Cum vom trimite scrisori de feedback
Înainte de a începe munca practică de trimitere a scrisorilor de feedback, să decidem mai întâi cum o vom face.
Formularul de feedback este conceput pentru a permite utilizatorului să comunice cu administratorul site-ului pentru a-și transmite mesajul. De obicei, acest formular constă din mai multe câmpuri și un buton „Trimite”.
În principiu, pentru a trimite un e-mail este suficient să folosiți doar câteva câmpuri care oferă suficiente informații despre utilizator și conținutul mesajului, cum ar fi:
- „Nume” - pentru a introduce numele expeditorului mesajului;
- „E-mail” - pentru adresa de e-mail a expeditorului;
- "Subiectul mesajului";
- "Mesaj text".
Deși puteți adăuga altele. De exemplu, un număr de telefon, dacă acest lucru este cu adevărat necesar.
În cazul nostru, astfel de scrisori vor fi trimise la adresa administratorului site-ului dintr-o cutie poștală reală cu autorizare pe serviciul de e-mail la care este conectat domeniul nostru.
Deoarece în articolul anterior ne-am concentrat pe verificarea conexiunii e-mail-ului de domeniu la serviciul Yandex.Mail, vom trimite e-mail pentru această opțiune. Deși acest lucru nu este important. Mai jos veți vedea acele opțiuni care, atunci când sunt modificate, vă vor permite să trimiteți e-mail prin serverul de mail Mail.ru.
Ca o adevărată cutie poștală din care vor fi trimise scrisorile, vom folosi contul unui utilizator de e-mail de domeniu nou creat, să zicem cu adresa [email protected]. Și vom trimite aceste scrisori la căsuța poștală a administratorului [email protected], pe care l-am creat anterior în articolul anterior.
Astfel, expeditorul scrisorii din formularul de feedback va fi cutia poștală [email protected]., iar destinatarul - [email protected]. În acest caz, toate informațiile despre utilizatorul care a trimis mesajul cu conținutul acestuia vor fi transmise în corpul scrisorii trimise.
Crearea unui formular de feedback
După ce ne-am hotărât asupra procedurii de trimitere a scrisorilor, acum vom crea un formular de feedback cu care vom face acest lucru.
Mai jos este codul HTML pentru acest formular, pe care îl vom plasa pe pagina „Contacte” (fișier kontakty.php în directorul articole).