PHP - Contact form not working (message not sent) - php

I'm currently using Godaddy webmail service. Basically, the problem with this contact form is that you can submit the message, but it doesn't get sent. (Note: The email address in the '$email_to' area is not the actual email that I used to test the form.).
Below is the code.
<?php
// Set email variables
$email_to = 'randomaddress#gmail.com';
$email_subject = 'Form submission';
// Set required fields
$required_fields = array('fullname','email','comment');
// set error messages
$error_messages = array(
'fullname' => 'Please enter a Name to proceed.',
'email' => 'Please enter a valid Email Address to continue.',
'comment' => 'Please enter your Message to continue.'
);
// Set form status
$form_complete = FALSE;
// configure validation array
$validation = array();
// check form submittal
if(!empty($_POST)) {
// Sanitise POST array
foreach($_POST as $key => $value) $_POST[$key] = remove_email_injection(trim($value));
// Loop into required fields and make sure they match our needs
foreach($required_fields as $field) {
// the field has been submitted?
if(!array_key_exists($field, $_POST)) array_push($validation, $field);
// check there is information in the field?
if($_POST[$field] == '') array_push($validation, $field);
// validate the email address supplied
if($field == 'email') if(!validate_email_address($_POST[$field])) array_push($validation, $field);
}
// basic validation result
if(count($validation) == 0) {
// Prepare our content string
$email_content = 'New Website Comment: ' . "\n\n";
// simple email content
foreach($_POST as $key => $value) {
if($key != 'submit') $email_content .= $key . ': ' . $value . "\n";
}
// if validation passed ok then send the email
mail($email_to, $email_subject, $email_content);
// Update form switch
$form_complete = TRUE;
}
}
function validate_email_address($email = FALSE) {
return (preg_match('/^[^#\s]+#([-a-z0-9]+\.)+[a-z]{2,}$/i', $email))? TRUE : FALSE;
}
function remove_email_injection($field = FALSE) {
return (str_ireplace(array("\r", "\n", "%0a", "%0d", "Content-Type:", "bcc:","to:","cc:"), '', $field));
}
?>

check your server. SMTP is enable or not, if SMTP not enable please set up SMTP.

Related

Adding multiple email addresses to php email form

