PHP-mailfunktionen afslutter ikke afsendelse af e-mail
<?php
$name = $_POST['name'];
$email = $_POST['email'];
$message = $_POST['message'];
$from = 'From: yoursite.com';
$to = 'contact@yoursite.com';
$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>';
}
}
?>
Jeg har prøvet at oprette en simpel mailformular. Selve formularen er på min index.html
side, men den sender til en separat "tak for din indsendelse" side, thankyou.php
, hvor ovenstående PHP-kode er indlejret.
Koden indsendes perfekt, men sender aldrig en e-mail. Hvordan kan jeg løse dette?
458
3
Og selv om der er dele af dette svar, der kun gælder for brugen af selve funktionen
mail()
, kan mange af disse fejlfindingstrin anvendes på ethvert PHP-mailing-system. Der er en række forskellige årsager til, at dit script tilsyneladende ikke sender e-mails. Det er vanskeligt at diagnosticere disse ting, medmindre der er en åbenlys syntaksfejl. Uden en sådan skal du gennemgå nedenstående tjekliste for at finde eventuelle potentielle faldgruber, som du måske støder på.Sørg for, at fejlrapportering er aktiveret og indstillet til at rapportere alle fejl
Fejlrapportering er afgørende for at finde fejl i din kode og generelle fejl, som PHP støder på. Fejlrapportering skal være aktiveret for at modtage disse fejl. Hvis du placerer følgende kode øverst i dine PHP-filer (eller i en masterkonfigurationsfil), aktiveres fejlrapportering.
Se dette Stack Overflow-svar for flere detaljer om dette.
Sørg for, at funktionen
mail()
er kaldtDet kan virke fjollet, men en almindelig fejl er at glemme at placere
mail()
-funktionen rent faktisk i din kode. Sørg for, at den er der og ikke kommenteret ud.Sørg for, at funktionen
mail()
kaldes korrektSørg for, at der ikke er syntaksfejl i mailheaders
Ugyldige headers er lige så slemt som at have ingen headers. Et enkelt forkert tegn kan være alt, hvad der skal til for at afspore din e-mail. Dobbelttjek, at din syntaks er korrekt, da PHP ikke opfanger disse fejl for dig.
Don't use a faux
From:
senderSelvom mailen skal have en From: afsender, må du ikke bare bruge nogle værdier. Især brugerindtastede afsenderadresser er en sikker måde at få mails blokeret på:
Årsag: Din web- eller afsendende mailserver er ikke SPF/DKIM-whitelistet for at foregive at være ansvarlig for @hotmail- eller @gmail-adresser. Den kan endda stille og roligt droppe mails med
From:
-afsenderdomæner, som den ikke er konfigureret til.Sørg for, at modtagerværdien er korrekt
Nogle gange er problemet så simpelt som at have en forkert værdi for modtageren af e-mailen. Det kan skyldes, at der er brugt en forkert variabel.
En anden måde at teste dette på er at hardcode modtagerværdien i
mail()
-funktionskaldet:Dette kan gælde for alle parametre i
mail()
.Send til flere konti
For at hjælpe med at udelukke problemer med e-mailkonti kan du sende din e-mail til flere e-mailkonti på forskellige e-mailudbydere. Hvis dine e-mails ikke ankommer til en brugers Gmail-konto, så send de samme e-mails til en Yahoo-konto, en Hotmail-konto og en almindelig POP3-konto (f.eks. din internetudbyders e-mailkonto). Hvis e-mailene ankommer til alle eller nogle af de andre e-mailkonti, ved du, at din kode sender e-mails, men det er sandsynligt, at udbyderen af e-mailkontoen blokerer dem af en eller anden grund. Hvis e-mailen ikke ankommer til nogen e-mailkonto, er det mere sandsynligt, at problemet er relateret til din kode.
Sørg for, at koden passer til formularmetoden
Hvis du har sat din formularmetode til
POST
, skal du sikre dig, at du bruger$_POST
til at søge efter dine formularværdier. Hvis du har indstillet den tilGET
eller slet ikke har indstillet den, skal du sørge for, at du bruger$_GET
til at søge efter dine formularværdier.Sørg for, at din formular
action
-værdi peger på det rigtige stedSørg for, at din formular
action
-attribut indeholder en værdi, der peger på din PHP-mailingkode.Sørg for, at webhotellet understøtter afsendelse af e-mail
Nogle webhostingudbydere tillader eller tillader ikke, at der sendes e-mails via deres servere. Årsagerne til dette kan variere, men hvis de har deaktiveret afsendelse af e-mails, skal du bruge en alternativ metode, der bruger en tredjepart til at sende disse e-mails for dig. En e-mail til deres tekniske support (efter en tur til deres online support eller FAQ) bør afklare, om e-mailfunktioner er tilgængelige på din server.
Sørg for, at
localhost
-mailserveren er konfigureretHvis du udvikler på din lokale arbejdsstation ved hjælp af WAMP, MAMP eller XAMPP, er der sandsynligvis ikke installeret en e-mail-server på din arbejdsstation. Uden en sådan kan PHP som standard ikke sende mail. Du kan afhjælpe dette ved at installere en grundlæggende mailserver. Til Windows kan du bruge den gratis [Mercury Mail] (http://www.pmail.com/overviews/ovw_mercury.htm). Du kan også bruge SMTP til at sende dine e-mails. Se dette gode svar fra Vikas Dwivedi for at lære, hvordan du gør dette.
Aktiver PHP's brugerdefinerede
mail.log
Ud over din MTA's og PHP's logfil kan du aktivere logning for funktionen
mail()
specifikt. Det registrerer ikke hele SMTP-interaktionen, men i det mindste funktionskaldsparametre og scriptet for kald af funktionen.Se http://php.net/manual/en/mail.configuration.php for yderligere oplysninger. (Det'er bedst at aktivere disse muligheder i
php.ini
eller.user.ini
eller.htaccess
måske).Kontroller med en mailtesttjeneste
Der findes forskellige tjenester til kontrol af levering og spam, som du kan bruge til at teste din MTA/webserveropsætning. Typisk sender du en mail probe To: deres adresse, og får så en leveringsrapport og mere konkrete fejl eller analyser senere:
Brug en anden mailer
PHP's indbyggede
mail()
-funktion er praktisk og klarer ofte opgaven, men den har sine mangler. Heldigvis findes der alternativer, der giver mere kraft og fleksibilitet, herunder håndtering af mange af de problemer, der er skitseret ovenfor:Hvis du bruger en SMTP-konfiguration til at sende din e-mail, kan du prøve at bruge PHPMailer i stedet. Du kan downloade biblioteket fra https://github.com/PHPMailer/PHPMailer.
Jeg oprettede min e-mail-afsendelse på denne måde:
Du skal blot tilføje nogle overskrifter, før du sender mailen:
Og en ting mere. Funktionen
mail()
virker ikke på localhost. Upload din kode til en server og prøv.