PHP-mailfunctie voltooit het verzenden van e-mail niet

Ik heb geprobeerd een eenvoudig e-mailformulier te maken. Het formulier zelf staat op mijn index.html-pagina, maar het wordt verzonden naar een aparte “bedankt voor uw inzending”-pagina, thankyou.php, waar de bovenstaande PHP-code staat ingebed.
De code verzendt perfect, maar verzendt nooit een e-mail. Hoe kan ik dit oplossen?


Antwoord 1, autoriteit 100%

Hoewel er delen van dit antwoord zijn die alleen van toepassing zijn op het gebruik van de functie mail()zelf, kunnen veel van deze stappen voor probleemoplossing worden toegepast op elk PHP-mailingsysteem.

Er zijn verschillende redenen waarom uw script geen e-mails lijkt te verzenden. Het is moeilijk om deze dingen te diagnosticeren, tenzij er een duidelijke syntaxisfout is. Als je er geen hebt, moet je de onderstaande checklist doorlopen om mogelijke valkuilen te vinden die je tegen kunt komen.

Zorg ervoor dat foutrapportage is ingeschakeld en ingesteld om alle fouten te rapporteren

Foutrapportage is essentieel om bugs in uw code en algemene fouten die PHP tegenkomt op te sporen. Foutrapportage moet zijn ingeschakeld om deze fouten te ontvangen. Door de volgende code bovenaan uw PHP-bestanden (of in een hoofdconfiguratiebestand) te plaatsen, wordt foutrapportage mogelijk.

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

Zie Hoe krijg ik een nuttige foutmelding berichten in PHP?dit antwoordvoor meer informatie hierover.

Zorg ervoor dat de functie mail()wordt aangeroepen

Het lijkt misschien gek, maar een veel voorkomende fout is om te vergeten de functie mail()daadwerkelijk in uw code te plaatsen. Zorg ervoor dat het er is en dat er niet op gereageerd is.

Zorg ervoor dat de functie mail()correct wordt aangeroepen

bool mail ( string $to , string $subject , string $message [, string $additional_headers [, string $additional_parameters]] )

De mailfunctie heeft drie vereiste parameters en optioneel een vierde en vijfde. Als uw aanroep naar mail()niet ten minste drie parameters heeft, zal deze mislukken.

Als uw aanroep naar mail()niet de juiste parameters in de juiste volgorde heeft, zal deze ook mislukken.

Controleer de e-maillogboeken van de server

Uw webserver zou alle pogingen om er e-mails via te verzenden moeten loggen. De locatie van deze logboeken kan variëren (mogelijk moet u uw serverbeheerder vragen waar ze zich bevinden), maar ze kunnen gewoonlijk worden gevonden in de hoofdmap van een gebruiker onder logs. Binnenin zullen foutmeldingen zijn die de server heeft gerapporteerd, indien aanwezig, met betrekking tot uw pogingen om e-mails te verzenden.

Controleer op poortverbindingsfout

Poortblokkering is een veel voorkomend probleem waarmee de meeste ontwikkelaars worden geconfronteerd bij het integreren van hun code om e-mails te bezorgen met SMTP. En dit kan eenvoudig worden getraceerd op de server maillogs (de locatie van de server of maillog kan variëren van server tot server, zoals hierboven uitgelegd). Als je op een shared hosting server zit, blijven de poorten 25 en 587 standaard geblokkeerd. Deze blokkering is met opzet gedaan door je hostingprovider. Dit geldt zelfs voor sommige van de dedicated servers. Als deze poorten geblokkeerd zijn, probeer dan verbinding te maken via poort 2525. Als je merkt dat die poort ook geblokkeerd is, is de enige oplossing om contact op te nemen met je hostingprovider om deze poorten te deblokkeren.

De meeste hostingproviders blokkeren deze e-mailpoorten om hun netwerk te beschermen tegen het verzenden van spam-e-mails.

Gebruik poort 25 of 587 voor gewone/TLS-verbindingen en poort 465 voor SSL-verbindingen. Voor de meeste gebruikers wordt aangeraden poort 587 te gebruiken om snelheidslimieten te vermijden die door sommige hostingproviders zijn ingesteld.

