În PHP este destul de popular să folosești scripturi care automatizează procesul de trimitere a scrisorilor. În acest articol ne vom uita la un script simplu care trimite scrisori către destinatari prin SMTP( Protocol simplu de transfer de e-mail ). Ar fi prea ușor să ne limităm doar la această funcționalitate, scriptul acceptă și atașamente, adică poți atașa un fișier pdf, txt sau doc în scrisoarea ta.
Configurarea scriptului este destul de simplă; tot ce aveți nevoie este login-ul și parola expeditorului pentru e-mailul din care vor fi trimise scrisorile.
Scriptul funcționează cu clasa km_smtp_class.php, lucrul bun despre clasă este că acceptă diverse protocoale SSL și TLS care oferă transfer de date securizat.
Iată scenariul în sine:
.11.11
*/
// Подключаем SMTP класс для работы с почтой
include_once("km_smtp_class.php");
// Конфигурационный массив
$SenderConfig = array("SMTP_server" =>"smtp.mail.ru", "SMTP_port" => "25", "SMTP_email" => " [email protected]", "SMTP_pass" => "1111111", "SMTP_type" => "null"); // E-mailul destinatarului $Receiver = " [email protected]"; // Subiectul mesajului $Subject = "Trimiterea unui e-mail din PHP"; // Textul mesajului (în HTML) $Text = "Bună ziua!
Mesaj trimis din script Mowshon Website: http://site"; // Atașament în scrisoare - adresa fișierului $Attachment = ""; /* $mail = KM_Mailer nou (server, port, utilizator, parolă, tip); */ /* Tipul poate fi: null, tls sau ssl */ $mail = new KM_Mailer($SenderConfig["SMTP_server"], $SenderConfig["SMTP_port"], $SenderConfig["SMTP_email"], $SenderConfig["SMTP_pass"], $ SenderConfig["SMTP_type"]); if($mail->isLogin) ( // Atașați un fișier if($Attachment) ($mail->addAttachment($Attachment);) // Adăugați mai mulți destinatari $mail->addRecipient( " [email protected]"); $mail->addRecipient(" [email protected]"); /* $mail->send(De la, Pentru, Subiect, Text, Subiect = opțional) */ $SendMail = $mail->send($SenderConfig["SMTP_email"], $Receiver, $Subject, $Text ); // Șterge lista de destinatari $mail->clearBCC( $mail->clearAttachments( echo "A apărut o eroare la conectarea la serverul SMTP); );
Configurarea scriptului se bazează în principal pe matricea $SenderConfig, aici trebuie să specificăm SMTP:server, port, login și parola de e-mail. Să descriem fiecare cheie de matrice:
SMTP_server - adresa serverului SMTP (adresă individuală pentru diferite e-mailuri)
Mail.ru mail: Port smtp.mail.ru: 25, 587 și 465 (cu criptare SSL)
E-mail Yandex: Port smtp.yandex.ru: 25, 587 465 (port SSL)
Rambler mail: Port mail.rambler.ru: 25, 587 465 (port SSL)
Yahoo Mail: smtp.mail.yahoo.com Port SSL: 465
(Dacă aveți nevoie de adresa serverelor smtp care nu sunt pe listă, scrieți în comentarii)
SMTP_port - L-am descris deja mai sus pentru fiecare server smtp.
SMTP_email - user ar fi mai precis, dar pentru claritate am scris e-mail, indicăm adresa de e-mail.
SMTP_pass - Parola pentru e-mail care a fost specificată ca valoare în cheia SMTP_email
SMTP_type - NULL implicit. Protocolul prin care vor fi trimise scrisorile. Protocoale: SSL și TLS
Puteți adăuga atașamente la o scrisoare specificând pur și simplu adresa completă a fișierului în variabila $Attachment (/var/patch/to/file/File.pdf)
Dacă aveți întrebări, scrieți-le în comentariile de mai jos.
În unele cazuri, în scopul de a testa sau diagnostica funcționarea e-mailului, administratorul de e-mail trebuie să verifice trimiterea scrisorilor prin serverele sale Exchange (și nu numai) de la anumite gazde. Dacă serverul nu necesită autorizare (server open-relay), puteți trimite e-mail. Cu toate acestea, în majoritatea cazurilor, serverele de e-mail necesită autorizare pentru a trimite e-mail. În acest exemplu, vom arăta cum să efectuați autentificarea AUTH LOGIN pe un server SMTP în consola telnet și să trimitem o scrisoare.
Autentificare– în terminologia Exchange, aceasta este autentificarea de bază, atunci când numele de utilizator și parola sunt transmise prin rețea criptate folosind un algoritm baza64 formă. Pe majoritatea serverelor interne Exchange, administratorii nu dezactivează De bazăAutentificare. Puteți verifica suportul acestuia în setările conectorului de recepție.
Nota. Vă rugăm să rețineți că un atacator, atunci când accesează un canal de comunicare, poate intercepta și decripta cu ușurință acreditările de utilizator codificate în Base64. Prin urmare, această metodă de autorizare este recomandată a fi utilizată exclusiv în rețele private corporative.
Pentru a autoriza serverul de mail folosind AUTH LOGIN, trebuie să convertim numele de utilizator și parola utilizatorului de la care scrisoarea va fi trimisă în format Base64. Acest lucru se poate face folosind scripturi sau servicii online. Folosesc site-ul https://www.base64encode.org/.
Nume utilizator: testuser@contoso.com, în codificarea Base64 a rezultat: dGVzdHVzZXJAY29udG9zby5jb20=
Parolă: $ sus3RsTr)ng- în Base64 JHVwM1JzVHIpbmc=
Acum, în linia de comandă folosind Telnet, ne conectăm la portul 25 (SMTP) al serverului nostru de e-mail (voi evidenția comenzile introduse cu albastru):
telnet mail.contoso.com 25
Dacă este Exchange, va returna ceva de genul;
Să ne prezentăm:
ehlo sender.contoso.com
Serverul va returna o listă de tipuri și capabilități de autorizare acceptate. După cum puteți vedea, autorizarea de bază (AUTH LOGIN) este în listă.
250-mail.contoso.com Bună ziua
250 - DIMENSIUNEA 36700160
250-CONDUCERE
250-DSN
250-CODURI DE STARE ÎMBUNĂTĂTATE
250-STARTTLS
250-AUTH LOGIN
250-8BITMIME
250-BINARMIME
250 BĂRĂTIRE
Autentificare
Serverul ar trebui să răspundă:
334 VXNlcm5hbWU6
Acum inserăm numele de utilizator în format Base64, pe care l-am codificat mai devreme:
dGVzdHVzZXJAY29udG9zby5jb20=
Serverul ar trebui să răspundă:
334 UGFzc3dvcmQ6.
Acum este timpul să lipiți parola în format Base64:
JHVwM1JzVHIpbmc=
Dacă numele de utilizator și parola sunt corecte, serverul va răspunde.
235 2.7.0 Autentificare reușită
Dacă nu:
535 5.7.8 Eroare: autentificarea eșuată: UGFzc3dvcmQ6
Acum puteți completa câmpurile standard ale scrisorii:
mail de la: [email protected]
250 2.1.0 Expeditorul OK
rcpt la: [email protected]
250 2.1.5 Destinatar OK
date
354 Începeți introducerea e-mailului; termina cu .
de la: TestUserovich
către: TheAdmin< [email protected] >
Subiect: Test BASE SMTP autentificat prin Telnet
Acesta este testul
.
250 2.6.0
RENUNȚĂ
221 2.0.0 Închiderea conexiunii.
Conexiune închisă de gazda străină.
Asta e tot, scrisoarea de test ar trebui să fie livrată cu succes în căsuța poștală a destinatarului.
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ă multe informații variate pe Internet și ceea ce este disponibil 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.
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 pe aici?! voi raspunde
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 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_password"].""). "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);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, 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 majoritatea cazurilor, 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.
Î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:
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.
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).