Smtp avtorizacijska koda. Pošiljanje e-pošte (SMTP v primerjavi s poštnim PHP). Kako pošiljati e-pošto z ASP
Ker je pošiljanje anonimnih sporočil z navideznih Windows gostiteljskih strežnikov prepovedano, naj pošiljanje pisem poteka preko SMTP strežnika, za kar je možno uporabiti tudi naš poštni sistem.
Kako pošiljati e-pošto z PHP?
Uporaba katerega koli razreda PHP, ki podpira avtorizacijo na strežniku smtp. Uporabite lahko na primer nabor razredov PHPMailer.
Uporabite lahko tudi naš primer, ki implementira pošiljanje pisem s strežnikom smtp, ki zahteva avtorizacijo. Zato ne pozabite skriptu dodati ustreznih podrobnosti o dostopu, na primer:
// Če morate prikazati dnevnik seje SMTP, lahko odkomentirate naslednjo vrstico. // $_SERVER["debug"] = res; funkcija MailSmtp ($reciever, $subject, $content, $headers, $debug = 0) ( $smtp_server = "smtp.site"; // Naslov strežnika SMTP$smtp_port = 25 ; // Vrata strežnika SMTP$smtp_user = " [e-pošta zaščitena]" ; // Uporabniško ime za avtorizacijo na strežniku SMTP$smtp_password = "pAsSwORd" ; // Geslo za avtorizacijo na strežniku SMTP$mail_from = " [e-pošta zaščitena]" ; // Nabiralnik, iz katerega je pismo poslano$sock = fsockopen ($smtp_server, $smtp_port, $errno, $errstr, 30); $str = fgets ($sock, 512); if (! $sock ) ( printf ( "Vtičnica ni ustvarjena\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_password)); smtp_msg ($sock, "MAIL OD:<" . $mail_from . ">"); smtp_msg ($sock, "RCPT TO:<" . $reciever . ">"); smtp_msg ($sock, "DATA"); $headers = "Zadeva: ". $subject. "\r\n" . $headers; $data = $headers. "\r\n\r\n" . $content. "\r\n." _SERVER [ "debug" ]) && $_SERVER [ "debug" ]) ( printf ( "Pošljite od nas: %s" , nl2br (htmlspecialchars ($msg )); ) fputs ($sock , " $msg \r\n" ); $str = fgets ($sock , 512); if (! $sock ) ( printf ( "Vtičnica je navzdol\n" ); exit(1); ) else ( if (isset($_SERVER [ "debug" ]) && $_SERVER [ "debug" ]) ( printf ("Pridobljeno s strežnika: %s
" , nl2br (htmlspecialchars ($str )); ) $e = eksplozija (" ", $str ); $code = array_shift ($e); $str = implode ( " ", $e); if ($code > 499 ) ( printf ( "Težave s pogovorom SMTP.
Koda %d.
Sporočilo %s
" , $code, $str); izhod(1); ) ) ) ?>
Prenesite primer že pripravljenega skripta s funkcijo MailSmtp(): smtpauth.php.sample
Zgoraj opisano funkcijo MailSmtp() lahko uporabite za neposredno zamenjavo funkcije mail() in si oglejte primer najpreprostejše oblike v PHP:
// Glave sporočil, določajo kodiranje sporočil, polja From, To itd.$headers = "Različica MIME: 1.0\r\n" ; $headers .= "Vrsta vsebine: besedilo/html; nabor znakov=windows-1251\r\n"; $headers .= "Za: $to \r\n" ; $headers .= "Od: Ime pošiljateljaDa bi ta obrazec deloval brez funkcije mail(), smo datoteko smtpauth.php vključili prek require_once in poklicali funkcijo MailSmtp(), opisano v njej, z argumenti, podobnimi mail(). Hkrati smo komentirali sam klic mail() v kodi, da bi se izognili napakam pri izvajanju skripta.
Kako poslati e-pošto z uporabo ASP.NET?
Če uporabljate različico 2.0, uporabite razred MailMessage System.Net.Mail), dobro opisano.
Spodaj so primeri njegove uporabe za jezika C# in VisualBasic:
Primer za jezik C#:
<% @Page Language="c#" %> <% @Import Namespace="System.Net.Mail" %> <% @Import Namespace="System.Net" %> <% MailMessage message = new MailMessage(); // ustvarjanje nove črke message.To.Add(" [e-pošta zaščitena]"); // dodajanje naslova prejemnika sporočilo.Od = nov poštni naslov("od@ domena.tld", "Ime pošiljatelja"); // z navedbo imena in naslova pošiljatelja message.Subject = "Zadeva sporočila"; // navedba predmeta pisma message.BodyEncoding = System.Text.Encoding.UTF8; // določanje črkovnega kodiranja message.IsBodyHtml = false; // določanje oblike črke (true - HTML, false - ni HTML) message.Body = "Besedilo sporočila"; // določanje besedila (tela) pisma SmtpClient client = new SmtpClient("smtp.site",25); // ustvarjanje nove povezave s strežnikom "smtp.site" client.DeliveryMethod = SmtpDeliveryMethod.Network; // definira način za pošiljanje sporočil client.EnableSsl = false; // onemogoči potrebo po uporabi varne povezave s strežnikom client.UseDefaultCredentials = false; // onemogoči uporabo privzetih podrobnosti avtorizacije client.Credentials = new NetworkCredential("postmaster@ domena.tld", "***geslo***"); // podajanje potrebnih podrobnosti (uporabniško ime in geslo) za avtorizacijo na strežniku SMTP odjemalec.Pošlji(sporočilo); // poslati sporočilo %>Prenesite primer izpolnjenega obrazca, ki prikazuje uporabo ta metoda: MailForm.aspx.
Primer za jezik 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@domena.tld", "Ime_pošiljatelja") smtpMssg.To.Add (" [e-pošta zaščitena]") " dodajanje naslova prejemnika smtpMssg.Subject = "Zadeva elektronske pošte" "navedba predmeta pisma smtpMssg.Body = "Besedilo sporočila" " navedba besedila (telesa) pisma smtpMssg.BodyEncoding = System.Text.Encoding.UTF8 " navedba črkovnega kodiranja smtpMssg.IsBodyHtml = false " navedba črkovne oblike (true - HTML, false - ni HTML) Zatemni SmtpMail kot novega SmtpClient("smtp.site", 25) " deklaracija novega objekta tipa "SmtpClient" SmtpMail.DeliveryMethod = SmtpDeliveryMethod.Network "navedba načina dostave pisma SmtpMail.UseDefaultCredentials = False "privzeto onemogočanje uporabe avtorizacijskih poverilnic" SmtpMail.EnableSsl = False " onemogoči potrebo po uporabi varne povezave s strežnikom SmtpMail.Credentials = new NetworkCredential("postmaster@ domena.tld", "***geslo***") ", ki navaja potrebne podatke (uporabniško ime in geslo) za avtorizacijo na strežniku SMTP SmtpMail.Send(smtpMssg) " pošiljanje sporočila %>Obstaja tudi zastarel (in zastarel) razred SmtpMail (z uporabo imenskega prostora System.Web.Mail). Spodaj je primer njegove uporabe za jezik VisualBasic:
<% @Page Language="VB" Debug="true" %> <% @Import Namespace="System.Web" %> <% @Import Namespace="System.Web.Mail" %> <% Dim smtpMssg = new MailMessage " deklaracija novega objekta tipa "MailMessage" smtpMssg.From = "Ime_pošiljateljaKako pošiljati e-pošto z ASP?
Upoštevajte, da je pri uporabi našega strežnika smtp potrebna avtorizacija, zato ne pozabite skriptu dodati ustreznih podrobnosti o dostopu, na primer:
<% 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@domena.tld" .Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "geslo" .Update End With Set cdoMessage = CreateObject("CDO.Message") With cdoMessage Set .Configuration = iConfig .From = "Testni uporabnikNekateri CMS že imajo vgrajena orodja za pošiljanje korespondence ali ustrezne module; poglejmo najbolj priljubljene.
Wordpress
Za ta CMS obstaja poseben modul "WP Mail SMTP", primer njegove konfiguracije je opisan na strani modula.
Bodite pozorni na ilustracijo v primeru, v našem poštnem sistemu je potrebna uporaba vrat 25 in šifriranje SSL ni potrebno.
Joomla
Na skrbniški plošči pojdite na razdelek »Splošne nastavitve«, izberite zavihek »Strežnik«. V polju »Pošta« morate izbrati način pošiljanja kot »strežnik SMTP«, v poljih »naslov strežnika SMTP« ter »prijava SMTP« in »geslo SMTP« določite ustrezne podrobnosti poštnega sistema, na primer: smtp.site, box@vaša_domena in ustrezno geslo.
Drupal
Ta CMS ima tudi svoj modul za delo s strežnikom SMTP, ki temelji na PHPMailer. Ta modul lahko prenesete na njegovi strani na spletnem mestu CMS Drupal; opis namestitve modula je na voljo v arhivu z njim.
NetCat
Ta CMS nima vgrajenih funkcij za delo s strežnikom SMTP. Za pošiljanje pošte s skripti spletnega mesta vam lahko ponudimo uporabo naše rešitve, morate izvesti naslednje korake:
- Prenesite arhiv s potrebnimi datotekami z našega spletnega mesta ( send_auth_mail.php in mail.inc.php) in ga odpakirajte v računalnik;
Uredi datoteko send_auth_mail.php iz arhiva in v njem navedite podrobnosti povezave z želenim strežnikom SMTP:
- $mail_smtpServer = "smtp.site"; (naslov strežnika SMTP)
- $mail_port = "25" ; (priključna vrata)
- $mail_uporabniško ime = "[e-pošta zaščitena]" ; (uporabniško ime za avtorizacijo na SMTP strežniku)
- $mail_password = "Geslo"; (geslo za avtorizacijo na SMTP strežniku)
- Ustvarite varnostno kopijo datoteke domena.tld/www/netcat/admin/mail.inc.php;
- prenos datotek send_auth_mail.php in mail.inc.php na virtualno mesto v imeniku domena.tld/www/netcat/admin/
domena.tld zamenjati z imenom vaše domene.
Predlagana rešitev deluje z vsemi moduli NetCat, ki uporabljajo standardne funkcije tega CMS za pošiljanje pošte.
Dolgo časa sem iskal rešitev za pošiljanje pisem uporabnikom ne prek funkcije mail() v PHP, temveč prek poštnih strežnikov SMTP. Na spletu ni veliko raznovrstnih informacij in kar je, ne deluje čisto pravilno ali pa sploh ne deluje. Zato sem vse sestavil in napisal svojo kodo, ki temelji na že pripravljenih, ki so predstavljene na spletnih mestih.
Zakaj pošiljati prek SMTP in ne mail()
Moj odgovor je precej preprost - nekaj časa so virusi preko mojega strežnika pošiljali na tone pisem, zaradi česar so moj IP naslov prepovedali številni pošiljatelji, predvsem gmail.com, in v zvezi s tem so uporabniki lahko prejemali pisma, zato sem moral sem iskati alternativo in sem jo našel - to je SMTP
Morda vas bo zanimalo, zakaj je moj scenarij boljši od drugih, ki ležijo na prostem?! bom odgovoril
- Deluje z Yandex, Rambler, Mail (gmail ni mogel zmagati)
- Počisti kodo. Če ga želite konfigurirati, samo spremenite nekaj vrstic
- Pošilja e-pošto v formatu HTML
Tu so prednosti mojega scenarija, ki ga nisem našel nikjer na internetu, a sem iz vsakega vzel vse, kar sem potreboval. Torej, poglejmo kodo.
Funkcija smtpmail($mail_to, $subject, $message, $service="yandex") ( $config["smtp_charset"] = "windows-1251"; //kodiranje sporočila. (ali UTF-8 itd.) $config [ "smtp_from"] = "mashintop.ru"; //Vaše ime - ali ime vašega mesta bo prikazano v polju "Od" pri branju $config["smtp_debug"] = false če želite videti sporočila o napakah, navedite true namesto false $config["smtp_port"] = "25"; // Ne spreminjajte delovnih vrat, če niste prepričani"; $config["smtp_email"] = ". [e-pošta zaščitena]"; $config["smtp_username"] = "mashintop"; //Spremenite ime vašega nabiralnika. $config["smtp_host"] = "smtp.yandex.ru"; //strežnik za pošiljanje pošte $config[" smtp_password "] = "moi_parol"; //Spremenite geslo ) elseif($service=="rambler") ( $config["smtp_searcher"] = "rambler.ru"; $config["smtp_email"] = " [e-pošta zaščitena]"; $config["smtp_username"] = "mashintop"; //Spremenite ime svojega nabiralnika. $config["smtp_host"] = "smtp.rambler.ru"; //strežnik za pošiljanje pošte $config[" smtp_password "] = "moi_parol"; //Spremenite geslo ) elseif($service=="mail") ( $config["smtp_searcher"] = "mail.ru"; $config["smtp_email"] = " [e-pošta zaščitena]"; $config["smtp_username"] = "mashintop"; //Spremenite ime svojega nabiralnika. $config["smtp_host"] = "smtp.mail.ru"; //strežnik za pošiljanje pošte $config[" smtp_password "] = "moi_parol"; //Spremeni geslo ) elseif($service=="gmail") ( $config["smtp_searcher"] = "gmail.com"; $config["smtp_email"] = " [e-pošta zaščitena]"; $config["smtp_username"] = "alexeybertram"; //Spremenite ime svojega nabiralnika. $config["smtp_host"] = "smtp.gmail.com"; //strežnik za pošiljanje pošte $config[" smtp_password "] = "moi_parol"; //Spremeni geslo ) $header="Datum: ".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: Netopir! (v3.99.3) Professionalrn"; $header.="Odgovori na: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode(" ".$config["smtp_from"]."")))."?=<".$config["smtp_email"].">rn"; $header.="Prioriteta X: 3 (normalno)rn"; $header.="ID-sporočila:<172562218.".date("YmjHis")."@".$config["smtp_searcher"].">rn"; $header.="Za: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode("")))."? =<$mail_to>rn"; $header.="Zadeva: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode("".$subject."" )))."?=rn"; $header.="MIME-Version: 1.0rn"; $header.="Content-Type: 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) (print "povezava s strežniki ni uspela"; 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) (print "EHLO greeting error"; fclose($smtp_conn) ; exit;) fputs($smtp_conn,"AUTH LOGINrn"); $code = substr(get_data($smtp_conn),0,3000); fclose ($smtp_conn); exit;) fputs($smtp_conn,base64_encode("".$config["smtp_username"]."")."rn"); $code = substr(get_data($smtp_conn),0,3000 ) ; if($code != 334) (print "napaka pri dostopu do tega uporabnika"; fclose($smtp_conn); exit;) fputs($smtp_conn,base64_encode("".$config["smtp_password"].""). "rn"); $code = substr(get_data($smtp_conn),0,3000); if($code != 235) (print "wrong password"; fclose($smtp_conn); izhod;) fputs($smtp_conn,"MAIL FROM:".$config["smtp_email"]."rn"); $code = substr(get_data($smtp_conn),0,3000); if($code != 250) (print "strežnik je zavrnil ukaz 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 IN $code != 251) (natisni "Strežnik ni sprejel ukaza RCPT TO"; fclose($smtp_conn); izhod;) fputs($smtp_conn,"DATArn"); $code = substr(get_data($smtp_conn),0,3000); if($code != 354) (print "strežnik ni sprejel PODATKOV"; fclose($smtp_conn); izhod;) fputs($smtp_conn,$header."rn".$message."rn.rn"); $code = substr(get_data($smtp_conn),0,3000); if($code != 250) (natisni "napaka pri pošiljanju pisma"; fclose($smtp_conn); izhod;) fputs($smtp_conn,"QUITrn"); fclose($smtp_conn); ) funkcija get_data($smtp_conn) ( $data=""; while($str = fgets($smtp_conn,515)) ( $data .= $str; if(substr($str,3,1) == " " ) ( break; ) ) return $data; $text_email = "
Pravkar ste dodali oglas na spletno mesto mashintop.ru. Ogledate si ga lahko tukajVaš ključ: ".$key."
S tem ključem lahko upravljate svoj oglas.
"; $text_email .= " "; smtpmail(" [e-pošta zaščitena]", "Ključ do oglasa na mashintop.ru", $text_email, "yandex"); //uporabi Yandex smtpmail(" [e-pošta zaščitena]", "Ključ do oglasa na mashintop.ru", $text_email, "mail"); //uporabite e-pošto smtpmail(" [e-pošta zaščitena]", "Ključ do oglasa na mashintop.ru", $text_email, "rambler"); //uporabite rambler smtpmail(" [e-pošta zaščitena]", "Ključ do oglasa na mashintop.ru", $text_email, "gmail"); // vendar gmail ne deluje :(
To je vse, končni skript je v vaših rokah, samo kopirajte ga, spremenite vrednosti matrike $config in vse bo delovalo v redu.
Zdaj pa poglejmo nekaj elementov, na katere bi se rad osredotočil.
Na primer napaka, ki jo dobimo, ko poskušamo Googlu poslati prek SMTP. Na začetku vidimo to besedilo napake:
Če želite videti nekaj bolj specifičnega, nekoliko spremenimo kodo
Fputs($smtp_conn,"AUTH LOGINrn"); $code = substr(get_data($smtp_conn),0,3000); echo $code; if($code != 334) (natisni "strežnik ni dovolil začetka avtorizacije"; fclose($smtp_conn); izhod;)
In na koncu dobimo zelo specifično napako
530 5.7.0 Najprej morate izdati ukaz STARTTLS. x4sm16408296lbn.2 - gsmtp
Ne vem, kaj natančno pomeni, vendar verjamem, da je povezano z varno, nezavarovano povezavo. Ne vem še, kako se ga znebiti, tako da gmail trenutno ostaja nepremagan.
2019-08-05
Pozdravljeni, dragi obiskovalec!
Oprostite mi za zamudo pri posodabljanju bloga. A za to obstaja povsem razumljiva razlaga. Navsezadnje je bilo poletje, dača, gostje, gozd, voda in še veliko več, kar mi ni dovolilo, da bi se lotil vprašanj ustvarjanja spletnega mesta. Ampak zdaj sem se malo sprostil, gostje so odšli in mislim, da bom zdaj zagotovo lahko temu namenil ustrezno pozornost.
Torej, potem ko smo v prejšnjem članku pošto naše domene povezali z eno od poštnih storitev, si zdaj poglejmo, kako lahko pošiljate e-pošto s spletnega mesta. Še več, na način, da naša pisma ne končajo v SPAM-u, ampak so zanesljivo, z veliko verjetnostjo, dostavljena našim prejemnikom.
Na splošno obstaja vgrajena funkcija mail() za pošiljanje pisem v PHP. Vendar je treba opozoriti, da ima uporaba te možnosti kljub preprostosti te metode (v tem primeru je za pošiljanje pisem dovolj, da določite samo eno vrstico kode z določenimi parametri) pomembno pomanjkljivost, povezano s problemom SPAM .
Dejstvo je, da filtri za zaščito pred neželeno pošto poštnih strežnikov na strani prejemnika v resnici ne favorizirajo pisem, poslanih prek funkcije mail(). In v večini primerov so takšna sporočila filtrirana ali celo izbrisana, preden pridejo do naslovnika.
In da bi čim bolj odpravili takšne primere, se običajno uporablja druga možnost, pri kateri se pisma pošiljajo, kot da bi to storila poštna storitev tretje osebe.
Ta metoda se imenuje pošiljanje pošte prek SMTP z avtorizacijo. Kar si bomo danes ogledali na primeru pošiljanja obrazca za povratne informacije. Poleg tega bomo za to uporabili dokaj dobro znano in priljubljeno knjižnico PHPMailer, ki vam omogoča preprosto organizacijo pošiljanja pisem prek SMTP.
- Kako bomo pošiljali povratna pisma
- Ustvarjanje obrazca za povratne informacije
- Namestitev knjižnice PHPMailer
- Izdelamo skripto za pošiljanje pošte preko SMTP
- Preverjanje pošiljanja e-pošte
- Izvorne datoteke spletnega mesta
Kako bomo pošiljali povratna pisma
Preden začnemo s praktičnim delom pošiljanja povratnih pisem, se najprej odločimo, kako bomo to izvedli.
Obrazec za povratne informacije je zasnovan tako, da uporabniku omogoča komunikacijo z skrbnikom spletnega mesta, da posreduje svoje sporočilo. Običajno je ta obrazec sestavljen iz več polj in gumba »Pošlji«.
Načeloma je za pošiljanje e-pošte dovolj, da uporabite le nekaj polj, ki zagotavljajo dovolj podatkov o uporabniku in vsebini sporočila, kot so:
- "Ime" - za vnos imena pošiljatelja sporočila;
- "E-pošta" - za e-poštni naslov pošiljatelja;
- "Zadeva sporočila";
- "Besedilo sporočila".
Čeprav lahko dodate druge. Na primer telefonsko številko, če je to res potrebno.
V našem primeru bodo takšna pisma poslana na naslov skrbnika spletnega mesta iz pravega poštnega predala z avtorizacijo na poštni storitvi, s katero je povezana naša domena.
Ker smo se v prejšnjem članku osredotočili na preverjanje povezave domenske pošte s storitvijo Yandex.Mail, bomo pošiljali pošto za to možnost. Čeprav to ni pomembno. Spodaj boste videli tiste možnosti, ki vam bodo po spremembi omogočile pošiljanje e-pošte prek poštnega strežnika Mail.ru.
Kot pravi poštni predal, iz katerega bomo pošiljali pisma, bomo uporabili račun novo ustvarjenega domenskega poštnega uporabnika, recimo z naslovom [e-pošta zaščitena]. In ta pisma bomo poslali v administratorjev nabiralnik [e-pošta zaščitena], ki smo ga predhodno ustvarili v prejšnjem članku.
Tako bo pošiljatelj pisma iz obrazca za povratne informacije nabiralnik [e-pošta zaščitena]., in prejemnik - [e-pošta zaščitena]. V tem primeru bodo vsi podatki o uporabniku, ki je poslal sporočilo z njegovo vsebino, posredovani v telesu poslanega pisma.
Ustvarjanje obrazca za povratne informacije
Ko smo se odločili za postopek pošiljanja pisem, bomo sedaj ustvarili obrazec za povratne informacije, s katerim bomo to storili.
Spodaj je koda HTML za ta obrazec, ki ga bomo postavili na stran "Stiki" (datoteka kontakty.php v imeniku člankov).