Gebruik de foutonderdrukkingsoperator niet

Als de operator voor het onderdrukken van fouten@wordt toegevoegd aan een expressie in PHP, worden eventuele foutmeldingen die door die expressie worden gegenereerd, genegeerd. Er zijn omstandigheden waarin het gebruik van deze operator noodzakelijk is, maar het verzenden van e-mail is nieteen van hen.

Als uw code @mail(...)bevat, verbergt u mogelijk belangrijke foutmeldingen die u kunnen helpen dit op te lossen. Verwijder de @en kijk of er fouten zijn gemeld.

Het is alleen aan te raden wanneer u controleert met error_get_last()direct daarna voor concrete fouten.

Controleer de mail()retourwaarde

De mail()-functie :

Retourneert TRUEals de e-mail met succes is geaccepteerd voor bezorging, anders FALSE. Het is belangrijk op te merken dat alleen omdat de e-mail is geaccepteerd voor bezorging, dit NIET betekent dat de e-mail ook daadwerkelijk de beoogde bestemming zal bereiken.

Dit is belangrijk om op te merken omdat:

  • Als u een FALSEretourwaarde ontvangt, weet u dat de fout ligt bij het accepteren van uw e-mail door uw server. Dit is waarschijnlijk geen coderingsprobleem, maar een probleem met de serverconfiguratie. U moet met uw systeembeheerder praten om erachter te komen waarom dit gebeurt.
  • Als u een TRUEretourwaarde ontvangt, betekent dit niet dat uw e-mail zeker wordt verzonden. Het betekent alleen dat de e-mail door PHP met succes naar de respectieve handler op de server is verzonden. Er zijn nog meer storingspunten buiten de controle van PHP die ervoor kunnen zorgen dat de e-mail niet wordt verzonden.

Dus FALSEzal u in de goede richting helpen, terwijl TRUEnietnoodzakelijkerwijs betekent dat uw e-mail succesvol is verzonden. Dit is belangrijk om op te merken!

Zorg ervoor dat uw hostingprovider u toestaat e-mails te verzenden en het verzenden van e-mail niet beperkt

Veel gedeelde webhosts, vooral gratis webhostingproviders, staan het verzenden van e-mails vanaf hun servers niet toe of beperken het bedrag dat gedurende een bepaalde periode kan worden verzonden. Dit komt door hun inspanningen om te voorkomen dat spammers profiteren van hun goedkopere diensten.

Als je denkt dat je host e-maillimieten heeft of het verzenden van e-mails blokkeert, controleer dan hun veelgestelde vragen om te zien of ze dergelijke beperkingen bevatten. Anders moet u mogelijk contact opnemen met hun ondersteuning om te controleren of er beperkingen gelden voor het verzenden van e-mails.

Controleer spammappen; voorkomen dat e-mails als spam worden gemarkeerd

Vaak, om verschillende redenen, komen e-mails die via PHP (en andere programmeertalen aan de serverzijde) worden verzonden, in de spammap van een ontvanger terecht. Controleer daar altijd voordat u problemen met uw code oplost.

Om te voorkomen dat e-mail die via PHP wordt verzonden in de spammap van een ontvanger terechtkomt, zijn er verschillende dingen die u kunt doen, zowel in uw PHP-code als anderszins, om de kans te verkleinen dat uw e-mails als spam worden gemarkeerd. Goede tips van Michiel de Marezijn onder meer:

  • Gebruik e-mailverificatiemethoden, zoals SPFen DKIMom te bewijzen dat uw e-mails en uw domeinnaam bij elkaar horen en om spoofing van uw domeinnaam te voorkomen. De SPF-website bevat een wizard om de DNS-informatie voor uw site te genereren.
  • Controleeruw reverse DNSom ervoor te zorgen dat het IP-adres van uw mailserver verwijst naar de domeinnaam die u gebruikt voor het verzenden van e-mail.
  • Zorg ervoor dat het IP-adres dat u gebruikt niet op een zwarte lijst staat
  • Zorg ervoor dat het antwoordadres een geldig, bestaand adres is.
  • Gebruik de volledige, echte naam van de geadresseerde in het veld Aan, niet alleen het e-mailadres (bijv. "John Smith" <[email protected]>).
  • Bewaak uw misbruikaccounts, zoals [email protected] en [email protected]. Dat betekent: zorg ervoor dat deze accounts bestaan, lees wat er naar hen is verzonden en reageer op klachten.
  • Maak het tot slot echtgemakkelijk om je af te melden. Anders zullen uw gebruikers zich afmelden door op de knop spamte drukken, en dat heeft invloed op uw reputatie.

