Smtp autorisasjonskode. Sende e-poster (SMTP vs. post PHP). Hvordan sende e-post med ASP
Siden det er forbudt å sende anonyme meldinger fra virtuelle Windows-vertsservere, bør sending av brev gjøres via en SMTP-server, som det også er mulig å bruke vårt postsystem for.
Hvordan sende e-post med PHP?
Bruke en hvilken som helst PHP-klasse som støtter autorisasjon på smtp-serveren. Du kan for eksempel bruke klassesettet PHPMailer.
Du kan også bruke vårt eksempel, som implementerer sending av brev ved hjelp av en smtp-server, som krever autorisasjon. Derfor, ikke glem å legge til de riktige tilgangsdetaljene til skriptet, for eksempel:
// Hvis du trenger å vise SMTP-sesjonsloggen, kan du fjerne kommentarer på følgende linje. // $_SERVER["debug"] = sant; funksjon MailSmtp ($reciever, $subject, $content, $headers, $debug = 0) ( $smtp_server = "smtp.site"; // SMTP-serveradresse$smtp_port = 25 ; // SMTP-serverport$smtp_user = " [e-postbeskyttet]" ; // Brukernavn for autorisasjon på SMTP-serveren$smtp_password = "pAsSwORd" ; // Passord for autorisasjon på SMTP-serveren$mail_from = " [e-postbeskyttet]" ; // Postkasse som brevet sendes fra$sock = fsockopen ($smtp_server, $smtp_port, $errno, $errstr, 30); $str = fgets ($sokk, 512); if (! $sock ) ( printf ( "Socket er ikke opprettet\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 , "POST FRA:<" . $mail_from . ">" ); smtp_msg ($sock , "RCPT TIL:<" . $reciever . ">" ); smtp_msg ($sock , "DATA" ); $headers = "Emne: " . $subject . "\r\n" . $headers ; $data = $headers . "\r\n\r\n" . $content . "\r\n." ; smtp_msg ($sock , $data ); smtp_msg ($sock , "QUIT" ); fclose ($sock ); ) funksjon smtp_msg ($sock , $msg ) ( if ( ! $sock ) ( printf ("Broken socket!\n" ); exit(1 ); ) if (isset($_SERVER [ "debug" ]) && $_SERVER [ "debug" ]) ( printf ( "Send fra oss : %s" , nl2br (htmlspecialchars ($msg )); ) fputs ($sock , " $msg \r\n" ); $str = fgets ($sock , 512 ); if (! $sock ) ( printf ( "Socket er down\n" ); exit(1); ) else ( if (isset($_SERVER [ "debug" ]) && $_SERVER [ "debug" ]) ( printf ("Fikk fra server: %s
" , nl2br (htmlspecialchars ($str )); ) $e = eksplodere (" " , $str ); $code = array_shift ($e ); $str = imploder ( " " , $e ); if ($code > 499) ( printf ( "Problemer med SMTP-samtale.
Kode %d.
Melding %s
" , $kode , $str ); exit(1); ) ) ) ?>
Last ned et eksempel på et ferdig skript med MailSmtp()-funksjonen: smtpauth.php.sample
Du kan bruke MailSmtp()-funksjonen beskrevet ovenfor for å erstatte mail()-funksjonen direkte; vurder et eksempel på den enkleste formen i PHP:
// Meldingshoder, de definerer meldingskodingen, Fra-, Til-feltene osv.$headers = "MIME-versjon: 1.0\r\n" ; $headers .= "Innholdstype: text/html; charset=windows-1251\r\n"; $headers .= "Til: $til \r\n" ; $headers .= "Fra: Avsenderens navnFor å Denne formen fungerte uten mail()-funksjonen, inkluderte vi smtpauth.php-filen via require_once og kalte MailSmtp()-funksjonen beskrevet i den, med argumenter som ligner på mail(). Samtidig kommenterte vi selve mail()-kallet i koden for å unngå feil ved utføring av skriptet.
Hvordan sende e-post med ASP.NET?
Hvis du bruker versjon 2.0, bruker du MailMessage-klassen System.Net.Mail), godt beskrevet.
Nedenfor er eksempler på bruk for C#- og VisualBasic-språkene:
Eksempel for C#-språket:
<% @Page Language="c#" %> <% @Import Namespace="System.Net.Mail" %> <% @Import Namespace="System.Net" %> <% MailMessage message = new MailMessage(); // opprette en ny bokstav message.To.Add(" [e-postbeskyttet]"); // legger til mottakeradresse melding.Fra = ny e-postadresse("fra@ domain.tld", "Avsenders navn"); // spesifiserer navn og adresse til avsenderen message.Subject = "Meldingens emne"; // spesifisere emnet for brevet message.BodyEncoding = System.Text.Encoding.UTF8; // spesifiserer bokstavkodingen melding.IsBodyHtml = usann; // spesifisere bokstavformatet (true - HTML, false - ikke HTML) message.Body = "Meldingstekst"; // spesifiserer teksten (brødteksten) til brevet SmtpClient-klient = ny SmtpClient("smtp.site",25); // oppretter en ny tilkobling til serveren "smtp.site" client.DeliveryMethod = SmtpDeliveryMethod.Network; // definerer metoden for å sende meldinger client.EnableSsl = false; // deaktiverer behovet for å bruke en sikker tilkobling til serveren client.UseDefaultCredentials = false; // deaktiver bruken av standard autorisasjonsdetaljer client.Credentials = new NetworkCredential("postmaster@ domain.tld", "***passord***"); // spesifisere de nødvendige detaljene (brukernavn og passord) for autorisasjon på SMTP-serveren klient.Send(melding); // sende melding %>Last ned et eksempel på et utfylt skjema som viser bruk denne metoden: MailForm.aspx.
Eksempel for VisualBasic-språket:
<% @Page Language="VB" Debug="true" %> <% @Import Namespace="System.Net.Mail" %> <% @Import Namespace="System.Net" %> <% Dim smtpMssg AS new MailMessage smtpMssg.From = New MailAddress ("admin@domain.tld", "Sender_name") smtpMssg.To.Add (" [e-postbeskyttet]") " legger til mottakeradresse smtpMssg.Subject = "E-postemne" "angivelse av emnet for brevet smtpMssg.Body = "Meldingstekst" " angivelse av teksten (brødteksten) i brevet smtpMssg.BodyEncoding = System.Text.Encoding.UTF8 " indikasjon på bokstavkodingen smtpMssg.IsBodyHtml = usann " indikasjon på bokstavformatet (true - HTML, usant - ikke HTML) Dim SmtpMail som ny SmtpClient("smtp.site", 25) " erklæring av et nytt objekt av typen "SmtpClient" SmtpMail.DeliveryMethod = SmtpDeliveryMethod.Network "angivelse av brevleveringsmetoden SmtpMail.UseDefaultCredentials = False "deaktivering av bruk av autorisasjonslegitimasjon som standard" SmtpMail.EnableSsl = False " deaktiverer behovet for å bruke en sikker tilkobling til serveren SmtpMail.Credentials = new NetworkCredential("postmaster@ domain.tld", "***passord***") "som indikerer de nødvendige detaljene (brukernavn og passord) for autorisasjon på SMTP-serveren SmtpMail.Send(smtpMssg) " sender en melding %>Det er også en utdatert (og utdatert) SmtpMail-klasse (som bruker navneområdet System.Web.Mail). Nedenfor er et eksempel på bruken for VisualBasic-språket:
<% @Page Language="VB" Debug="true" %> <% @Import Namespace="System.Web" %> <% @Import Namespace="System.Web.Mail" %> <% Dim smtpMssg = new MailMessage " erklæring om et nytt objekt av typen "MailMessage" smtpMssg.From = "AvsendernavnHvordan sende e-post med ASP?
Vær oppmerksom på at når du bruker vår smtp-server, kreves autorisasjon, så ikke glem å legge til de riktige tilgangsdetaljene til skriptet, for eksempel:
<% 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@domain.tld" .Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "passord" .Oppdater End With Set cdoMessage = CreateObject("CDO.Message") Med cdoMessage Set .Configuration = iConfig .From = "Test brukerNoen CMS har allerede innebygde verktøy for å sende korrespondanse eller tilsvarende moduler; la oss se på de mest populære.
Wordpress
For dette CMS er det en spesiell modul "WP Mail SMTP", et eksempel på konfigurasjonen er beskrevet på modulsiden.
Vær oppmerksom på illustrasjonen i eksemplet; i vårt postsystem er det nødvendig å bruke port 25 og SSL-kryptering er ikke nødvendig.
Joomla
I administrasjonspanelet går du til delen "Generelle innstillinger", velg fanen "Server". I "Mail"-feltet må du velge sendemetoden som "SMTP-server", i feltene "SMTP-serveradresse" og "SMTP-pålogging" og "SMTP-passord" spesifiser de riktige detaljene for e-postsystemet, for eksempel: smtp.site, boks@ditt_domene og tilsvarende passord.
Drupal
Dette CMS har også sin egen modul for arbeid med en SMTP-server, basert på PHPMailer. Du kan laste ned denne modulen på siden på CMS Drupal-nettstedet; en beskrivelse av hvordan du installerer modulen er tilgjengelig i arkivet med den.
NetCat
Dette CMS-systemet har ikke innebygde funksjoner for arbeid med en SMTP-server. For å sende e-post ved hjelp av nettstedsskript, kan vi tilby å bruke løsningen vår; for å koble til den må du utføre følgende trinn:
- Last ned et arkiv med nødvendige filer fra nettstedet vårt ( send_auth_mail.php Og mail.inc.php) og pakk den ut på datamaskinen;
Rediger fil send_auth_mail.php fra arkivet, og angir tilkoblingsdetaljene til ønsket SMTP-server:
- $mail_smtpServer = "smtp.site"; (SMTP-serveradresse)
- $mail_port = "25" ; (tilkoblingsport)
- $mail_brukernavn = "[e-postbeskyttet]" ; (brukernavn for autorisasjon på SMTP-serveren)
- $mail_password = "Passord"; (passord for autorisasjon på SMTP-serveren)
- Lag en sikkerhetskopi av filen domain.tld/www/netcat/admin/mail.inc.php;
- laste ned filer send_auth_mail.php Og mail.inc.php til det virtuelle nettstedet i katalogen domain.tld/www/netcat/admin/
domain.tld bør erstattes med ditt domenenavn.
Den foreslåtte løsningen fungerer med alle NetCat-moduler som bruker standardfunksjonene til dette CMS for å sende e-post.
I lang tid har jeg lett etter en løsning for å sende brev til brukere ikke gjennom mail()-funksjonen i PHP, men gjennom SMTP-postservere. Det er ikke mye variert informasjon på Internett, og det som finnes fungerer ikke helt riktig, eller fungerer ikke i det hele tatt. Derfor satte jeg alt sammen og skrev min egen kode, basert på ferdige som presenteres på sidene.
Hvorfor sende via SMTP og ikke post()
Svaret mitt er ganske enkelt - i en tid sendte virus tonnevis av brev gjennom serveren min, noe som førte til at IP-adressen min ble utestengt av mange mailere, spesielt gmail.com, og i forbindelse med dette kunne brukere motta brev, så jeg måtte søke alternativ, og jeg fant det - dette er SMTP
Du er kanskje interessert i hvorfor manuset mitt er bedre enn andre som ligger i det fri?! jeg vil svare
- Det fungerer med Yandex, Rambler, Mail (gmail kunne ikke vinne)
- Tøm kode. For å konfigurere det, bare endre noen få linjer
- Sender e-post i HTML-format
Her er fordelene med manuset mitt, som jeg ikke fant noe sted på Internett, men fra hvert tok jeg alt jeg trengte. Så la oss se på koden.
Funksjon smtpmail($mail_to, $subject, $message, $service="yandex") ( $config["smtp_charset"] = "windows-1251"; //meldingskoding. (eller UTF-8, etc.) $config [ "smtp_from"] = "mashintop.ru"; //Ditt navn - eller navnet på nettstedet ditt. Vil vises når det leses i "Fra"-feltet $config["smtp_debug"] = usant; //Hvis du vil for å se feilmeldinger, spesifiser true i stedet for false $config["smtp_port"] = "25"; // Arbeidsport. Ikke endre hvis du ikke er sikker. if($service=="yandex") ( $config[ "smtp_searcher"] = "yandex. ru"; $config["smtp_email"] = " [e-postbeskyttet]"; $config["smtp_username"] = "mashintop"; //Endre til navnet på postkassen din. $config["smtp_host"] = "smtp.yandex.ru"; //server for å sende e-post $config[" smtp_password "] = "moi_parol"; //Endre passordet ) elseif($service=="rambler") ( $config["smtp_searcher"] = "rambler.ru"; $config["smtp_email"] = " [e-postbeskyttet]"; $config["smtp_username"] = "mashintop"; //Endre til navnet på postkassen din. $config["smtp_host"] = "smtp.rambler.ru"; //server for å sende e-post $config[" smtp_password "] = "moi_parol"; //Endre passordet ) elseif($service=="mail") ( $config["smtp_searcher"] = "mail.ru"; $config["smtp_email"] = " [e-postbeskyttet]"; $config["smtp_username"] = "mashintop"; //Endre til navnet på postkassen din. $config["smtp_host"] = "smtp.mail.ru"; //server for å sende e-post $config[" smtp_password "] = "moi_parol"; //Endre passord ) elseif($service=="gmail") ( $config["smtp_searcher"] = "gmail.com"; $config["smtp_email"] = " [e-postbeskyttet]"; $config["smtp_username"] = "alexeybertram"; //Endre til navnet på postboksen din. $config["smtp_host"] = "smtp.gmail.com"; //server for å sende e-post $config[" smtp_password "] = "moi_parol"; //Endre passord ) $header="Dato: ".date("D, j M Y G:i:s")." +0700rn"; $header.="Fra: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode("".$config[" smtp_from"]."")))"?=<".$config["smtp_email"].">rn"; $header.="X-Mailer: Flaggermusen! (v3.99.3) Professionalrn"; $header.="Reply-To: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode(" ".$config["smtp_from"]."")))"?=<".$config["smtp_email"].">rn"; $header.="X-Priority: 3 (Normal)rn"; $header.="Meldings-ID:<172562218.".date("YmjHis")."@".$config["smtp_searcher"].">rn"; $header.="Til: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode("")))."? =<$mail_to>rn"; $header.="Emne: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode("".$subject."" )))"?=rn"; $header.="MIME-versjon: 1.0rn"; $header.="Innholdstype: 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) (skriv ut "tilkobling fra servere mislyktes"; 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) (skriv ut "EHLO hello error"; fclose($smtp_conn); exit; ) fputs($smtp_conn,"AUTH LOGINrn"); $code = substr(get_data($smtp_conn),0.3000); if($code != 334) (skriv ut "serveren tillot ikke autorisasjon å begynne"; fclose ($ smtp_conn); exit;) fputs($smtp_conn,base64_encode("".$config["smtp_brukernavn"]."")."rn"); $code = substr(get_data($smtp_conn),0,3000) ; if ($code != 334) (skriv ut "feil ved tilgang til denne brukeren"; fclose($smtp_conn); exit;) fputs($smtp_conn,base64_encode("".$config["smtp_password"].""). "rn" ); $code = substr(get_data($smtp_conn),0,3000); if($code != 235) (skriv ut "feil passord"; fclose($smtp_conn); exit;) fputs($smtp_conn,"MAIL FRA:".$config["smtp_email"]."rn"); $kode = substr(get_data($smtp_conn),0,3000); if($kode != 250) (skriv ut "serveren nektet MAIL FROM-kommandoen"; fclose($smtp_conn); exit;) fputs($smtp_conn,"RCPT TO:".$mail_to."rn"); $kode = substr(get_data($smtp_conn),0,3000); if($kode != 250 OG $kode != 251) (skriv ut "Tjeneren godtok ikke RCPT TO-kommandoen"; fclose($smtp_conn); exit;) fputs($smtp_conn,"DATArn"); $kode = substr(get_data($smtp_conn),0,3000); if($kode != 354) (skriv ut "serveren godtok ikke DATA"; fclose($smtp_conn); exit;) fputs($smtp_conn,$header."rn".$melding."rn.rn"); $kode = substr(get_data($smtp_conn),0,3000); if($kode != 250) (skriv ut "feil ved sending av brev"; fclose($smtp_conn); exit;) fputs($smtp_conn,"QUITrn"); fclose($smtp_conn); ) funksjonen get_data($smtp_conn) ( $data=""; while($str = fgets($smtp_conn,515)) ( $data .= $str; if(substr($str,3,1) == " " ) ( pause; ) ) returner $data; ) $text_email = "
Du har nettopp lagt til en annonse på nettstedet mashintop.ru. Du kan se den herDin nøkkel: ".$key."
Ved å bruke denne tasten kan du administrere annonsen din.
"; $text_email .= " "; smtpmail(" [e-postbeskyttet]", "Nøkkelen til annonsen på mashintop.ru", $text_email, "yandex"); //bruk Yandex smtpmail(" [e-postbeskyttet]", "Nøkkelen til annonsen på mashintop.ru", $text_email, "mail"); //bruk e-posten smtpmail(" [e-postbeskyttet]", "Nøkkelen til annonsen på mashintop.ru", $text_email, "rambler"); //bruk rambler smtpmail(" [e-postbeskyttet]", "Nøkkelen til annonsen på mashintop.ru", $text_email, "gmail"); // men gmail fungerer ikke :(
Det er alt, det ferdige skriptet er i dine hender, bare kopier det, endre verdiene til $config-matrisen og alt vil fungere bra.
La oss nå se på noen elementer som jeg ønsker å fokusere på.
For eksempel feilen vi får når vi prøver å sende via SMTP til Google. Til å begynne med ser vi denne feilteksten:
For å se noe mer spesifikt, la oss endre koden litt
Fputs($smtp_conn,"AUTH LOGINrn"); $kode = substr(get_data($smtp_conn),0,3000); ekko $kode; if($kode != 334) (skriv ut "serveren tillot ikke autorisasjon å begynne"; fclose($smtp_conn); exit;)
Og til slutt får vi en veldig spesifikk feil
530 5.7.0 Må utstede en STARTTLS-kommando først. x4sm16408296lbn.2 - gsmtp
Jeg vet ikke nøyaktig hva det betyr, men jeg tror det har noe å gjøre med en sikker, usikret tilkobling. Jeg vet ikke hvordan jeg skal bli kvitt det ennå, så gmail forblir ubeseiret for øyeblikket.
2019-08-05
Hei, kjære besøkende!
Tilgi meg for forsinkelsen med å oppdatere bloggen. Men det er en helt forståelig forklaring på dette. Tross alt var det sommer, dacha, gjester, skog, vann og mye mer, som ikke tillot meg å takle problemene med å lage et nettsted. Men nå har jeg frigjort meg litt, gjestene har gått, og jeg tror at nå skal jeg definitivt være oppmerksom på dette.
Så, etter at vi i den siste artikkelen koblet e-posten til domenet vårt til en av e-posttjenestene, la oss nå se hvordan du kan sende e-post fra nettstedet. Dessuten på en slik måte at våre brev ikke havner i SPAM, men er pålitelig, med høy grad av sannsynlighet, levert til våre mottakere.
Generelt er det en innebygd mail()-funksjon for å sende brev i PHP. Men det skal bemerkes at til tross for enkelheten til denne metoden (i dette tilfellet, for å sende brev er det nok å spesifisere bare en kodelinje med visse parametere), har bruken av dette alternativet en betydelig ulempe knyttet til problemet med SPAM .
Faktum er at anti-SPAM-filtrene til e-postservere på mottakerens side egentlig ikke favoriserer brev sendt gjennom mail()-funksjonen. Og i de fleste tilfeller blir slike meldinger filtrert eller til og med slettet før de når adressaten.
Og for å eliminere slike tilfeller så mye som mulig, brukes vanligvis et annet alternativ, der brev sendes som om det var gjort av en tredjeparts posttjeneste.
Denne metoden kalles å sende e-post via SMTP med autorisasjon. Som vi skal se på i dag ved å bruke eksemplet med å sende et tilbakemeldingsskjema. For dette vil vi dessuten bruke det ganske kjente og populære PHPMailer-biblioteket, som lar deg ganske enkelt organisere sending av brev via SMTP.
- Hvordan vil vi sende tilbakemeldingsbrev
- Opprette et tilbakemeldingsskjema
- Installere PHPMailer-biblioteket
- Vi lager et script for å sende e-post via SMTP
- Sjekker e-postsending
- Nettstedets kildefiler
Hvordan vil vi sende tilbakemeldingsbrev
Før vi begynner det praktiske arbeidet med å sende tilbakemeldingsbrev, la oss først bestemme hvordan vi skal gjøre det.
Tilbakemeldingsskjemaet er utformet slik at brukeren kan kommunisere med nettstedadministratoren for å formidle budskapet sitt. Vanligvis består dette skjemaet av flere felt og en "Send"-knapp.
For å sende en e-post er det i prinsippet nok å bruke bare noen få felt som gir tilstrekkelig informasjon om brukeren og innholdet i meldingen, for eksempel:
- "Navn" - for å skrive inn navnet på meldingsavsenderen;
- "E-post" - for avsenderens e-postadresse;
- "Meldingsemne";
- "Meldingstekst".
Selv om du kan legge til andre. For eksempel et telefonnummer, hvis dette virkelig er nødvendig.
I vårt tilfelle vil slike brev bli sendt til nettstedadministratorens adresse fra en ekte postkasse med autorisasjon på posttjenesten som domenet vårt er koblet til.
Siden vi i forrige artikkel fokuserte på å sjekke tilkoblingen av domenepost til Yandex.Mail-tjenesten, vil vi sende e-post for dette alternativet. Selv om dette ikke er viktig. Nedenfor vil du se de alternativene som, når de endres, lar deg sende e-post via Mail.ru-postserveren.
Som en ekte postkasse som brev vil bli sendt fra, vil vi bruke kontoen til en nyopprettet domenepostbruker, for eksempel med adressen [e-postbeskyttet]. Og vi sender disse brevene til administratorens postkasse [e-postbeskyttet], som vi tidligere opprettet i forrige artikkel.
Dermed vil avsenderen av brevet fra tilbakemeldingsskjemaet være postkassen [e-postbeskyttet]., og mottakeren - [e-postbeskyttet]. I dette tilfellet vil all informasjon om brukeren som sendte meldingen med innholdet bli overført i hoveddelen av det sendte brevet.
Opprette et tilbakemeldingsskjema
Etter at vi har bestemt oss for fremgangsmåten for å sende brev, vil vi nå lage et tilbakemeldingsskjema som vi skal gjøre dette med.
Nedenfor er HTML-koden for dette skjemaet, som vi vil plassere på "Kontakter"-siden (fil kontakty.php i artikkelkatalogen).