Codice di autorizzazione SMTP. Invio di e-mail (SMTP o posta PHP). Come inviare e-mail utilizzando ASP
Poiché l'invio di messaggi anonimi da server hosting virtuali Windows è proibito, l'invio delle lettere dovrebbe avvenire tramite un server SMTP, per il quale è anche possibile utilizzare il nostro sistema di posta.
Come inviare e-mail utilizzando PHP?
Utilizzando qualsiasi classe PHP che supporti l'autorizzazione sul server SMTP. Ad esempio, puoi utilizzare il set di classi PHPMailer.
Puoi anche utilizzare il nostro esempio, che implementa l'invio di lettere utilizzando un server SMTP, che richiede autorizzazione. Pertanto, non dimenticare di aggiungere allo script i dettagli di accesso appropriati, ad esempio:
// Se è necessario mostrare il registro della sessione SMTP, è possibile rimuovere il commento dalla riga seguente. // $_SERVER["debug"] = vero; funzione MailSmtp ($destinatario, $oggetto, $contenuto, $intestazione, $debug = 0) ($smtp_server = "smtp.sito"; // Indirizzo del server SMTP$porta_smtp = 25 ; // Porta del server SMTP$utente_smtp = " [e-mail protetta]" ; // Nome utente per l'autorizzazione sul server SMTP$smtp_password = "pAsSwORd"; // Password per l'autorizzazione sul server SMTP$mail_da = " [e-mail protetta]" ; // Casella postale da cui viene inviata la lettera$sock = fsockopen ($smtp_server, $smtp_port, $errno, $errstr, 30); $str = fgets ($calzino, 512); if (! $sock ) ( printf ("Il socket non è stato creato\n" ); exit(1 ); ) smtp_msg ($sock, "HELO". $_SERVER [ "NOME_SERVER" ]); smtp_msg($sock, "LOGIN AUTORIZZATO"); smtp_msg ($sock, base64_encode ($smtp_user)); smtp_msg ($sock, base64_encode ($smtp_password)); smtp_msg ($sock, "MAIL DA:<" . $mail_from . ">" ); smtp_msg ($calzino, "RCPT TO:<" . $reciever . ">" ); smtp_msg ($sock , "DATA" ); $headers = "Oggetto: " . $oggetto . "\r\n" . $headers ; $dati = $headers . "\r\n\r\n" . $contenuto . "\r\n." ; smtp_msg ($calzino, $dati ) ( if (! $calzino) ( printf ("Socket rotto!\n"); exit(1); ) if (isset($ _SERVER [ "debug" ]) && $_SERVER [ "debug" ]) ( printf ("Invia da noi: %s" , nl2br (htmlspecialchars ($msg )); ) fputs ($sock , " $msg \r\n" ); $str = fgets ($sock , 512 ); if (! $sock ) ( printf ("Il socket è down\n" ); exit(1); ) else ( if (isset($_SERVER [ "debug" ]) && $_SERVER [ "debug" ]) ( printf ("Ottenuto dal server: %s
" , nl2br (htmlspecialchars ($str )); ) $e = esplode (" " , $str ); $code = array_shift ($e ); $str = implode (" ", $e ); if ($code > 499) (printf ( "Problemi con la conversazione SMTP.
Codice %d.
Messaggio %s
" , $codice , $str ); uscita(1); ) ) ) ?>
Scarica un esempio di script già pronto con la funzione MailSmtp(): smtpauth.php.sample
Puoi utilizzare la funzione MailSmtp() descritta sopra per sostituire direttamente la funzione mail() considera un esempio della forma più semplice in PHP:
// Intestazioni dei messaggi, definiscono la codifica del messaggio, i campi Da, A, ecc.$headers = "Versione MIME: 1.0\r\n" ; $intestazioni .= "Tipo di contenuto: text/html; charset=windows-1251\r\n"; $intestazioni .= "A: $a \r\n" ; $intestazioni .= "Da: nome del mittenteIn modo da questa forma funzionava senza la funzione mail(), abbiamo incluso il file smtpauth.php tramite require_once e chiamato la funzione MailSmtp() descritta in esso, con argomenti simili a mail(). Allo stesso tempo, abbiamo commentato la stessa chiamata mail() nel codice per evitare errori durante l'esecuzione dello script.
Come inviare e-mail utilizzando ASP.NET?
Se stai utilizzando la versione 2.0, utilizza la classe MailMessage System.Net.Mail), ben descritto.
Di seguito sono riportati esempi del suo utilizzo per i linguaggi C# e VisualBasic:
Esempio per il linguaggio C#:
<% @Page Language="c#" %> <% @Import Namespace="System.Net.Mail" %> <% @Import Namespace="System.Net" %> <% MailMessage message = new MailMessage(); // creando una nuova lettera messaggio.To.Add(" [e-mail protetta]"); // aggiunta dell'indirizzo del destinatario messaggio.From = new MailAddress("da@ dominio.tld", "Nome del mittente"); // specificando il nome e l'indirizzo del mittente message.Subject = "Oggetto del messaggio"; // specificando l'oggetto della lettera messaggio.BodyEncoding = System.Text.Encoding.UTF8; // specificando la codifica delle lettere messaggio.IsBodyHtml = falso; // specificando il formato della lettera (true - HTML, false - non HTML) message.Body = "Testo del messaggio"; // specificando il testo (corpo) della lettera Client SmtpClient = nuovo SmtpClient("smtp.site",25); //creazione di una nuova connessione al server "smtp.site" client.DeliveryMethod = SmtpDeliveryMethod.Network; // definisce il metodo per l'invio dei messaggi client.EnableSsl = falso; // disabilita la necessità di utilizzare una connessione sicura al server client.UseDefaultCredentials = false; // disabilita l'uso dei dettagli di autorizzazione predefiniti client.Credentials = new NetworkCredential("postmaster@ dominio.tld", "***parola d'ordine***"); // specificando i dettagli necessari (nome utente e password) per l'autorizzazione sul server SMTP cliente.Invia(messaggio); // mandare un messaggio %>Scarica un esempio di modulo compilato che dimostra l'utilizzo questo metodo: MailForm.aspx.
Esempio per il linguaggio 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@dominio.tld", "Nome_mittente") smtpMssg.To.Add (" [e-mail protetta]") " aggiungendo l'indirizzo del destinatario smtpMssg.Subject = "Oggetto dell'e-mail" "indicazione dell'oggetto della lettera smtpMssg.Body = "Testo del messaggio" "indicazione del testo (corpo) della lettera smtpMssg.BodyEncoding = System.Text.Encoding.UTF8 " indicazione della codifica delle lettere smtpMssg.IsBodyHtml = falso " indicazione del formato della lettera (true - HTML, false - non HTML) Oscura SmtpMail come nuovo SmtpClient("smtp.site", 25) " dichiarazione di un nuovo oggetto di tipo "SmtpClient" SmtpMail.DeliveryMethod = SmtpDeliveryMethod.Network "indicazione della modalità di consegna della lettera SmtpMail.UseDefaultCredentials = False "disabilitare l'uso delle credenziali di autorizzazione per impostazione predefinita" SmtpMail.EnableSsl = Falso " disabilita la necessità di utilizzare una connessione sicura al server SmtpMail.Credentials = new NetworkCredential("postmaster@ dominio.tld", "***parola d'ordine***") "indicando i dati necessari (nome utente e password) per l'autorizzazione sul server SMTP SmtpMail.Send(smtpMssg) "invio di un messaggio %>Esiste anche una classe SmtpMail deprecata (e deprecata) (che utilizza lo spazio dei nomi System.Web.Mail). Di seguito è riportato un esempio del suo utilizzo per il linguaggio VisualBasic:
<% @Page Language="VB" Debug="true" %> <% @Import Namespace="System.Web" %> <% @Import Namespace="System.Web.Mail" %> <% Dim smtpMssg = new MailMessage " dichiarazione di un nuovo oggetto di tipo "MailMessage" smtpMssg.From = "Nome_mittenteCome inviare e-mail utilizzando ASP?
Tieni presente che quando si utilizza il nostro server SMTP è richiesta l'autorizzazione, quindi non dimenticare di aggiungere i dettagli di accesso appropriati allo script, ad esempio:
<% 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@dominio.tld" .Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "password" .Update End With Set cdoMessage = CreateObject("CDO.Message") With cdoMessage Set .Configuration = iConfig .From = "Utente di provaAlcuni CMS dispongono già di strumenti integrati per l’invio della corrispondenza o di moduli corrispondenti. Vediamo quelli più diffusi;
WordPress
Per questo CMS esiste un modulo speciale “WP Mail SMTP”, un esempio della sua configurazione è descritto nella pagina del modulo.
Prestare attenzione all'illustrazione nell'esempio; nel nostro sistema di posta è necessario utilizzare la porta 25 e la crittografia SSL non è richiesta.
Joomla
Nel pannello di amministrazione, vai alla sezione "Impostazioni generali", seleziona la scheda "Server". Nel campo "Posta", è necessario selezionare il metodo di invio come "server SMTP", nei campi "Indirizzo server SMTP" e "Login SMTP" e "Password SMTP" specificare i dettagli appropriati del sistema di posta, ad esempio: smtp.sito, box@tuo_dominio e corrispondente parola d'ordine.
Drupal
Questo CMS dispone anche di un proprio modulo per lavorare con un server SMTP, basato su PHPMailer. Puoi scaricare questo modulo dalla sua pagina sul sito web CMS Drupal; una descrizione dell'installazione del modulo è disponibile nell'archivio insieme ad esso.
NetCat
Questo CMS non dispone di funzioni integrate per lavorare con un server SMTP. Per inviare posta utilizzando gli script del sito, possiamo offrire di utilizzare la nostra soluzione per collegarlo, è necessario eseguire i seguenti passaggi:
- Scarica un archivio con i file necessari dal nostro sito Web ( send_auth_mail.php E mail.inc.php) e decomprimerlo sul tuo computer;
Modifica file send_auth_mail.php dall'archivio, indicando in esso i dettagli della connessione al server SMTP desiderato:
- $mail_smtpServer = "smtp.sito"; (Indirizzo del server SMTP)
- $porta_posta = "25" ; (porta di connessione)
- $nome_utente_mail = "[e-mail protetta]" ; (nome utente per l'autorizzazione sul server SMTP)
- $password_e-mail = "Parola d'ordine"; (password per l'autorizzazione sul server SMTP)
- Creare una copia di backup del file dominio.tld/www/netcat/admin/mail.inc.php;
- scaricare files send_auth_mail.php E mail.inc.php al sito virtuale nella directory dominio.tld/www/netcat/admin/
dominio.tld dovrebbe essere sostituito con il tuo nome di dominio.
La soluzione proposta funziona con tutti i moduli NetCat che utilizzano le funzioni standard di questo CMS per inviare posta.
Per molto tempo stavo cercando una soluzione per inviare lettere agli utenti non tramite la funzione mail() in PHP, ma tramite server di posta SMTP. Su Internet non si trovano molte informazioni diverse e ciò che è disponibile non funziona del tutto correttamente o non funziona affatto. Pertanto, ho messo tutto insieme e ho scritto il mio codice, basato su quelli già pronti presentati sui siti.
Perché inviare tramite SMTP e non tramite posta()
La mia risposta è abbastanza semplice: per qualche tempo i virus hanno inviato tonnellate di lettere attraverso il mio server, il che ha portato il mio indirizzo IP a essere BANNATO da molti mailer, in particolare gmail.com, e in relazione a ciò, gli utenti potevano ricevere lettere, quindi io ho dovuto cercare un'alternativa e l'ho trovata: questo è SMTP
Potresti essere interessato al motivo per cui la mia sceneggiatura è migliore di altre che sono in giro allo scoperto?! risponderò
- Funziona con Yandex, Rambler, Mail (gmail non ha potuto vincere)
- Codice chiaro. Per configurarlo basta modificare poche righe
- Invia e-mail in formato HTML
Ecco i vantaggi della mia sceneggiatura, che non ho trovato da nessuna parte su Internet, ma da ognuna ho preso tutto ciò di cui avevo bisogno. Quindi, diamo un'occhiata al codice.
Funzione smtpmail($mail_to, $oggetto, $messaggio, $servizio="yandex") ( $config["smtp_charset"] = "windows-1251"; //codifica messaggio. (o UTF-8, ecc.) $config [ "smtp_from"] = "mashintop.ru"; //Il tuo nome - o il nome del tuo sito verrà mostrato nel campo "Da" quando viene letto $config["smtp_debug"] = false; per visualizzare i messaggi di errore, specifica true invece di false $config["smtp_port"] = "25" // Non modificare la porta di lavoro se non sei sicuro ru"; $config["smtp_email"] = " [e-mail protetta]"; $config["smtp_username"] = "mashintop"; //Cambia il nome della tua casella di posta. $config["smtp_host"] = "smtp.yandex.ru"; //server per l'invio della posta $config[" smtp_password "] = "moi_parol"; //Cambia la password ) elseif($service=="rambler") ( $config["smtp_searcher"] = "rambler.ru"; $config["smtp_email"] = " [e-mail protetta]"; $config["smtp_username"] = "mashintop"; //Cambia il nome della tua casella di posta. $config["smtp_host"] = "smtp.rambler.ru"; //server per l'invio della posta $config[" smtp_password "] = "moi_parol"; //Cambia la password ) elseif($service=="mail") ( $config["smtp_searcher"] = "mail.ru"; $config["smtp_email"] = " [e-mail protetta]"; $config["smtp_username"] = "mashintop"; //Cambia il nome della tua casella di posta. $config["smtp_host"] = "smtp.mail.ru"; //server per l'invio della posta $config[" smtp_password "] = "moi_parol"; //Cambia password ) elseif($service=="gmail") ( $config["smtp_searcher"] = "gmail.com"; $config["smtp_email"] = " [e-mail protetta]"; $config["smtp_username"] = "alexeybertram"; //Cambia il nome della tua casella di posta. $config["smtp_host"] = "smtp.gmail.com"; //server per l'invio della posta $config[" smtp_password "] = "moi_parol"; //Cambia password ) $header="Data: ".date("D, j M Y G:i:s")." +0700rn"; $header.="Da: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode("".$config[" smtp_from"]."")))."?=<".$config["smtp_email"].">rn"; $header.="X-Mailer: Il pipistrello! (v3.99.3) Professionalrn"; $header.="Rispondi a: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode(" ".$config["smtp_from"]."")))."?=<".$config["smtp_email"].">rn"; $header.="Priorità X: 3 (Normale)rn"; $header.="ID messaggio:<172562218.".date("YmjHis")."@".$config["smtp_searcher"].">rn"; $header.="A: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode("")))."? =<$mail_to>rn"; $header.="Oggetto: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode("".$subject."" )))."?=rn"; $header.="Versione MIME: 1.0rn"; $header.="Tipo di contenuto: text/html; charset=windows-1251rn"; $header.="Codifica trasferimento contenuto: 8bitrn"; $smtp_conn = fsockopen("".$config["smtp_host"].", $config["smtp_port"],$errno , $errstr, 10); if(!$smtp_conn) (print "connessione dai server non riuscita"; 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) (stampa "Errore saluto EHLO"; fclose($smtp_conn) ; exit;) fputs($smtp_conn,"AUTH LOGINrn"); $code = substr(get_data($smtp_conn),0,3000 if($code != 334) (print "il server non ha consentito l'avvio dell'autorizzazione"; fclose ($smtp_conn); esci;) fputs($smtp_conn,base64_encode("".$config["smtp_username"]."")."rn"); $code = substr(get_data($smtp_conn),0,3000 ) ; if($code != 334) (print "errore durante l'accesso a questo utente"; fclose($smtp_conn); exit;) fputs($smtp_conn,base64_encode("".$config["smtp_password"].""). "rn"); $codice = substr(get_data($smtp_conn),0,3000 if($codice!= 235) (stampa "password errata"; fclose($smtp_conn); exit;) fputs($smtp_conn,"MAIL DA:".$config["smtp_email"]."rn"); $codice = substr(get_data($smtp_conn),0.3000); if($code != 250) (print "il server ha rifiutato il comando MAIL FROM"; fclose($smtp_conn); exit;) fputs($smtp_conn,"RCPT TO:".$mail_to."rn"); $codice = substr(get_data($smtp_conn),0.3000); if($code != 250 AND $code != 251) (print "Il server non ha accettato il comando RCPT TO"; fclose($smtp_conn); exit;) fputs($smtp_conn,"DATArn"); $codice = substr(get_data($smtp_conn),0.3000); if($code != 354) (print "il server non ha accettato i DATI"; fclose($smtp_conn); exit;) fputs($smtp_conn,$header."rn".$message."rn.rn"); $codice = substr(get_data($smtp_conn),0.3000); if($code != 250) (print "errore nell'invio della lettera"; fclose($smtp_conn); exit;) fputs($smtp_conn,"QUITrn"); fclose($smtp_conn); ) funzione get_data($smtp_conn) ( $data=""; while($str = fgets($smtp_conn,515)) ( $data .= $str; if(substr($str,3,1) == " " ) ( break; ) ) return $dati; ) $testo_email = "
Hai appena aggiunto un annuncio sul sito mashintop.ru. Puoi vederlo quiLa tua chiave: ".$key."
Usando questa chiave puoi gestire il tuo annuncio.
"; $testo_email .= " "; smtpmail(" [e-mail protetta]", "La chiave dell'annuncio su mashintop.ru", $text_email, "yandex"); //usa Yandex smtpmail(" [e-mail protetta]", "La chiave per l'annuncio su mashintop.ru", $text_email, "mail"); //usa l'e-mail smtpmail(" [e-mail protetta]", "La chiave per l'annuncio su mashintop.ru", $text_email, "rambler"); //usa rambler smtpmail(" [e-mail protetta]", "La chiave per la pubblicità su mashintop.ru", $text_email, "gmail"); // ma Gmail non funziona :(
Questo è tutto, lo script finito è nelle tue mani, basta copiarlo, modificare i valori dell'array $config e tutto funzionerà bene.
Vediamo ora alcuni elementi su cui vorrei soffermarmi.
Ad esempio, l'errore che riceviamo quando proviamo a inviare tramite SMTP a Google. Inizialmente vediamo questo testo di errore:
Per vedere qualcosa di più specifico, modifichiamo leggermente il codice
Fputs($smtp_conn,"AUTO LOGINrn"); $codice = substr(get_data($smtp_conn),0.3000); echo $codice; if($code != 334) (print "il server non ha consentito l'autorizzazione per iniziare"; fclose($smtp_conn); exit;)
E alla fine otteniamo un errore molto specifico
530 5.7.0 È necessario prima emettere un comando STARTTLS. x4sm16408296lbn.2 - gsmtp
Non so cosa significhi esattamente, ma credo che abbia qualcosa a che fare con una connessione sicura e non protetta. Non so ancora come sbarazzarmene, quindi Gmail rimane imbattuto al momento.
2019-08-05
Ciao, caro visitatore!
Perdonatemi il ritardo nell'aggiornamento del blog. Ma c'è una spiegazione del tutto comprensibile per questo. Dopotutto era l'estate, la dacia, gli ospiti, il bosco, l'acqua e molto altro, che non mi permetteva di affrontare i problemi della creazione di un sito web. Ma ora mi sono liberato un po', gli ospiti se ne sono andati, e penso che ora potrò sicuramente prestare la dovuta attenzione a questo.
Quindi, dopo che nello scorso articolo abbiamo collegato la posta del nostro dominio ad uno dei servizi di posta, ora vediamo come è possibile inviare email dal sito. Inoltre, in modo tale che le nostre lettere non finiscano nello SPAM, ma vengano consegnate in modo affidabile e con un alto grado di probabilità ai nostri destinatari.
In generale, esiste una funzione mail() integrata per inviare lettere in PHP. Ma va notato che nonostante la semplicità di questo metodo (in questo caso per inviare lettere è sufficiente specificare una sola riga di codice con determinati parametri), l'utilizzo di questa opzione presenta un notevole inconveniente legato al problema dello SPAM .
Il fatto è che i filtri anti-SPAM dei server di posta dal lato del destinatario non favoriscono realmente le lettere inviate tramite la funzione mail(). E nella maggior parte dei casi, tali messaggi vengono filtrati o addirittura cancellati prima di raggiungere il destinatario.
E per eliminare il più possibile tali casi, di solito viene utilizzata un'altra opzione, in cui le lettere vengono inviate come se ciò fosse effettuato da un servizio di posta di terze parti.
Questo metodo è chiamato invio di posta tramite SMTP con autorizzazione. Che esamineremo oggi utilizzando l'esempio dell'invio di un modulo di feedback. Inoltre, per questo utilizzeremo la libreria PHPMailer, abbastanza nota e popolare, che consente di organizzare in modo molto semplice l'invio di lettere tramite SMTP.
- Come invieremo le lettere di feedback
- Creazione di un modulo di feedback
- Installazione della libreria PHPMailer
- Creiamo uno script per l'invio di posta tramite SMTP
- Controllo dell'invio di e-mail
- File di origine del sito
Come invieremo le lettere di feedback
Prima di iniziare il lavoro pratico relativo all'invio di lettere di feedback, decidiamo innanzitutto come lo faremo.
Il modulo di feedback è progettato per consentire all'utente di comunicare con l'amministratore del sito per trasmettere il suo messaggio. In genere, questo modulo è composto da diversi campi e un pulsante "Invia".
In linea di principio per inviare una email è sufficiente utilizzare solo pochi campi che forniscano informazioni sufficienti sull’utente e sul contenuto del messaggio, come ad esempio:
- "Nome" - per inserire il nome del mittente del messaggio;
- "E-mail" - per l'indirizzo e-mail del mittente;
- "Soggetto del messaggio";
- "Messaggio di testo".
Anche se puoi aggiungerne altri. Ad esempio, un numero di telefono, se è veramente necessario.
Nel nostro caso tali lettere verranno inviate all'indirizzo dell'amministratore del sito da una vera e propria casella di posta con autorizzazione sul servizio di posta a cui è collegato il nostro dominio.
Poiché nell'articolo precedente ci siamo concentrati sulla verifica della connessione della posta del dominio al servizio Yandex.Mail, invieremo la posta per questa opzione. Anche se questo non è importante. Di seguito vedrai quelle opzioni che, una volta modificate, ti permetteranno di inviare e-mail tramite il server di posta Mail.ru.
Come vera e propria casella di posta da cui verranno inviate le lettere, utilizzeremo l'account di un utente di posta del dominio appena creato, diciamo con l'indirizzo [e-mail protetta]. E invieremo queste lettere alla casella di posta dell'amministratore [e-mail protetta], che abbiamo precedentemente creato nell'articolo precedente.
Pertanto, il mittente della lettera dal modulo di feedback sarà la casella di posta [e-mail protetta]., e il destinatario - [e-mail protetta]. In questo caso, tutte le informazioni sull'utente che ha inviato il messaggio con il suo contenuto verranno trasmesse nel corpo della lettera inviata.
Creazione di un modulo di feedback
Dopo aver deciso la procedura per l'invio delle lettere, creeremo ora un modulo di feedback con il quale lo faremo.
Di seguito è riportato il codice HTML per questo modulo, che inseriremo nella pagina "Contatti" (file kontakty.php nella directory articoli).