I created a php email form for a contact us page to my site, and want to use the same form for multiple email addresses. However, when I copy the code to the new page and add a different email address, it goes to the same email address as the original contact form.
I change the
$email_to = 'example#gmail.com, customer#website.com';
to a different email address, but it won't work, and keeps sending to the original email address.
How can I make this form usable for multiple emails for multiple email forms?
<?php
// Set email variables
$email_to = 'SARAI.ROMEROEVANS#lausd.net, customer#website.com';
$email_subject = 'Contact Form Submission Bancroft Website';
// Set required fields
$required_fields = array('fullname','email','comment');
// set error messages
$error_messages = array(
'fullname' => 'Please enter a Name to proceed.',
'email' => 'Please enter a valid Email Address to continue.',
'comment' => 'Please enter your Message to continue.'
);
// Set form status
$form_complete = FALSE;
// configure validation array
$validation = array();
// check form submittal
if(!empty($_POST)) {
// Sanitise POST array
foreach($_POST as $key => $value) $_POST[$key] = remove_email_injection(trim($value));
// Loop into required fields and make sure they match our needs
foreach($required_fields as $field) {
// the field has been submitted?
if(!array_key_exists($field, $_POST)) array_push($validation, $field);
// check there is information in the field?
if($_POST[$field] == '') array_push($validation, $field);
// validate the email address supplied
if($field == 'email') if(!validate_email_address($_POST[$field])) array_push($validation, $field);
}
// basic validation result
if(count($validation) == 0) {
// Prepare our content string
$email_content = 'New Website Comment: ' . "\n\n";
// simple email content
foreach($_POST as $key => $value) {
if($key != 'submit') $email_content .= $key . ': ' . $value . "\n";
}
// if validation passed ok then send the email
mail($email_to, $email_subject, $email_content);
// Update form switch
$form_complete = TRUE;
}
}
function validate_email_address($email = FALSE) {
return (preg_match('/^[^#\s]+#([-a-z0-9]+\.)+[a-z]{2,}$/i', $email))? TRUE : FALSE;
}
function remove_email_injection($field = FALSE) {
return (str_ireplace(array("\r", "\n", "%0a", "%0d", "Content-Type:", "bcc:","to:","cc:"), '', $field));
}
?>
If you need more code, let me know
As far as I know you can't specify multiple email addresses in the first parameter of the mail() function. EDIT - you can, but I had assumed this wasn't possible as it has caused my problems in the past.
Here is an edited version of your code. I split $email_to up by commas and then loop through each email address to send an email to each.
I have also added some if statements to control who the recipients are. If you are going to re-use the code for multiple forms then pass a formID as a hidden field and then you can specify in the PHP who should receive the emails. No need to duplicate the PHP code for each form then ...
<?php
// Set email variables
if($_POST['formID'] == 1) {
$email_to = 'SARAI.ROMEROEVANS#lausd.net, customer#website.com';
} elseif($_POST['formID'] == 2) {
$email_to = 'test#test.com, customer#website.com';
} else {
$email_to = 'blah#blah.com, customer#website.com';
}
$email_subject = 'Contact Form Submission Bancroft Website';
// Set required fields
$required_fields = array('fullname','email','comment');
// set error messages
$error_messages = array(
'fullname' => 'Please enter a Name to proceed.',
'email' => 'Please enter a valid Email Address to continue.',
'comment' => 'Please enter your Message to continue.'
);
// Set form status
$form_complete = FALSE;
// configure validation array
$validation = array();
// check form submittal
if(!empty($_POST)) {
// Sanitise POST array
foreach($_POST as $key => $value) $_POST[$key] = remove_email_injection(trim($value));
// Loop into required fields and make sure they match our needs
foreach($required_fields as $field) {
// the field has been submitted?
if(!array_key_exists($field, $_POST)) array_push($validation, $field);
// check there is information in the field?
if($_POST[$field] == '') array_push($validation, $field);
// validate the email address supplied
if($field == 'email') if(!validate_email_address($_POST[$field])) array_push($validation, $field);
}
// basic validation result
if(count($validation) == 0) {
// Prepare our content string
$email_content = 'New Website Comment: ' . "\n\n";
// simple email content
foreach($_POST as $key => $value) {
if($key != 'submit') $email_content .= $key . ': ' . $value . "\n";
}
// if validation passed ok then send the email
$email = explode(',', $email_to);
foreach($email as $e) {
$e = trim($e);
mail($e, $email_subject, $email_content);
}
// Update form switch
$form_complete = TRUE;
}
}
function validate_email_address($email = FALSE) {
return (preg_match('/^[^#\s]+#([-a-z0-9]+\.)+[a-z]{2,}$/i', $email))? TRUE : FALSE;
}
function remove_email_injection($field = FALSE) {
return (str_ireplace(array("\r", "\n", "%0a", "%0d", "Content-Type:", "bcc:","to:","cc:"), '', $field));
}
?>

PHP Validation form submit

