html phpmailer - La funzione di posta PHP non completa l'invio di e-mail




aruba smtp (21)

<?php
    $name = $_POST['name'];
    $email = $_POST['email'];
    $message = $_POST['message'];
    $from = 'From: yoursite.com'; 
    $to = '[email protected]'; 
    $subject = 'Customer Inquiry';
    $body = "From: $name\n E-Mail: $email\n Message:\n $message";

    if ($_POST['submit']) {
        if (mail ($to, $subject, $body, $from)) { 
            echo '<p>Your message has been sent!</p>';
        } else { 
            echo '<p>Something went wrong, go back and try again!</p>'; 
        }
    }
?>

Ho provato a creare un semplice modulo di posta. Il modulo stesso si trova nella mia pagina index.html , ma viene inviato in una pagina separata "grazie per la presentazione", thankyou.php , in cui è incorporato il codice php sopra. Il codice si presenta perfettamente, ma non invia mai un'email. per favore aiuto.


Answers

Per chi lo trova in futuro non raccomanderei l'uso della mail . Ci sono alcune risposte che riguardano questo, ma non il perché .

La funzione di mail di PHP non è solo opaca, si basa interamente su qualsiasi MTA utilizzato (ad esempio Sendmail) per eseguire il lavoro. mail ti dirà SOLO se il MTA non è riuscito ad accettarlo (ad esempio Sendmail era giù quando hai provato a inviare). Non può dirti se la posta è andata a buon fine perché è stata consegnata. In quanto tale (come i dettagli della risposta di John Conde), ora puoi giocherellare con i registri del MTA e spero che ti dica abbastanza sull'incapacità di risolverlo. Se sei su un host condiviso o non hai accesso ai registri MTA, sei sfortunato. Purtroppo, il default per la maggior parte delle installazioni di vanilla per Linux lo gestisce in questo modo.

Una libreria di posta ( PHPMailer , Zend Framework 2+, ecc.) PHPMailer qualcosa di molto diverso dalla mail . Quello che fanno è aprire un socket direttamente sul server di posta ricevente e quindi inviare i comandi di posta SMTP direttamente su quel socket. In altre parole, la classe agisce come un proprio MTA (si noti che si può dire alle librerie di usare la mail per inviare la posta in ultima analisi, ma mi raccomando vivamente di non farlo).

