html - PHP mail function doesn't complete sending of 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 , try again!</p>'; } } ?>
i've tried creating simple mail form. form on index.html
page, submits separate "thank submission" page, thankyou.php
, above php code embedded. code submits perfectly, never sends email. please help.
there variety of reasons script appears not sending emails. it's difficult diagnose these things unless there obvious syntax error. without 1 need run through checklist below find potential pitfalls may encountering.
make sure error reporting enabled , set report errors
error reporting essential rooting out bugs in code , general errors php encounters. error reporting needs enabled receive these errors. placing following code @ top of php files (or in master configuration file) enable error reporting.
error_reporting(-1); ini_set('display_errors', 'on'); set_error_handler("var_dump");
see this stack overflow answer more details on this.
make sure mail()
function called
it may seem silly common error forget place mail()
function in code. make sure there , not commented out.
check server's mail logs
your web server should logging attempts send emails through it. location of these logs vary (you may need ask server administrator located) can commonly found in user's root directory under logs
. inside error messages server reported, if any, related attempts send emails.
check port connection failure
port block common problem developers face while integrating code deliver emails using smtp. and, can traced @ server maillogs (the location of server of mail log can vary server server, explained above). in case on shared hosting server, ports 25 , 587 remain blocked default. block been purposely done hosting provider. true of dedicated servers. when these ports blocked, try connect using port 2525. if find port blocked, solution contact hosting provider unblock these ports.
most of hosting providers block these email ports protect network sending spam emails.
use ports 25 or 587 plain/tls connections , port 465 ssl connections. users, suggested use port 587 avoid rate limits set hosting providers.
don't use error suppression operator
when error suppression operator @
prepended expression in php, error messages might generated expression ignored. there circumstances using operator necessary sending mail not 1 of them.
if code contains @mail(...)
may hiding important error messages debug this. remove @
, see if errors reported.
it's advisable when check error_get_last()
right afterwards concrete failures.
check mail()
return value
the mail()
function:
returns
true
if mail accepted delivery,false
otherwise. important note because mail accepted delivery, not mean mail reach intended destination.
this important note because:
- if receive
false
return value know error lies server accepting mail. isn't coding issue server configuration issue. need speak system administrator find out why happening. - if receive
true
return value not mean email sent. means email sent respective handler on server php. there still more points of failure outside of php's control can cause email not sent.
so false
point in right direction whereas true
not mean email sent successfully. important note!
make sure hosting provider allows send emails , not limit mail sending
many shared webhosts, free webhosting providers, either not allow emails sent servers or limit amount can sent during given time period. due efforts limit spammers taking advantage of cheaper services.
if think host has emailing limits or blocks sending of emails, check faqs see if list such limitations. otherwise, may need reach out support verify if there restrictions in place around sending of emails.
check spam folders; prevent emails being flagged spam
oftentimes, various reasons, emails sent through php (and other server-side programming languages) end in recipient's spam folder. check there before troubleshooting code.
to avoid mail sent through php being sent recipient's spam folder, there various things can do, both in php code , otherwise, minimize chances emails marked spam. tips michiel de mare include:
- use email authentication methods, such spf, , dkim prove emails , domain name belong together, , prevent spoofing of domain name. spf website includes wizard generate dns information site.
- check reverse dns make sure ip address of mail server points domain name use sending mail.
- make sure ip-address you're using not on blacklist
- make sure reply-to address valid, existing address.
- use full, real name of addressee in field, not email-address (e.g.
"john smith" <john@blacksmiths-international.com>
).- monitor abuse accounts, such abuse@yourdomain.com , postmaster@yourdomain.com. means - make sure these accounts exist, read what's sent them, , act on complaints.
- finally, make really easy unsubscribe. otherwise, users unsubscribe pressing spam button, , affect reputation.
see how make sure email send programmatically not automatically marked spam? more on topic.
make sure mail headers supplied
some spam software reject mail if missing common headers such "from" , "reply-to":
$headers = array("from: from@example.com", "reply-to: replyto@example.com", "x-mailer: php/" . php_version ); $headers = implode("\r\n", $headers); mail($to, $subject, $message, $headers);
make sure mail headers have no syntax errors
invalid headers bad having no headers. 1 incorrect character takes derail email. double-check make sure syntax correct php not catch these errors you.
$headers = array("from from@example.com", // missing colon "reply to: replyto@example.com", // missing hyphen "x-mailer: "php"/" . php_version // bad quotes );
make sure recipient value correct
sometimes problem simple having incorrect value recipient of email. can due using incorrect variable.
$to = 'user@example.com'; // other variables .... mail($recipient, $subject, $message, $headers); // $recipient should $to
another way test hard code recipient value mail()
function call:
mail('user@example.com', $subject, $message, $headers);
this can apply of mail()
parameters.
send multiple accounts
to rule out email account issues, send email multiple email accounts at different email providers. if emails not arriving @ user's gmail account, send same emails yahoo account, hotmail account, , regular pop3 account (like isp-provided email account).
if emails arrive @ or of other email accounts, know code sending emails email account provider blocking them reason. if email not arrive @ email account, problem more related code.
make sure code matches form method
if have set form method post
, make sure using $_post
form values. if have set get
or didn't set @ all, make sure using $_get
form values.
make sure web host supports sending email
some web hosting providers not allow or enable sending of emails through servers. reasons may vary if have disabled sending of mail need use alternative method uses third party send emails you.
an email technical support (after trip online support or faq) should clarify if email capabilities available on server.
make sure localhost
mail server configured
if developing on local workstation using wamp, mamp, or xampp, email server not installed on workstation. without one, php cannot send mail default.
you can overcome installing basic mail server. windows can use free mercury mail.
you can use smtp send emails. see this great answer vikas dwivedi learn how this.
enable php's custom mail.log
in addition mta's , php's log file, can enable logging mail()
function specifically. doesn't record complete smtp interaction, @ least function call parameters , invocation script.
ini_set("mail.log", "/tmp/mail.log"); ini_set("mail.add_x_header", true);
see http://php.net/manual/en/mail.configuration.php details. (it's best enable these options in php.ini
or .user.ini
or .htaccess
perhaps.)
use different mailer
php's built in mail()
function handy , gets job done has shortcomings. fortunately there alternatives offer more power , flexibility including handling lot of issues outlined above. 1 might consider using popular phpmailer or swiftmailer, or older pear::mail.
Comments
Post a Comment