Zie Hoe zorgt u ervoor dat e-mail die u programmatisch verzendt niet automatisch wordt gemarkeerd als spam?voor meer informatie over dit onderwerp.

Zorg ervoor dat alle e-mailheaders zijn opgegeven

Sommige spamsoftware zal e-mail weigeren als er veelvoorkomende koppen ontbreken, zoals ‘Van’ en ‘Beantwoorden aan’:

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

Zorg ervoor dat e-mailheaders geen syntaxisfouten bevatten

Ongeldige headers zijn net zo erg als geen headers hebben. Eén onjuist teken kan voldoende zijn om uw e-mail te laten ontsporen. Controleer nogmaals of uw syntaxis correct is, want PHP zal deze fouten nietvoor u opvangen.

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

Gebruik geen nep From:afzender

Hoewel de e-mail een Van:-afzender moet hebben, mag u niet zomaar elkewaarde gebruiken. Met name door de gebruiker opgegeven afzenderadressen zijn een trefzekere manier om e-mails te blokkeren:

$headers = array("From: $_POST[contactform_sender_email]"); // No!

Reden: uw web- of verzendende e-mailserver staat niet op de SPF/DKIM-whitelist om te doen alsof hij verantwoordelijk is voor @hotmail- of @gmail-adressen. Het kan zelfs stil e-mails laten vallen met From:afzenderdomeinen waarvoor het niet is geconfigureerd.

Zorg ervoor dat de waarde van de ontvanger correct is

Soms is het probleem zo simpel als het hebben van een onjuiste waarde voor de ontvanger van de e-mail. Dit kan te wijten zijn aan het gebruik van een onjuiste variabele.

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

Een andere manier om dit te testen is door de waarde van de ontvanger hard te coderen in de functieaanroep mail():

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

Dit kan van toepassing zijn op alle mail()parameters.

Verzenden naar meerdere accounts

Om problemen met e-mailaccounts uit te sluiten, stuurt u uw e-mail naar meerdere e-mailaccounts bij verschillende e-mailproviders. Als uw e-mails niet aankomen op het Gmail-account van een gebruiker, stuurt u dezelfde e-mails naar een Yahoo-account, een Hotmail-account en een gewoon POP3-account (zoals uw door uw ISP verstrekte e-mailaccount).

Als de e-mails bij alle of enkele van de andere e-mailaccounts aankomen, weet u dat uw code e-mails verzendt, maar het is waarschijnlijk dat de e-mailaccountprovider ze om de een of andere reden blokkeert. Als de e-mail bij geen enkele e-mailaccount aankomt, is de kans groter dat het probleem te maken heeft met uw code.

Zorg ervoor dat de code overeenkomt met de formuliermethode

Als je je formuliermethode hebt ingesteld op POST, zorg er dan voor dat je $_POSTgebruikt om naar je formulierwaarden te zoeken. Als je het hebt ingesteld op GETof helemaal niet hebt ingesteld, zorg er dan voor dat je $_GETgebruikt om naar je formulierwaarden te zoeken.

Zorg ervoor dat de waarde van uw actionformulier naar de juiste locatie verwijst

Zorg ervoor dat uw action-kenmerk een waarde bevat die verwijst naar uw PHP-mailingcode.

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

Zorg ervoor dat de webhost het verzenden van e-mail ondersteunt

Sommige webhostingproviders staan het verzenden van e-mails via hun servers niet toe of schakelen deze in. De redenen hiervoor kunnen verschillen, maar als het verzenden van e-mail is uitgeschakeld, moet u een alternatieve methode gebruiken die een derde partij gebruikt om die e-mails voor u te verzenden.