How do you stop an email being sent to you before the form is fully completed. Currently when submit is clicked even though there are validation errors present that have been picked up via the PHP checks that I have in place:
Code:
if (isset($_POST['submitButton'])) {
$fullName = $_POST['fullName'];
$myGender = isset($_POST['myGender']) ? $_POST['myGender'] : '';
$email = $_POST['email'];
$age = $_POST['age'];
$myDate = isset($_POST['myDate']) ? $_POST['myDate'] : '';
$streetNum = $_POST['streetNum'];
$streetName = $_POST['streetName'];
$city = $_POST['city'];
$state = $_POST['state'];
$postCode = $_POST['postCode'];
$movie = $_POST['movie'];
//You need to se the $var
if (empty($fullName))
{
$errorfullName .= 'Please Enter Your Name';
}
if (!ctype_alpha(str_replace(array(" ", "-"), "",$fullName))) {
$errorfullName .= 'Your name should contain alpha characters only.';
}
if (strlen($fullName) < 3 OR strlen($fullName) > 40) {
$errorfullName .= 'First name should be within 3-40 characters long.';
}
/* Check Gender) */
if ($myGender != 'male' && $myGender != 'female') {
$errormyGender .= 'Please select your gender.';
}
/* Check Email */
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$erroremail .= 'Enter a valid email address.';
}
/* Age */
if (intval($age) == '') {
$errorage .= 'Please enter your current age';
}
if (intval($age) < 3 OR intval($age) > 200){
$errorage .= 'Age must be less than 200 years';
}
if(intval($age) == "/^[0-9]$/" ){
$errorage .= 'Must be numeric numbers';
}
/* check date using explode (breaks a string into an array.)if day is not 1-31, throw error*/
if(empty($myDate))
{
$errormyDate.= 'Please enter a current date';
}
$date_arr = explode ("-", $myDate);
$dateSplit = array_slice($date_arr, 0,1);
$dateYear = current($dateSplit);
if($dateYear > date('Y'))
{
$errormyDate .= 'Sorry your not born in the future';
}
/* Check Address House Number if its not numeric, throw error */
if (intval($streetNum) == '') {
$errorstreetNum .= 'Please add street Number';
}
/* Street Name */
if (strlen($streetName) < 3 OR strlen($streetName) > 200) {
$errorstreetName .= 'Street must be filled out and within 200 characters';
}
/*City Name */
if (strlen($city) < 3 OR strlen($city) > 200) {
$errorcity .= 'City must be filled out and within 200 characters';
}
/*State Name */
if (strlen($state) < 3 OR strlen($state) > 200) {
$errorstate .= 'State must be filled out and within 200 characters';
}
/* Check postCode */
if(intval($postCode) == "/^[0-9]$/" ){
$errorpostCode .= 'Post Code must be numeric numbers';
}
/* Check movie selection */
if (trim($movie) === "select") {
$errormovie .= 'Please select a favourite movie';
}
if ($fullName, $myGender, $email, $age, $myDate, $streetNum, $streetName, $city, $state, $postCode, $movie, == " "){
echo '$errorsuccess .= 'Please complete all sections of the form'';
}
else {
$success = "Thank you for submitting your form; We will be in contact soon";
//send mail
$to = "#yahoo.co.nz";
$subject = "Php form data";
$message = "<p>".$fullName."</p><p>".$myGender."</p><p>".$email."</p><p>".$age."</p><p>".$myDate."</p><p>".$streetNum."</p><p>".$streetName."</p><p>".$city."</p><p>".$state."</p><p>".$postCode."</p><p>".$movie."</p>";
$from = "#yahoo.co.nz";
mail($to,$subject,$message);
}
}
The reason being is that you even though you have several validations completed in the above, none of them are later checked to see if they failed/passed, your only sanity check is here:
if ($fullName, $myGender, $email, $age, $myDate, $streetNum, $streetName, $city, $state, $postCode, $movie, == " "){
Which its self is pretty useless all together, by the way.
A simpler way for this would be to first create an array to hold all the errors.
$errors = array();
Then when you do your individual checks, make them a key, for example:
if (empty($fullName))
{
$errors['fullname'] .= 'Please Enter Your Name';
}
And
if (intval($age) == '') {
$errors['age'] .= ' Please enter your current age.';
}
if (intval($age) < 3 OR intval($age) > 200){
$errors['age'] .= ' Age must be less than 200 years.';
}
if(intval($age) == "/^[0-9]$/" ){
$errors['age'] .= ' Must be numeric numbers.';
}
Then later you can do:
if($errors){
echo 'There are errors in the form. Please observe each of the errors and try again.'. PHP_EOL;
foreach($errors as $idx => $error){
echo ucfirst($idx). ': ' .$error;
}
}
Set something like $err to false at the beginning of the code. Set it to true when an error is detected. (Even if it's already true; just setting it is easier than checking.)
Then, you can condition the final result on $err.
It looks like that in order to send the email, you only need to have a value for each of your input fields (from $fullName to $movie).
Where you are validating the form (for example, when you use if (empty($fullName))..., the error that is produced if the form isn't filled out correctly always differs. Unless you have some kind of reason for this, I would just stick to a generic error variable of $formerror.
Then in the final section of your code, where you use if($fullName...$movie == ''), you could change this to if($fullName...$movie === '' AND !empty($formerror)) so that if any errors were picked up during the validating of the form, you would be able to echo $formerror and if not, the email would send.

Remove specific definitions from a variable in PHP

I have a PHP mail script that validates name, email address, and phone number before sending the mail. This then means that the Name, Email address, and Phone fields are Required Fields.
I want to have it so that the Name and EITHER Email or Phone are required. Such that if a name and phone are inputted, it sends the mail, or if a name and an email are inputted, it also sends the email.
The way the script works right now is it has several IF statements that check for (1) name, (2) email and (3) phone. Here's an example of an if statement of the code:
if ( ($email == "") ) {
$errors .= $emailError; // no email address entered
$email_error = true;
}
if ( !(preg_match($match,$email)) ) {
$errors .= $invalidEmailError; // checks validity of email
$email_error = true;
}
And here's how it sends the mail:
if ( !($errors) ) {
mail ($to, $subject, $message, $headers);
echo "<p id='correct'>";
echo "ההודעה נשלחה בהצלחה!";
echo "</p>";
} else {
if (($email_error == true)) {
$errors != $phoneError;
/*echo "<p id='errors'>";
echo $errors;
echo "</p>";*/
}
if (($phone_error == true)) {
$errors != $emailError;
$errors != $invalidEmailError;
/*echo "<p id='errors'>";
echo $errors;
echo "</p>";*/
}
echo "<p id='errors'>";
echo $errors;
echo "</p>";
}
This doesn't work though. Basically this is what I want to do: If no email address was entered or if it was entered incorrectly, set a variable called $email_error to be true. Then check for that variable, and if it's true, then remove the $phoneError part of the $errors variable.
Man I hope I'm making some sense here. Does anyone know why this doesn't work? It reports all errors if all fields are left empty :(
Thanks!
Amit
You need at first to build up an array of errors, i.e.:
$errors = array();
if (!$phone) { // add more validation as required
$errors['phone'] = $phoneError;
}
if (!$email) {
$errors['email'] = 'No email provided';
}
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$errors['email'] = 'Invalid email provided';
}
Then you send, or display the errors:
if (!isset($errors['phone']) || !isset($errors['email'])) {
// send mail here, only if either the phone or the email error is missing
} else {
// display errors
echo '<p id="errors">';
foreach ($errors as $error) {
echo $error;
}
echo '</p>';
}
so...
$sent=false;
if(!$name){
$errors[]='No Name was supplied.';
return($errors);
}
if($phone && validatePhone($phone)){
//send the phone message however...
$sent=true;
}
if($email && validateEmail($email)){
//send the email here...
$sent=true;
}
if(!$sent){
$errors[]='Neither an email or a phone was supplied';
return($errors);
}
classed:
class Communication {
var $sent=false;
var $errors=false;
public function __construct(){
$this->phone=$_POST['phone'];
$this->email=$_POST['email'];
$this->name=$_POST['name'];
if($this->validateName()){
$this->validateEmail();
$this->validatePhone();
}
}
public function validateEmail(){
//do your regex here and eval either false or true to $status
if(!$status){
$this->errors['ErrorInvalidEmail']=ErrorInvalidEmail;
}else{
$this->sendEmail();
}
}
public function validatePhone(){
//do your regex here and eval either false or true to $status
if(!$status){
$this->errors['ErrorInvalidPhone']=ErrorInvalidPhone;
}else{
$this->sendText();
}
}
public function validateName(){
//do your regex here and eval either false or true to $status
if(!$status){
$this->errors['ErrorInvalidName']=ErrorInvalidName;
return(false);
}else{
return(true);
}
}
public function sendEmail(){
$this->sent=true;
//do your sending by email HERE
}
public function sendText(){
$this->sent=true;
// do your sending by text/phone here
}
}
$c=new Communication();
print_r($c->errors);
I believe
if ( !($errors) )
should be
if ( !$errors )
//or
if( !isset( $errors ) )
While there is no benefit over doing it Selsaek's way (above), one way to do it is with a bit mask (a set of constants which are powers of 2, and one storage variable). You OR the storage variable with the constant, and then when you AND the two together later, a nonzero result means the flag was tripped. No reason you can't use an array to store the flag and the text:
$WARNING_MASK = array('name' => 1, 'email' => 2, 'phone' => 4);
$warningflag = 0;
to set a flag an error (you OR the storage variable with a constant):
$warningflag = $warningflag | $WARNING_MASK['name'];
to test for an error (you AND the storage value with the constant):
if ($warningflag & $WARNING_MASK['name']) {}

How can I add a From e-mail address to a PHP form?

My e-mail processor is working... but how do I get the From e-mail address to show up instead of "myhost"? I'm getting anonymous#q0.xxxxxxxxxxxxx.com. So, when someone fills in the form, I want his e-mail to be the reply address.
<?php
if(!$_POST) exit;
$email = $_POST['email'];
//$error[] = preg_match('/\b[A-Z0-9._%-]+#[A-Z0-9.-]+\.[A-Z]{2,4}\b/i', $_POST['email']) ? '' : 'INVALID EMAIL ADDRESS';
if(!eregi("^[a-z0-9]+([_\\.-][a-z0-9]+)*" ."#"."([a-z0-9]+([\.-][a-z0-9]+)*)+"."\\.[a-z]{2,}"."$",$email )){
$error.="Invalid email address entered";
$errors=1;
}
if($errors==1) echo $error;
else{
$values = array ('name','email','telephone','company','message');
$required = array('name','email','telephone','message');
$your_email = "myemail#somehost";
$email_subject = "New Message: ".$_POST['subject'];
$email_content = "new message:\n";
foreach($values as $key => $value){
if(in_array($value,$required)){
if ($key != 'subject' && $key != 'company') { if( empty($_POST[$value]) ) { echo 'PLEASE FILL IN REQUIRED FIELDS'; exit; }
}
$email_content .= $value.': '.$_POST[$value]."\n";
}
}
if(#mail($your_email,$email_subject,$email_content)) {
echo 'Message sent!';
} else {
echo 'ERROR!';
}
}
?>
Add this to your file:
$headers = 'From: ' . $your_email . "\r\n" .
'Reply-To: ' . $your_email . "\r\n" .
'X-Mailer: PHP/' . phpversion();
Then when you call the mail command use this:
mail($your_email,$email_subject,$email_content,$headers);
By default, the email sent by PHP [ mail() function ] uses as sender your server.
To change the sender, you must modify the header of email.
You can do it this way:
$emailHeader = "From: theSender#yourdomain.com" . "\r\n" . "Reply-To: theSender#yourdomain.com" . "\r\n";
// add the header argument to mail function
mail($your_email,$email_subject,$email_content,$emailHeader);
Note that we added a fourth argument to the mail function.
okay... i'd say strip the whole $values = array.... line and replace is with
$values = array();
foreach($_POST as $k => $v) if(strtolower($k) != 'submit') $values[$k] = htmlspecialchars($v);
that add's ALL your POST data to the $values array
and your content generator should look like this
foreach($values as $key => $value){
if(in_array($key,$required) && trim($value)==''){
echo 'PLEASE FILL IN REQUIRED FIELDS'; exit;
}
$email_content .= $key.': '.$value."\n"; // makes more sense
}
hope i got your question right oO
Hey. Just by the way: from what i see here,
if ($key != 'subject' && $key != 'company') { if( empty($_POST[$value]) ) { echo 'PLEASE FILL IN REQUIRED FIELDS'; exit; }
does not make sense.
your key's will always be: 0 to count($values)... you don't have an associative array. or is this $values array just for testing purposes?

php form doesnt submit one of the fields

i have bought a template that have built in contact form
problem is that it submits every thing except "company" name
i messed around with it but cant get to work it.
if you can point me to some solution i would be greatful
thanks in advance
this is php script
if(!$_POST) exit;
$email = $_POST['email'];
//$error[] = preg_match('/\b[A-Z0-9._%-]+#[A-Z0-9.-]+\.[A-Z]{2,4}\b/i', $_POST['email']) ? '' : 'INVALID EMAIL ADDRESS';
if(!eregi("^[a-z0-9]+([_\\.-][a-z0-9]+)*" ."#"."([a-z0-9]+([\.-][a-z0-9]+)*)+"."\\.[a-z]{2,}"."$",$email )){
$error.="Invalid email address entered";
$errors=1;
}
if($errors==1) echo $error;
else{
$values = array ('name','email','message');
$required = array('name','email','message');
$your_email = "--------#gmail.com";
$email_subject = "New Message: ".$_POST['subject'];
$email_content = "new message:\n";
foreach($values as $key => $value){
if(in_array($value,$required)){
if ($key != 'subject' && $key != 'company') {
if( empty($_POST[$value]) ) { echo 'Please fill in all required fields, marked with *'; exit; }
}
$email_content .= $value.': '.$_POST[$value]."\n";
}
}
if(#mail($your_email,$email_subject,$email_content)) {
echo 'Thanks for your message, will contact you soon.';
} else {
echo 'ERROR!';
}
}
$values = array ('name','email','message');
Add 'company' to this list in the PHP script.
Also, I would modify the foreach loop to look like this, to get the intended functionality:
foreach($values as $key => $value)
{
if(in_array($value,$required))
{
if(empty($_POST[$value]))
{
echo 'Please fill in all required fields, marked with *';
exit;
}
}
$email_content .= $value.': '.$_POST[$value]."\n";
}
This way, fields that aren't in the $required array are still added to the email if they exist - they just don't have to pass the empty check.
The problem is this line:
$email_content .= $value.': '.$_POST[$value]."\n";
Is never reached unless this line:
if (in_array($value,$required)) {
... is satisfied. This means, only fields listed in $required are going to be appended to the email. If that is OK, then simply change these lines:
$required = array('name','email','message');
$values = array ('name','email','message');
To read:
$required = array ('name','email','message','company');
$values = array ('name','email','message','company');
If that is NOT ok, change this:
foreach ($values as $key => $value) {
if (in_array($value,$required)) {
if ($key != 'subject' && $key != 'company') {
if (empty($_POST[$value])) {
echo 'Please fill in all required fields, marked with *';
exit;
}
}
$email_content .= $value.': '.$_POST[$value]."\n";
}
}
To look like this:
foreach ($values as $key => $value) {
if (in_array($value,$required)) {
if ($key != 'subject' && $key != 'company') {
if (empty($_POST[$value])) {
echo 'Please fill in all required fields, marked with *';
exit;
}
}
}
$email_content .= $value.': '.$_POST[$value]."\n";
}
Then you can take company out of $required, but leave it in $values. I suspect the template worked fine when you started because all fields were required.
If it still does not work, please change this (up top):
if(!$_POST) exit;
To look like this:
if(!$_POST) exit;
print_r($_POST);
... and paste the additional output in your question.
Also, consider buying templates from another vendor :)

Categories