Ciò significa che è possibile visualizzare direttamente le risposte dal server ricevente (in PHPMailer, ad esempio, è possibile attivare l'output di debug ). Non più indovinare se una mail non è riuscita a inviare o perché.

Se stai usando SMTP (cioè stai chiamando isSMTP() ), puoi ottenere una trascrizione dettagliata della conversazione SMTP usando la proprietà SMTPDebug .

Imposta questa opzione includendo una riga come questa nel tuo script:

$mail->SMTPDebug = 2;

Ottieni anche il vantaggio di un'interfaccia migliore. Con la mail devi impostare tutte le tue intestazioni, allegati, ecc. Con una biblioteca, hai una funzione dedicata per farlo. Significa anche che la funzione sta facendo tutte le parti più complicate (come le intestazioni).


Se si sta eseguendo questo codice su un server locale (ad es. Il computer per scopi di sviluppo) non invierà l'e-mail al destinatario. Quello che succederà è che creerà un .txtfile in una cartella chiamata mailoutput.

Nel caso in cui si utilizzi un servizio di hosing gratuito come 000webhosto hostinger, tali fornitori di servizi disabilitano la mail()funzione per prevenire usi involontari di spoofing, spamming, ecc. Preferisco che li contatti per vedere se supportano questa funzionalità.

Se sei sicuro che il fornitore di servizi supporta la funzione mail (), puoi controllare questo manuale PHP per ulteriori riferimenti, PHP mail ()

Per controllare il tempo che il tuo servizio di hosting supporta la funzione mail (), prova a eseguire questo codice, (Ricorda di cambiare l'indirizzo email del destinatario)

<?php
    $to      = '[email protected]';
    $subject = 'the subject';
    $message = 'hello';
    $headers = 'From: [email protected]' . "\r\n" .
        'Reply-To: [email protected]' . "\r\n" .
        'X-Mailer: PHP/' . phpversion();

    mail($to, $subject, $message, $headers);
?>

Spero che questo abbia aiutato.


stai usando la configurazione SMTP per inviare la tua email? prova invece a usare phpmailer. è possibile scaricare la libreria da PHPMailer . ho creato la mia email inviando in questo modo:

function send_mail($email, $recipient_name, $message='')
{
    require("phpmailer/class.phpmailer.php");

    $mail = new PHPMailer();

    $mail->CharSet="utf-8";
    $mail->IsSMTP();                                      // set mailer to use SMTP
    $mail->Host = "mail.example.com";  // specify main and backup server
    $mail->SMTPAuth = true;     // turn on SMTP authentication
    $mail->Username = "myusername";  // SMTP username
    $mail->Password = "[email protected]"; // SMTP password

    $mail->From = "[email protected]";
    $mail->FromName = "System-Ad";
    $mail->AddAddress($email, $recipient_name);

    $mail->WordWrap = 50;                                 // set word wrap to 50 characters
    $mail->IsHTML(true);                                  // set email format to HTML (true) or plain text (false)

    $mail->Subject = "This is a Sampleenter code here Email";
    $mail->Body    = $message;
    $mail->AltBody = "This is the body in plain text for non-HTML mail clients";    
    $mail->AddEmbeddedImage('images/logo.png', 'logo', 'logo.png');
    $mail->addAttachment('files/file.xlsx');

    if(!$mail->Send())
    {
       echo "Message could not be sent. <p>";
       echo "Mailer Error: " . $mail->ErrorInfo;
       exit;
    }

    echo "Message has been sent";
}

Prova questo

<?php
$to = "[email protected], [email protected]";
$subject = "HTML email";

$message = "
    <html>
    <head>
       <title>HTML email</title>
    </head>
    <body>
      <p>This email contains HTML Tags!</p>
      <table>
        <tr>
         <th>Firstname</th>
         <th>Lastname</th>
        </tr>
        <tr>
          <td>John</td>
          <td>Doe</td>
        </tr>
      </table>
    </body>
    </html>";

// Always set content-type when sending HTML email
$headers = "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-type:text/html;charset=UTF-8" . "\r\n";

// More headers
$headers .= 'From: <[email protected]>' . "\r\n";
$headers .= 'Cc: [email protected]' . "\r\n";

mail($to,$subject,$message,$headers);
?> 

Assicurati di aver installato Sendmail sul tuo server.

Se hai controllato il tuo codice e verificato che non c'è niente di sbagliato, vai su / var / mail e controlla se quella cartella è vuota.

Se è vuoto, dovrai fare un:

sudo apt-get install sendmail

se sei su un server Ubuntu.


ha funzionato per me su 000webhost facendo quanto segue:

$headers  = "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-type: text/html; charset=iso-8859-1" . "\r\n";
$headers .= "From: ". $from. "\r\n";
$headers .= "Reply-To: ". $from. "\r\n";
$headers .= "X-Mailer: PHP/" . phpversion();
$headers .= "X-Priority: 1" . "\r\n"; 

Inserisci direttamente l'indirizzo email quando invii l'email

mail('[email protected]', $subject, $message, $headers)

Usa '' e non ""

Questo codice funziona ma l'email è stata ricevuta con un ritardo di mezz'ora


Per coloro che non vogliono usare mailer esterni e vogliono mail () su un server Linux dedicato.

Il modo, come mail php, è descritto in php.ini nella sezione [mail function] . Parametro sendmail-path descrive come viene chiamato sendmail. Il valore predefinito è sendmail -t -i , quindi se si lavora su sendmail -t -i < message.txt in linux console - si sarà fatto. È anche possibile aggiungere mail.log per eseguire il debug e assicurarsi che mail () sia realmente chiamato.

Diversi MTA possono implementare sendmail , semplicemente creano un collegamento simbolico ai loro binari con quel nome. Ad esempio, in Debian default è postfix. Configura il tuo MTA per inviare posta e provarlo dalla console con sendmail -v -t -i < message.txt . Il file message.txt dovrebbe contenere tutte le intestazioni di un messaggio e un corpo, e l'indirizzo di destinazione per la busta verrà preso da To: header. Esempio:

From: [email protected]
To: [email protected]
Subject: Test mail via sendmail.

Text body.

Preferisco usare ssmtp come MTA perché è semplice e non richiede il demone in esecuzione con porte aperte. ssmtp si adatta solo per l'invio di posta dall'host locale, ma può anche inviare email autenticate tramite il proprio account su un servizio di posta pubblica. Installa ssmtp e modifica config /etc/ssmtp/ssmtp.conf . Per essere in grado anche di ricevere la posta del sistema locale per unire gli account (ad esempio, gli avvisi di root da processi cron, configurare il /etc/ssmtp/revaliases .

Ecco la mia configurazione per il mio account sulla posta Yandex:

[email protected]
mailhub=smtp.yandex.ru:465
FromLineOverride=YES
UseTLS=YES
[email protected]
AuthPass=password

Puoi usare email di configurazione da codeigniter, ad esempio usando smtp (modo semplice):

$config = Array(
        'protocol' => 'smtp',
        'smtp_host' => 'mail.domain.com', //your smtp host
        'smtp_port' => 26, //default port smtp
        'smtp_user' => '[email protected]',
        'smtp_pass' => 'password',
        'mailtype' => 'html',
        'charset' => 'iso-8859-1',
        'wordwrap' => TRUE
);
$message = 'Your msg';
$this->load->library('email', $config);
$this->email->from('[email protected]', 'Title');
$this->email->to('[email protected]');
$this->email->subject('Header');
$this->email->message($message);

if($this->email->send()) 
{
   //conditional true
}

Funziona per me!


$name = $_POST['name'];
$email = $_POST['email'];
$reciver = '/* Reciver Email address */';
if (filter_var($reciver, FILTER_VALIDATE_EMAIL)) {
    $subject = $name;
    // To send HTML mail, the Content-type header must be set.
    $headers = 'MIME-Version: 1.0' . "\r\n";
    $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
    $headers .= 'From:' . $email. "\r\n"; // Sender's Email
    //$headers .= 'Cc:' . $email. "\r\n"; // Carbon copy to Sender
    $template = '<div style="padding:50px; color:white;">Hello ,<br/>'
        . '<br/><br/>'
        . 'Name:' .$name.'<br/>'
        . 'Email:' .$email.'<br/>'
        . '<br/>'
        . '</div>';
    $sendmessage = "<div style=\"background-color:#7E7E7E; color:white;\">" . $template . "</div>";
    // Message lines should not exceed 70 characters (PHP rule), so wrap it.
    $sendmessage = wordwrap($sendmessage, 70);
    // Send mail by PHP Mail Function.
    mail($reciver, $subject, $sendmessage, $headers);
    echo "Your Query has been received, We will contact you soon.";
} else {
    echo "<span>* invalid email *</span>";
}

Per lo più la funzione mail() è disabilitata nell'hosting condiviso. Un'opzione migliore è usare SMTP. L'opzione migliore sarebbe Gmail o SendGrid.

SMTPconfig.php

<?php 
    $SmtpServer="smtp.*.*";
    $SmtpPort="2525"; //default
    $SmtpUser="***";
    $SmtpPass="***";
?>

SMTPmail.php

<?php
class SMTPClient
{

    function SMTPClient ($SmtpServer, $SmtpPort, $SmtpUser, $SmtpPass, $from, $to, $subject, $body)
    {

        $this->SmtpServer = $SmtpServer;
        $this->SmtpUser = base64_encode ($SmtpUser);
        $this->SmtpPass = base64_encode ($SmtpPass);
        $this->from = $from;
        $this->to = $to;
        $this->subject = $subject;
        $this->body = $body;

        if ($SmtpPort == "") 
        {
            $this->PortSMTP = 25;
        }
        else
        {
            $this->PortSMTP = $SmtpPort;
        }
    }

    function SendMail ()
    {
        $newLine = "\r\n";
        $headers = "MIME-Version: 1.0" . $newLine;  
        $headers .= "Content-type: text/html; charset=iso-8859-1" . $newLine;  

        if ($SMTPIN = fsockopen ($this->SmtpServer, $this->PortSMTP)) 
        {
            fputs ($SMTPIN, "EHLO ".$HTTP_HOST."\r\n"); 
            $talk["hello"] = fgets ( $SMTPIN, 1024 ); 
            fputs($SMTPIN, "auth login\r\n");
            $talk["res"]=fgets($SMTPIN,1024);
            fputs($SMTPIN, $this->SmtpUser."\r\n");
            $talk["user"]=fgets($SMTPIN,1024);
            fputs($SMTPIN, $this->SmtpPass."\r\n");
            $talk["pass"]=fgets($SMTPIN,256);
            fputs ($SMTPIN, "MAIL FROM: <".$this->from.">\r\n"); 
            $talk["From"] = fgets ( $SMTPIN, 1024 ); 
            fputs ($SMTPIN, "RCPT TO: <".$this->to.">\r\n"); 
            $talk["To"] = fgets ($SMTPIN, 1024); 
            fputs($SMTPIN, "DATA\r\n");
            $talk["data"]=fgets( $SMTPIN,1024 );
            fputs($SMTPIN, "To: <".$this->to.">\r\nFrom: <".$this->from.">\r\n".$headers."\n\nSubject:".$this->subject."\r\n\r\n\r\n".$this->body."\r\n.\r\n");
            $talk["send"]=fgets($SMTPIN,256);
            //CLOSE CONNECTION AND EXIT ... 
            fputs ($SMTPIN, "QUIT\r\n"); 
            fclose($SMTPIN); 
            // 
        } 
        return $talk;
    } 
}
?>

contact_email.php

<?php 
include('SMTPconfig.php');
include('SMTPmail.php');
if($_SERVER["REQUEST_METHOD"] == "POST")
{
    $to = "";
    $from = $_POST['email'];
    $subject = "Enquiry";
    $body = $_POST['name'].'</br>'.$_POST['companyName'].'</br>'.$_POST['tel'].'</br>'.'<hr />'.$_POST['message'];
    $SMTPMail = new SMTPClient ($SmtpServer, $SmtpPort, $SmtpUser, $SmtpPass, $from, $to, $subject, $body);
    $SMTPChat = $SMTPMail->SendMail();
}
?>

Aggiungi intestazione posta nella funzione di posta

$header = "From: [email protected]\r\n"; 
$header.= "MIME-Version: 1.0\r\n"; 
$header.= "Content-Type: text/html; charset=ISO-8859-1\r\n"; 
$header.= "X-Priority: 1\r\n"; 

$status = mail($to, $subject, $message, $header);

if($status)
{ 
    echo '<p>Your mail has been sent!</p>';
} else { 
    echo '<p>Something went wrong, Please try again!</p>'; 
}

Penso che questo dovrebbe fare il trucco. Ho appena aggiunto un if(isset e aggiunto concatenazione alle variabili nel corpo per separare PHP da HTML.

<?php
    $name = $_POST['name'];
    $email = $_POST['email'];
    $message = $_POST['message'];
    $from = 'From: yoursite.com'; 
    $to = '[email protected]'; 
    $subject = 'Customer Inquiry';
    $body = "From:" .$name."\r\n E-Mail:" .$email."\r\n Message:\r\n" .$message;

if (isset($_POST['submit'])) 
{
    if (mail ($to, $subject, $body, $from)) 
    { 
        echo '<p>Your message has been sent!</p>';
    } 
    else 
    { 
        echo '<p>Something went wrong, go back and try again!</p>'; 
    }
}

?>

Prova questo

if ($_POST['submit']) {
    $success= mail($to, $subject, $body, $from);
    if($success)
    { 
        echo '
        <p>Your message has been sent!</p>
        ';
    } else { 
        echo '
        <p>Something went wrong, go back and try again!</p>
        '; 
    }
}

Puoi usare libmail: http://lwest.free.fr/doc/php/lib/index.php3?page=mail&lang=en

include "libmail.php";
$m = new Mail(); // create the mail
$m->From( $_POST['form'] );
$m->To( $_POST['to'] );
$m->Subject( $_POST['subject'] );
$m->Body( $_POST['body'] );
$m->Cc( $_POST['cc']);
$m->Priority(4);
//  attach a file of type image/gif to be displayed in the message if possible
$m->Attach( "/home/leo/toto.gif", "image/gif", "inline" );
$m->Send(); // send the mail
echo "Mail was sent:"
echo $m->Get(); // show the mail source

Se si utilizza solo la funzione mail() , è necessario completare il file di configurazione.

È necessario aprire l'espansione della posta e impostare SMTP smtp_port e così via e, soprattutto, nome utente e password. Senza di ciò, la posta non può essere inviata. Inoltre, puoi utilizzare la classe PHPMail da inviare.


Aggiungi alcune intestazioni prima di inviare la posta:

<?php 
$name = $_POST['name'];
$email = $_POST['email'];
$message = $_POST['message'];
$from = 'From: yoursite.com'; 
$to = '[email protected]'; 
$subject = 'Customer Inquiry';
$body = "From: $name\n E-Mail: $email\n Message:\n $message";

$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/html\r\n";
$headers .= 'From: [email protected]' . "\r\n" .
'Reply-To: [email protected]' . "\r\n" .
'X-Mailer: PHP/' . phpversion();

mail($to, $subject, $message, $headers);

E un'altra cosa. La funzione mail() non funziona in localhost. Carica il tuo codice su un server e prova.


Prima di tutto,

Potresti avere molti parametri per la funzione mail () ... Sei in grado di avere 5 max. mail(to,subject,message,headers,parameters); Per quanto riguarda la variabile $from , questo dovrebbe venire automaticamente dal tuo webhost se stai usando Linux cPanel. Viene automaticamente dal tuo nome utente cPanel e indirizzo IP.

$name = $_POST['name'];
$email = $_POST['email'];
$message = $_POST['message'];
$from = 'From: yoursite.com'; 
$to = '[email protected]'; 
$subject = 'Customer Inquiry';
$body = "From: $name\n E-Mail: $email\n Message:\n $message";

Assicurati inoltre di avere l'ordine corretto di variabili nella tua funzione mail (). l' mail($to,$subject,$message,etc.)in questo ordine, altrimenti c'è la possibilità di non lavorare. Fammi sapere se questo aiuta ...


Sebbene ci siano parti di questa risposta che si applicano solo all'uso della funzione mail() , molte di queste procedure di risoluzione dei problemi possono essere applicate a qualsiasi sistema di mailing PHP.

Esistono diversi motivi per cui il tuo script sembra non inviare email. È difficile diagnosticare queste cose a meno che non ci sia un evidente errore di sintassi. Senza uno è necessario scorrere l'elenco di controllo qui sotto per trovare eventuali insidie ​​che si possono incontrare.

Assicurati che la segnalazione degli errori sia abilitata e impostata per segnalare tutti gli errori

La segnalazione degli errori è essenziale per eliminare i bug nel codice e gli errori generali incontrati da PHP. La segnalazione degli errori deve essere abilitata per ricevere questi errori. Inserendo il seguente codice nella parte superiore dei file PHP (o in un file di configurazione principale) si abilita la segnalazione degli errori.

error_reporting(-1);
ini_set('display_errors', 'On');
set_error_handler("var_dump");

Vedi questa risposta Overflow Stack per maggiori dettagli su questo.

Assicurati che la funzione mail() sia chiamata

Può sembrare sciocco, ma un errore comune è dimenticare di posizionare effettivamente la funzione mail() nel codice. Assicurati che sia lì e non commentato.

Assicurati che la funzione mail() sia chiamata correttamente

bool mail (stringa $ a, stringa $ oggetto, stringa $ messaggio [, stringa $ additional_headers [, stringa $ additional_parameters]]))

La funzione mail richiede tre parametri obbligatori e facoltativamente un quarto e un quinto. Se la tua chiamata a mail() non ha almeno tre parametri, fallirà.

Se la tua chiamata a mail() non ha i parametri corretti nell'ordine corretto, fallirà anche.

Controlla i log della posta del server

Il tuo server web dovrebbe registrare tutti i tentativi di inviare e-mail attraverso di esso. La posizione di questi registri varierà (potrebbe essere necessario chiedere all'amministratore del server dove si trovano), ma è possibile trovarli comunemente nella directory principale di un utente sotto i logs . All'interno verranno visualizzati i messaggi di errore che il server ha segnalato, se presenti, relativi ai tentativi di invio di e-mail.

Controllare l'errore di connessione della porta

Il blocco delle porte è un problema molto comune a cui la maggior parte degli sviluppatori si trova ad affrontare mentre integra il proprio codice per inviare e-mail tramite SMTP. E, questo può essere facilmente rintracciato nei maillog del server (la posizione del server del log della posta può variare da server a server, come spiegato sopra). Se si è su un server di hosting condiviso, le porte 25 e 587 rimangono bloccate per impostazione predefinita. Questo blocco è stato volutamente fatto dal tuo provider di hosting. Questo è vero anche per alcuni dei server dedicati. Quando queste porte sono bloccate, prova a connetterti usando la porta 2525. Se scopri che anche questa porta è bloccata, l'unica soluzione è contattare il tuo provider di hosting per sbloccare queste porte.

La maggior parte dei provider di hosting blocca queste porte e-mail per proteggere la propria rete dall'invio di e-mail di spam.

Utilizzare le porte 25 o 587 per le connessioni plain / TLS e la porta 465 per le connessioni SSL. Per la maggior parte degli utenti, si consiglia di utilizzare la porta 587 per evitare i limiti di velocità stabiliti da alcuni provider di hosting.

Non utilizzare l'operatore di soppressione degli errori

Quando l' operatore di soppressione degli errori @ è anteposto a un'espressione in PHP, qualsiasi messaggio di errore che potrebbe essere generato da tale espressione verrà ignorato. Ci sono circostanze in cui l'utilizzo di questo operatore è necessario ma l'invio della posta non è uno di questi.

Se il tuo codice contiene @mail(...) potresti nascondere dei messaggi di errore importanti che ti aiuteranno a eseguire il debug di questo. Rimuovi @ e verifica se sono stati segnalati errori.

È consigliabile solo quando si verifica con error_get_last() subito dopo per errori concreti.

Controlla il valore di ritorno mail()

La funzione mail() :

Restituisce TRUE se il messaggio è stato accettato con successo per la consegna, altrimenti FALSE . È importante notare che solo perché la posta è stata accettata per la consegna, NON significa che la posta raggiungerà effettivamente la destinazione prevista.

Questo è importante da notare perché:

  • Se ricevi un valore di ritorno FALSE , sai che l'errore si trova nel fatto che il tuo server accetta la tua posta. Questo probabilmente non è un problema di codifica ma un problema di configurazione del server. Devi parlare con il tuo amministratore di sistema per scoprire perché questo sta accadendo.
  • Se ricevi un valore di ritorno TRUE , ciò non significa che la tua email sarà sicuramente inviata. Significa solo che l'email è stata inviata al rispettivo gestore sul server con successo da PHP. Ci sono ancora più punti di errore al di fuori del controllo di PHP che possono causare l'invio dell'email.

Quindi FALSE ti aiuterà a orientarti nella giusta direzione, mentre TRUE non significa necessariamente che la tua email è stata inviata con successo. Questo è importante da notare!

Assicurati che il tuo provider di hosting ti consenta di inviare e-mail e non limiti l'invio di posta

Molti webhosts condivisi, in particolare i provider di web hosting gratuiti, non consentono l'invio di e-mail dai loro server o limitano l'importo che può essere inviato durante un determinato periodo di tempo. Ciò è dovuto ai loro sforzi per limitare gli spammer a trarre vantaggio dai loro servizi più economici.

Se ritieni che il tuo host abbia limiti di posta elettronica o blocchi l'invio di email, controlla le loro domande frequenti per vedere se elencano tali limiti. In caso contrario, potrebbe essere necessario contattare il loro supporto per verificare se ci sono restrizioni sull'invio di e-mail.

Controlla le cartelle spam; impedire che le e-mail vengano contrassegnate come spam

Spesso, per vari motivi, le e-mail inviate tramite PHP (e altri linguaggi di programmazione lato server) finiscono nella cartella spam di un destinatario. Controlla sempre lì prima di risolvere il tuo codice.

Per evitare che la posta inviata tramite PHP venga inviata alla cartella spam di un destinatario, ci sono varie cose che puoi fare, sia nel codice PHP che in altro modo, per ridurre al minimo le probabilità che le tue e-mail siano contrassegnate come spam. I buoni consigli di Michiel de Mare includono:

  • Utilizza i metodi di autenticazione della posta elettronica, come SPF e DKIM per dimostrare che le tue e-mail e il tuo nome di dominio appartengono insieme e per impedire lo spoofing del tuo nome di dominio. Il sito Web SPF include una procedura guidata per generare le informazioni DNS per il tuo sito.
  • Check tuo DNS inverso per assicurarti che l'indirizzo IP del tuo server di posta faccia riferimento al nome di dominio che usi per inviare la posta.
  • Assicurati che l'indirizzo IP che stai usando non sia su una lista nera
  • Assicurati che l'indirizzo di risposta sia valido, esistente.
  • Utilizza il nome completo e reale del destinatario nel campo A, non solo l'indirizzo email (ad es. "John Smith" <[email protected]> ).
  • Monitora i tuoi account di abuso, come [email protected] e [email protected] Ciò significa: assicurarsi che questi conti esistano, leggere ciò che viene loro inviato e agire in caso di reclami.
  • Infine, facilita l'annullamento dell'iscrizione. In caso contrario, i tuoi utenti annulleranno l'iscrizione premendo il pulsante " Spam" e ciò influirà sulla tua reputazione.

Vedi Come ci si assicura che l'e-mail che si invia a livello di programmazione non venga automaticamente contrassegnata come spam? per ulteriori informazioni su questo argomento.

Assicurati che tutte le intestazioni di posta siano fornite

Alcuni software spam rifiuteranno la posta se mancano intestazioni comuni come "Da" e "Rispondi a":

$headers = array("From: [email protected]",
    "Reply-To: [email protected]",
    "X-Mailer: PHP/" . PHP_VERSION
);
$headers = implode("\r\n", $headers);
mail($to, $subject, $message, $headers);

Assicurati che le intestazioni di posta non abbiano errori di sintassi

Le intestazioni non valide sono altrettanto negative di quelle senza intestazioni. Un carattere errato potrebbe essere tutto ciò che serve per far deragliare la tua e-mail. Ricontrolla per assicurarti che la tua sintassi sia corretta poiché PHP non prenderà questi errori per te.

$headers = array("From [email protected]", // missing colon
    "Reply To: [email protected]",      // missing hyphen
    "X-Mailer: "PHP"/" . PHP_VERSION      // bad quotes
);

Assicurarsi che il valore del destinatario sia corretto

A volte il problema è tanto semplice quanto avere un valore errato per il destinatario dell'e-mail. Questo può essere dovuto all'utilizzo di una variabile errata.

$to = '[email protected]';
// other variables ....
mail($recipient, $subject, $message, $headers); // $recipient should be $to

Un altro modo per testare questo è di codificare il valore del destinatario nella chiamata alla funzione mail() :

mail('[email protected]', $subject, $message, $headers); 

Questo può essere applicato a tutti i parametri mail() .

Invia a più account

Per evitare problemi con l'account di posta elettronica, invia la tua email a più account di posta elettronica presso diversi provider di posta elettronica . Se le tue e-mail non arrivano all'account Gmail di un utente, invia le stesse e-mail a un account Yahoo, a un account Hotmail ea un normale account POP3 (come l'account e-mail fornito dall'ISP).

Se le e-mail arrivano a tutti o ad alcuni degli altri account e-mail, sai che il tuo codice sta inviando email ma è probabile che il fornitore dell'account e-mail le blocchi per qualche motivo. Se l'e-mail non arriva a nessun account e-mail, è più probabile che il problema sia correlato al tuo codice.

Assicurati che il codice corrisponda al metodo del modulo

Se hai impostato il metodo del modulo su POST , assicurati di utilizzare $_POST per cercare i valori del modulo. Se lo hai impostato su GET o non l'hai affatto impostato, assicurati di utilizzare $_GET per cercare i valori del modulo.

Assicurati che il valore action modulo punti nella posizione corretta

Assicurati che il tuo attributo action form contenga un valore che punta al tuo codice di invio PHP.

<form action="send_email.php" method="POST">

Assicurarsi che l'host Web supporti l'invio di e-mail

Alcuni provider di hosting Web non consentono o consentono l'invio di e-mail attraverso i loro server. Le ragioni di ciò possono variare, ma se hanno disabilitato l'invio di posta, sarà necessario utilizzare un metodo alternativo che utilizza una terza parte per inviare tali e-mail.

Un'e-mail al supporto tecnico (dopo un viaggio al supporto online o alle domande frequenti) dovrebbe chiarire se le funzionalità di posta elettronica sono disponibili sul server.

Assicurarsi che il server di posta localhost sia configurato

Se si sta sviluppando sulla stazione di lavoro locale utilizzando WAMP, MAMP o XAMPP, un server di posta elettronica probabilmente non è installato sulla workstation. Senza uno, PHP non può inviare posta per impostazione predefinita.

È possibile superare questo problema installando un server di posta di base. Per Windows è possibile utilizzare la posta gratuita di Mercury .

Puoi anche usare SMTP per inviare le tue email. Guarda questa grande risposta di Vikas Dwivedi per imparare come farlo.

Abilita il mail.log personalizzato di mail.log

Oltre al file di registro di MTA e PHP, è possibile abilitare la registrazione per la funzione mail() modo specifico. Non registra l'interazione SMTP completa, ma almeno i parametri di chiamata della funzione e lo script di invocazione.

ini_set("mail.log", "/tmp/mail.log");
ini_set("mail.add_x_header", TRUE);

Vedi http://php.net/manual/en/mail.configuration.php per i dettagli. (È meglio abilitare queste opzioni nel php.ini o .user.ini o .htaccess forse.)

Verifica con un servizio di verifica della posta

Esistono vari servizi di controllo di consegna e di spamminess che è possibile utilizzare per testare la configurazione MTA / server web. In genere si invia un probe di posta A: il loro indirizzo, quindi ottenere un rapporto di consegna e più guasti concreti o analisi successive:

Usa un altro mailer

La funzione built-in mail() PHP è utile e spesso svolge il lavoro ma ha i suoi difetti . Fortunatamente ci sono alternative che offrono più potenza e flessibilità, compresa la gestione di molti dei problemi descritti sopra:

Tutto ciò può essere combinato con un server / fornitore di servizi SMTP professionale. (Poiché i tipici piani di hosting Web 08/15 sono imprevedibili quando si tratta di configurazione / configurabilità della posta elettronica).


Puoi usare le funzioni empty () ed isset (). Se si vuole farlo funzionare con diversi file, basta modificare il action='yourphp.php'per il codice HTML che ti sto dando, e store the PHP scripta quel yourphp.phpfile. Inoltre è necessario cambiare la vostra index.htmlin index.phpper attivare la funzionalità di PHP.

PHP

<?php

    error_reporting(0);
    $name = $_POST['name'];
    $email = $_POST['email'];
    $message = $_POST['message'];
    $from = 'From: yoursite.com'; 
    $to = '[email protected]'; 
    $subject = 'Customer Inquiry';
    $body = "From: $name\n E-Mail: $email\n Message:\n $message";


    if ($_POST['submit']){
                if (!(empty($_POST['name']))) {
                        if (!(empty($_POST['email']))){
                            if (!(empty($_POST['message']))){
                                mail ($to, $subject, $body, $from);
                                echo '<p>Your message has been sent!</p>';
                            }else{
                                echo '<p>Fill your message please.</p>';}
                        }else {
                            echo '<p>Fill your email please.</p>';}
                }else{
                    echo '<p>Fill your name please.</p>';}              
    }else{
            echo '<p>Fill the form.</p>';}
?>

HTML

<html>
    <form method="post" action="?">
        <table>
            <tr><td>Name</td><td><input type='text' name='name' id='name'/></td></tr>
            <tr><td>Email</td><td><input type='text' name='email' id='email'/></td></tr>
            <tr><td>Message</td><td><input type='text' name='message' id='message'/></td></tr>
            <tr><td></td><td><input type='submit' name='submit' id='submit'/></td></tr>
        </table>
    </form>
</html>

I migliori saluti!


Se hai problemi nell'invio di email con PHP, considera un'alternativa come PHPMailer o SwiftMailer .

Di solito uso SwiftMailer ogni volta che ho bisogno di inviare mail con PHP.

Utilizzo di base:

require 'mail/swift_required.php';

$message = Swift_Message::newInstance()
    // The subject of your email
    ->setSubject('Jane Doe sends you a message')
    // The from address(es)
    ->setFrom(array('[email protected]' => 'Jane Doe'))
    // The to address(es)
    ->setTo(array('[email protected]' => 'Frank Stevens'))
    // Here, you put the content of your email
    ->setBody('<h3>New message</h3><p>Here goes the rest of my message</p>', 'text/html');

if (Swift_Mailer::newInstance(Swift_MailTransport::newInstance())->send($message)) {
    echo json_encode([
        "status" => "OK",
        "message" => 'Your message has been sent!'
    ], JSON_PRETTY_PRINT);
} else {
    echo json_encode([
        "status" => "error",
        "message" => 'Oops! Something went wrong!'
    ], JSON_PRETTY_PRINT);
}

Vedi la documentazione ufficiale per maggiori informazioni su come usare SwiftMailer.


Forse non riesco a capire a fondo il motivo per cui pensi di doverlo fare, ma non credo che le ragioni che hai postato siano particolarmente convincenti.

  1. Non molte app Web sono vincolate alla CPU, quindi non credo che rimarrai colpito dall'aumento delle prestazioni. La compilazione del codice nativo non renderà il tuo I / O o DB in attesa più corto. Esistono modi migliori per ridimensionare un'app Web rispetto al passaggio a C ++ e la maggior parte di essi comporta la riduzione del tempo in cui lo script è in attesa di dati dal DB o dal disco (come ad esempio il DB o lo spostamento di dati in una cache RAM).

  2. Le dipendenze della libreria sono davvero un problema? Molte delle librerie più popolari sono ora fornite in bundle con il core PHP, più tutte quelle aggiuntive sono generalmente un gioco da ragazzi da installare. Una volta che li hai, non li tocchi, quindi non sono sicuro del motivo per cui questo è un motivo particolarmente convincente per passare al C ++.

  3. Questo è in realtà un motivo molto CATTIVO per passare a C ++. La maggior parte degli ambienti di hosting condiviso ti consente di eseguire script in un ambiente PHP, ma molto pochi a nessuno (a meno che tu non stia guardando un VPS) ti consentirà di eseguire un binario arbitrario come faresti con un'applicazione C ++. Esistono modi migliori per controllare la leggibilità della fonte in ambienti condivisi, come l'utilizzo corretto dei permessi dei file. Se sei preoccupato per i clienti che rubano il tuo codice PHP, beh, troppo male. Puoi provare a offuscare tutto ciò che desideri, ma in genere è inutile alla fine della giornata.

  4. Quali caratteristiche specifiche di C ++ hai così disperatamente bisogno che PHP non offra? Ad essere onesti, l'idea del tuo codificatore PHP medio che si morde con i puntatori e l'allocazione della memoria mi spaventa. Ci sono ottime strutture disponibili per PHP, e ti suggerisco di esaurire completamente tutte queste opzioni prima di passare a cambiare la lingua dell'intero codice base solo per alcune funzionalità che ti piacciono in particolare.

  5. Hai menzionato la compatibilità multipiattaforma nel tuo commento ... PHP lo farà onestamente più facilmente di C ++. L'implementazione di PHP è relativamente standardizzata su tutte le piattaforme (eccetto per alcune funzioni di livello inferiore) mentre probabilmente userete un compilatore e chiamate di sistema differenti in C ++.







php html email