Een e-mail naar hun technische ondersteuning (na een bezoek aan hun online ondersteuning of veelgestelde vragen) zou moeten verduidelijken of e-mailmogelijkheden beschikbaar zijn op uw server.

Zorg ervoor dat de localhostmailserver is geconfigureerd

Als u op uw lokale werkstation ontwikkelt met WAMP, MAMP of XAMPP, is er waarschijnlijk geen e-mailserver op uw werkstation geïnstalleerd. Zonder een kan PHP standaard geen e-mail verzenden.

U kunt dit verhelpen door een standaard mailserver te installeren. Voor Windows kunt u de gratis Mercury Mailgebruiken.

U kunt ook SMTP gebruiken om uw e-mails te verzenden. Zie dit geweldige antwoordvan Vikas Dwivediom te leren hoe je dit kunt doen.

Schakel PHP’s aangepaste mail.log

in

Naast het logbestand van uw MTA en PHP, kunt u registratie voor de functie mail()specifiek. Het registreert niet de volledige SMTP-interactie, maar in ieder geval de parameters van de functieaanroep en het aanroepscript.

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

Zie http://php.net/manual/en/mail.configuration.php voor details. (Het is het beste om deze opties in te schakelen in de php.iniof .user.iniof .htaccessmisschien.)

Neem contact op met een e-mailtestservice

Er zijn verschillende bezorgings- en spamcontroleservices die u kunt gebruiken om uw MTA/webserver-configuratie te testen. Meestal stuurt u een e-mailonderzoek naar: hun adres, en ontvangt u later een leveringsrapport en meer concrete storingen of analyses:

Gebruik een andere mailer

PHP’s ingebouwde mail()-functie is handig en klaart vaak de klus, maar het heeft zijn tekortkomingen. Gelukkig zijn er alternatieven die meer kracht en flexibiliteit bieden, waaronder het oplossen van veel van de hierboven beschreven problemen:

die allemaal kunnen worden gecombineerd met een professionele SMTP-server / serviceprovider. (Omdat typische 08/15 gedeelde webhostingplannen worden geraakt of missen als het gaat om e-mailinstellingen / configurability.)


2, Autoriteit 8%

Voeg een postkop toe in de e-mailfunctie:

$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>';
}

3, Autoriteit 5%

  1. Probeer altijd kopers in de e-mailfunctie te verzenden.
  2. Als u e-mail verzendt via LocalHost, voert u de SMTP-instellingen uit voor het verzenden van e-mail.
  3. Als u e-mail via een server verzendt, controleer dan de functie E-mail verzenden is ingeschakeld op uw server.

4, Autoriteit 4%

Als u een SMTP-configuratie gebruikt voor het verzenden van uw e-mail, probeert u phpmailer in plaats daarvan in plaats daarvan. U kunt de bibliotheek downloaden van https://github.com/phpmailer/phpmailer .

Ik heb mijn e-mail gemaakt die op deze manier verzendt:

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 = "p@ssw0rd"; // 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";
}

5, Autoriteit 3%

Voeg gewoon wat kopteksten toe voordat u Mail verzendt:

<?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);

En nog iets. De functie mail()werkt niet in localhost. Upload je code naar een server en probeer het.


Antwoord 6, autoriteit 3%

Het werkte voor mij op 000webhost door het volgende te doen:

$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";

Voer direct het e-mailadres in bij het verzenden van de e-mail:

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

Gebruik ''en niet "".

Deze code werkt, maar de e-mail is met een vertraging van een half uur ontvangen.


Antwoord 7, autoriteit 2%

Meestal is de functie mail()uitgeschakeld in shared hosting.
Een betere optie is om SMTP te gebruiken. De beste optie zou Gmail of SendGrid zijn.


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();
}
?>

8, Autoriteit 2%

Als u alleen de mail()-functie gebruikt, moet u het configuratiebestand invullen.

U moet de e-mailuitbreiding openen en de SMTP smtp_portinstellen enzovoort, en het belangrijkste, uw gebruikersnaam en uw wachtwoord. Zonder dat kan de e-mail niet worden verzonden. Ook kunt u de PHPMail-klasse gebruiken om te verzenden.


9, Autoriteit 2%

Probeer deze twee dingen afzonderlijk en samen:

  1. Verwijder de if($_POST['submit']){}
  2. Verwijderen $from(gewoon mijn darm)

10, Autoriteit 2%

Ik denk dat dit de truc moet doen. Ik heb zojuist een if(isseten voegde aaneenschakeling aan de variabelen in het lichaam toe om PHP van HTML te scheiden.

<?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>'; 
    }
}
?>

11, Autoriteit 2%

Iedereen die dit in de toekomst vindt, zou ik het gebruik van mailniet aanraden. Er zijn enkele antwoorden die hierop betrekking hebben, maar niet het waaromervan.

PHP’s mail-functie is niet alleen ondoorzichtig, het is volledig afhankelijk van wat dan ook MTAdie u gebruikt (dwz Sendmail) om het werk te doen. mailzal u alleenvertellen of de MTA deze niet heeft geaccepteerd (d.w.z. Sendmail was niet beschikbaar toen u probeerde te verzenden). Het kan u niet vertellen of de e-mail succesvol was, omdat het is overhandigd. Als zodanig (zoals John Conde’s antwoorddetails), kun je nu aan de logboeken van de MTA rommelen en hopen dat het je genoeg vertelt over het falen om het te repareren. Als je op een gedeelde host zit of geen toegang hebt tot de MTA-logboeken, heb je pech. Helaas behandelt de standaard voor de meeste vanilla-installaties voor Linux het op deze manier.

Een e-mailbibliotheek (PHPMailer, Zend Framework 2+, enz.), doet iets heel anders dan mail. Ze openen een socket rechtstreeks naar de ontvangende mailserver en sturen vervolgens de SMTP-mailcommando’s rechtstreeks via die socket. Met andere woorden, de klasse fungeert als zijn eigen MTA (merk op dat u de bibliotheken kunt vertellen dat ze mailmoeten gebruiken om de e-mail uiteindelijk te verzenden, maar ik raad u ten zeerste aan dat niet te doen).

Dit betekent dat u dan direct de antwoorden van de ontvangende server kunt zien (in PHPMailer kunt u bijvoorbeeld Schakel foutopsporingsuitvoer in). Nooit meer raden of een e-mail niet kon worden verzonden of waarom.

Als u SMTP gebruikt (dwz u belt isSMTP()), kunt u een gedetailleerd transcript van het SMTP-gesprek krijgen met behulp van de eigenschap SMTPDebug.

Stel deze optie in door een regel als deze in uw script op te nemen:

$mail->SMTPDebug = 2;

U profiteert ook van een betere interface. Met mailmoet je al je headers, bijlagen, etc. instellen. Met een bibliotheek heb je een speciale functie om dat te doen. Het betekent ook dat de functie alle lastige onderdelen doet (zoals headers).


Antwoord 12

$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>";
}

Antwoord 13

U kunt configuratie-e-mail gebruiken via CodeIgniter. Gebruik bijvoorbeeld SMTP(eenvoudige manier):

$config = Array(
        'protocol' => 'smtp',
        'smtp_host' => 'mail.domain.com', // Your SMTP host
        'smtp_port' => 26, // Default port for 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
}

Het werkt voor mij!


Antwoord 14

Probeer dit

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>
        '; 
    }
}

Antwoord 15

Misschien is het probleem de configuratie van de mailserver. Om dit soort problemen te voorkomen of om je geen zorgen te maken over het mailserverprobleem, raad ik je aan om PHPMailer.

Het is een plug-in die alles heeft wat nodig is om e-mail te verzenden, en het enige waar u rekening mee hoeft te houden is dat de SMTP-poort (Poort: 25 en 465) is ingeschakeld.

require_once 'PHPMailer/PHPMailer.php';
require_once '/servicios/PHPMailer/SMTP.php';
require_once '/servicios/PHPMailer/Exception.php';
$mail = new \PHPMailer\PHPMailer\PHPMailer(true);
try {
    //Server settings
    $mail->SMTPDebug = 0;
    $mail->isSMTP();
    $mail->Host = 'smtp.gmail.com';
    $mail->SMTPAuth = true;
    $mail->Username = '[email protected]';
    $mail->Password = 'contrasenia';
    $mail->SMTPSecure = 'ssl';
    $mail->Port = 465;
    // Recipients
    $mail->setFrom('[email protected]', 'my name');
    $mail->addAddress('[email protected]');
    // Attachments
    $mail->addAttachment('optional file');         // Add files, is optional
    // Content
    $mail->isHTML(true);// Set email format to HTML
    $mail->Subject = utf8_decode("subject");
    $mail->Body    = utf8_decode("mail content");
    $mail->AltBody = '';
    $mail->send();
}
catch (Exception $e) {
    $error = $mail->ErrorInfo;
}

Antwoord 16

Allereerst heb je misschien te veel parameters voor de functie mail()…
U kunt maximaal vijf mail(to, subject, message, headers, parameters);

Voor zover de variabele $fromgaat, zou die automatisch van je webhost moeten komen als je de Linux cPanel. Het komt automatisch van je cPanel-gebruikersnaam en IP-adres.

$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";

Zorg er ook voor dat je de juiste volgorde van variabelen in je mail()-functie hebt.

De mail($to, $subject, $message, etc.)in die volgorde, anders bestaat de kans dat het niet werkt.


Antwoord 17

Zorg ervoor dat Sendmail op uw server is geïnstalleerd.

Als je je code hebt gecontroleerd en hebt geverifieerd dat daar niets mis is, ga dan naar /var/mail en controleer of die map leeg is.

Als het leeg is, moet u het volgende doen:

sudo apt-get install sendmail

als u zich op een Ubuntu-server bevindt.


Antwoord 18

Als je problemen hebt met het verzenden van e-mails met PHP, overweeg dan een alternatief zoals PHPMailerof SwiftMailer.

Ik gebruik SwiftMailer meestal wanneer ik e-mails met PHP moet verzenden.


Basisgebruik:

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);
}

Zie de officiële documentatie voor meer informatie over hoe gebruik SwiftMailer.


19

Dit heeft alleen invloed op een klein handvol gebruikers, maar ik zou graag willen dat het voor die kleine handvol gedocumenteerd is. Dit lid van die kleine handvol bracht 6 uur door met het oplossen van een werkend PHP-mailscript vanwege dit probleem.

Als u naar een universiteit gaat die XAMPP runt van www.aceitlab.com, moet u weten wat onze professor ons niet heeft verteld: de Aceitlab-firewall (niet de Windows-firewall) blokkeert MercuryMail in XAMPP. Je moet een alternatieve e-mailclient gebruiken, peer werkt voor ons. U moet verzenden naar een Gmail-account met lage beveiligingsinstellingen.

Ja, ik weet het, dit is helemaal nutteloos voor E-mail van de wereld. Van wat ik heb gezien, hebben academische instellingen en de echte wereld vaak kostbaar weinig gemeen.


20

Als u deze code gebruikt op een lokale server (i.e uw computer voor ontwikkelingsdoeleinden) verzendt het de e-mail niet naar de ontvanger. Het maakt een .txtbestand in een map met de naam mailoutput.

In het geval dat u een gratis hosedienst gebruikt, zoals 000webhostof hostinger, schakelt deze serviceproviders de mail()functie uit Om onbedoeld gebruik van e-mail spoofing, spamming, enz. Te voorkomen, moet ik erop contact opnemen met hen om te zien of ze deze functie ondersteunen.

Als u zeker weet dat de serviceprovider de functie Mail () ondersteunt, kunt u deze PHP-handleiding controleren voor verdere referentie,

PHP Mail ()

Om het weer te controleren, ondersteunt uw hosting-service de functie Mail (), probeer deze code te gebruiken (Vergeet niet om het e-mailadres van de ontvanger te wijzigen) :

<?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);
?>

21

sendmail installatie voor Debian 10.0.0 (‘Buster ‘) was in feite triviaal!

php.ini

[mail function]
sendmail_path=/usr/sbin/sendmail -t -i
; (Other directives are mostly windows)

Standaard Sendmail Pakketinstallatie (toestaan ​​’verzenden’):

su -                                        # Install as user 'root'
dpkg --list                                 # Is install necessary?
apt-get install sendmail sendmail-cf m4     # Note multiple package selection
sendmailconfig                              # Respond all 'Y' for new install

Diverse handige commando’s:

which sendmail                              # /usr/sbin/sendmail
which sendmailconfig                        # /usr/sbin/sendmailconfig
man sendmail                                # Documentation
systemctl restart sendmail                  # As and when required

Verificatie (van mogelijkheid om te verzenden)

echo "Subject: sendmail test" | sendmail -v <yourEmail>@gmail.com

Het bovenstaande duurde ongeveer 5 minuten. Toen heb ik 5 uur verspild… Vergeet niet je spammap te controleren!


Antwoord 22

Er zijn verschillende mogelijkheden:

  1. Je hebt te maken met een serverprobleem. De server heeft geen mailserver. Dus je mail werkt niet, omdat je code in orde is en mail werkt met type.

  2. U krijgt de geboekte waarde niet. Probeer je code met een statische waarde.

  3. Gebruik SMTP-mails om e-mail te verzenden…


Antwoord 23

U kunt uw fouten zien door:

error_reporting(E_ALL);

En mijn voorbeeldcode is:

<?php
    use PHPMailer\PHPMailer\PHPMailer;
    require 'PHPMailer.php';
    require 'SMTP.php';
    require 'Exception.php';
    $name = $_POST['name'];
    $mailid = $_POST['mail'];
    $mail = new PHPMailer;
    $mail->IsSMTP();
    $mail->SMTPDebug = 0;                   // Set mailer to use SMTP
    $mail->Host = 'smtp.gmail.com';         // Specify main and backup server
    $mail->Port = 587;                      // Set the SMTP port
    $mail->SMTPAuth = true;                 // Enable SMTP authentication
    $mail->Username = '[email protected]';  // SMTP username
    $mail->Password = 'password';           // SMTP password
    $mail->SMTPSecure = 'tls';              // Enable encryption, 'ssl' also accepted
    $mail->From = '[email protected]';
    $mail->FromName = 'name';
    $mail->AddAddress($mailid, $name);       // Name is optional
    $mail->IsHTML(true);                     // Set email format to HTML
    $mail->Subject = 'Here is the subject';
    $mail->Body    = 'Here is your message' ;
    $mail->AltBody = 'This is the body in plain text for non-HTML mail clients';
    if (!$mail->Send()) {
       echo 'Message could not be sent.';
       echo 'Mailer Error: ' . $mail->ErrorInfo;
       exit;
    }
    echo 'Message has been sent';
?>

Antwoord 24

Als je vastzit aan een app die wordt gehost op Hostgator, ditis wat mijn probleem heeft opgelost. Hartelijk dank aan de man die de gedetailleerde oplossing heeft gepost. Mocht de link op een dag offline gaan, daar heb je de samenvatting:

  • Zoek naar het sendmail-pad op uw server.Een eenvoudige manier om dit te controleren, is door tijdelijk de volgende code op een pagina te schrijven die alleen voor u toegankelijk is, om de gegenereerde informatie te lezen: <?php phpinfo(); ?>. Open deze pagina en zoek naar sendmail path. (Vergeet dan niet deze code te verwijderen!)
  • Probleem en oplossing:als uw sendmail-pad alleen -t -izegt, bewerk dan de php.inivan uw server en voeg de volgende regel: sendmail_path = /usr/sbin/sendmail -t -i;

Maar nadat ik e-mail kon verzenden met de PHP mail()-functie, ontdekte ik dat het niet-geauthenticeerde e-mail verzendt, wat een ander probleem veroorzaakte. De e-mails vielen allemaal in de ongewenste mailbox van mijn Hotmail en sommige e-mails werden nooit afgeleverd, wat volgens mij te maken heeft met het feit dat ze niet zijn geverifieerd. Daarom heb ik besloten om toch over te stappen van mail()naar PHPMailermet SMTP.


Antwoord 25

Het kan een probleem zijn met het “Van:” $e-mailadres in dit deel van de $headers:

From: \"$name\" <$email>

Om het uit te proberen, stuur een e-mail zonder het kopgedeelte, zoals:

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

Als dat het geval is, probeer dan een e-mailaccount te gebruiken dat al is aangemaakt op het systeem van waaruit u e-mail probeert te verzenden.


Antwoord 26

<?php
$to       = '[email protected]';
$subject  = 'Write your email subject here.';
$message  = '
<html>
<head>
<title>Title here</title>
</head>
<body>
<p>Message here</p>
</body>
</html>
';
// Carriage return type (RFC).
$eol = "\r\n";
$headers  = "Reply-To: Name <[email protected]>".$eol;
$headers .= "Return-Path: Name <[email protected]>".$eol;
$headers .= "From: Name <[email protected]>".$eol;
$headers .= "Organization: Hostinger".$eol;
$headers .= "MIME-Version: 1.0".$eol;
$headers .= "Content-type: text/html; charset=iso-8859-1".$eol;
$headers .= "X-Priority: 3".$eol;
$headers .= "X-Mailer: PHP".phpversion().$eol;
mail($to, $subject, $message, $headers);

HTML-e-mail verzenden
Tijdens het verzenden van een e-mailbericht kunt u een Mime-versie, inhoudstype en tekenset opgeven om een HTML-e-mail te verzenden.

Voorbeeld
Het bovenstaande voorbeeld stuurt een HTML-e-mailbericht naar [email protected]. U kunt dit programma zo coderen dat het alle inhoud van de gebruiker moet ontvangen en vervolgens een e-mail moet verzenden.


Antwoord 27

Voor het verzenden van e-mails van gmail smtp en het gebruik van de php-mailfunctie, moet u eerst de sendmail instellen op uw lokale machine. Als het eenmaal is ingesteld, betekent dit dat u uw lokale smtp-server hebt ingesteld, dan kunt u e-mails verzenden vanaf het account dat je hebt ingesteld in je sendmail smtp-account, in mijn geval heb ik de instructies gevolgd van https://www.developerfiles.com/how-to-send-emails-from-localhost-mac-os-x-el-capitan/en kon het account instellen,


Antwoord 28

Op voorwaarde dat uw sendmail-systeem werkt, moet uw code als volgt worden gewijzigd:

<?php
    $name = $_POST['name'];
    $email = $_POST['email'];
    $message = $_POST['message'];
    $header ="
Content-Type: text/html; charset=UTF-8\r\n
MIME-Version: 1.0\r\n
From: \"$name\" <$email>\r\n
Reply-To: [email protected]\r\n
X-Mailer: yoursite.com mailer\r\n
";
    $to = '"Contact" <[email protected]>'; 
    $subject = 'Customer Inquiry';
    $body =<<<EOB
<!DOCTYPE html>
<html>
    <body>
        $message
    </body>
</html>
EOB;
    if ($_POST['submit']) {
        if (mail ($to, $subject, $body, $header) !== false) { 
            echo '<p>Your message has been sent!</p>';
        } else { 
            echo '<p>Something went wrong, go back and try again!</p>'; 
        }
    }
?>

Hiermee kunt u HTML-gebaseerde e-mails verzenden.

van opmerkelijke interesse:

  1. We hebben een header multilines-reeks gebouwd (elke lijn gescheiden door \ r \ n);
  2. We hebben inhoudstype toegevoegd om te expresseren, we retourneren HTML zodat u betere e-mails kunt samenstellen (u kunt NAY HTML-code toevoegen die u wilt, inclusief CSS, op uw bericht zoals u in HTML-pagina zou doen).

OPMERKING: <<<EOBSYNTAX vereist dat de laatste EOB-marker begint als het begin PF de lijn en heeft geen ruimte of welk personage niet na de puntkomma’s.

Other episodes