bethlou Posted April 6, 2012 Share Posted April 6, 2012 Hi I am very new to PHP. I'm wanting a feedback form on my website where the form is sent via SMTP rather than sendmail. I have checked that php is working by doing this code: <?php error_reporting(E_ALL); ini_set('display_errors', True); $path = '/home/****/php'; set_include_path(get_include_path() . PATH_SEPARATOR . $path); echo("<p>Sending PEAR Mail.php...</p>"); require('Mail.php'); $from = "Info <info@***.co.uk>"; $to = "Info <info@***.co.uk>"; $subject = "Hi - Test message!"; $body = "Hi,\n\nHow are you?"; $host = "mail.***.co.uk"; $username = "info@***.co.uk"; $password = "***"; $headers = array ('From' => $from, 'To' => $to, 'Subject' => $subject); $smtp = Mail::factory('smtp', array ('host' => $host, 'auth' => true, 'username' => $username, 'password' => $password)); $mail = $smtp->send($to, $headers, $body); if (PEAR::isError($mail)) { echo("<p>" . $mail->getMessage() . "</p>"); } else { echo("<p>Message successfully sent!</p>"); } ?> This works fine. I then created a form in my contact page: <form name="feedbackform" action="form-mailer2.php" method="post"> <input type="hidden" name="Required" value="Name,Comments"> <p>Name: <input name="Name" size="30"> <span class="formsmall">required</span></p> <p>E-mail: <input name="Email" size="30"> <span class="formsmall">optional</span></p> <p>Feedback/Comments:</p> <p><textarea name="Comments" rows="5" cols="40"></textarea></p> <p><input type="submit" value="Submit" name="submitform"><input type="reset" value="Reset" name="reset"></p> </form> I then used the code based on the php initial example and the code file that would get the form details from the contact page and send to the email address via smtp. I have left the validations in - although if these are no good please feel free to tell me! I will want to put a captcha in but need to look into that yet. Anyway, the code I have created is now this (which is saved in the file form-mailer2.php): <?php error_reporting(E_ALL); ini_set('display_errors', True); $path = '/home/****/php'; set_include_path(get_include_path() . PATH_SEPARATOR . $path); echo("<p>Sending PEAR Mail.php...</p>"); require('Mail.php'); $mailfrom = "info@***.co.uk"; $mailTo = "info@***.co.uk"; $mailSubject = "Web Feedback"; $mailHost = "mail.***.co.uk"; $mailPort = "25"; $mailAuth = "true"; $mailPassword = "****"; // Get the form fields. $name = $_POST['Name']; $email = $_POST['Email']; $comments = $_POST['Comments']; $reqFields = $_POST['Required']; // I find including the time/date useful for record-keeping. // Note that it is the web server's time/date, not yours // or the sender's. $date = date("l jS F Y, g:i A"); // A simple yet reasonably effective email address validator. if ((!ereg(".+\@.+\..+", $email)) || (!ereg("^[[email protected]]+$", $email))) { $errorMessages .= "<li>Invalid email address: $email</li>"; } // Make sure required fields are filled in. $checkFields = explode(",",$reqFields); while(list($theField) = each($checkFields)) { if(!$$checkFields[$theField]) { $errorMessages .= "<li>Missing $checkFields[$theField]</li>"; } } // If there are errors, display them and a back button. if($errorMessages) { ?> <p>Errors were found on the form.</p> <ul> <?php echo $errorMessages; ?> </ul> <p><input type="button" value="Back" onClick="history.back()"></p> <?php } // No errors, send the message and print out success message. else { // Build the email. $body = " Name: $Name Email: $Email Phone: $Phone ----- Comments ----- $Comments -------------------- $headers["From"] = $mailTo; $headers["To"] = $mailTo; $headers["Subject"] = $mailSubject; $params["host"] = $mailHost; $params["port"] = $mailPort; $params["auth"] = $mailAuth; $params["username"] = $mailTo; $params["password"] = $mailPassword; $headers = array ('From' => $from, 'To' => $to, 'Subject' => $subject); $smtp = Mail::factory('smtp', array ('host' => $host, 'auth' => true, 'username' => $username, 'password' => $password)); $mail = $smtp->send($mailTo, $headers, $body); if (PEAR::isError($mail)) { echo("<p>" . $mail->getMessage() . "</p>"); } else { echo("<p>Message successfully sent!</p>"); } // I would rather redirect to a different thank you page but both of next options don't work when taking out: echo("<p>Message successfully sent!</p>"); //RedirectToURL("thank-you.php"); or header(Location: "thank-you.php" ); ?> Depending on what I change about I either get: The website cannot display the page or a list of undefinable variables. If anyone is able to understand the php and notice where the problem lies I would be so grateful. Thank you. Quote Link to comment https://forums.phpfreaks.com/topic/260474-php-contact-form-sending-to-email-via-smtp-authentication/ Share on other sites More sharing options...
viviosoft Posted April 7, 2012 Share Posted April 7, 2012 I believe your error message is coming from the Mail class you are using. There's a lot more code in your second code example. I would start small and ONLY use what the Mail class requires to send the email. Take out the validation and the like and start there. Strip it down. Start by passing the values without the Mailer functions. For example: Echo the form values after you have submitted the form and see of you are getting those passed okay. Then move to your Mail operation. Once you get that working then move to your validation and the like. Comment out ALL your code in form-mailer2.php and add the following. If you don't see any data at all then you have a problem with calling your form-mailer2.php file. <?php echo 'Your posted values are: '; echo $_POST['Name']; echo $_POST['email']; echo $_POST['comment']; ?> Quote Link to comment https://forums.phpfreaks.com/topic/260474-php-contact-form-sending-to-email-via-smtp-authentication/#findComment-1335202 Share on other sites More sharing options...
bethlou Posted April 7, 2012 Author Share Posted April 7, 2012 Thankyou, I can see that would be most sensible. I have therefore changed the form-mailer.php to only containing your above code, and interestingly it comes up with a Windows page that the page cannot be displayed. I tried with and without being in <body></body> tags, checked the url for where I had uploaded it. Re-changed it, tried in a new file and saved as a different name, but still no joy. Other php pages, including the first one I evidenced first works still. Any thoughts? Many thanks Quote Link to comment https://forums.phpfreaks.com/topic/260474-php-contact-form-sending-to-email-via-smtp-authentication/#findComment-1335237 Share on other sites More sharing options...
bethlou Posted April 7, 2012 Author Share Posted April 7, 2012 Sorry, to update, got that bit working, the code you suggested, Thankyou Quote Link to comment https://forums.phpfreaks.com/topic/260474-php-contact-form-sending-to-email-via-smtp-authentication/#findComment-1335238 Share on other sites More sharing options...
bethlou Posted April 7, 2012 Author Share Posted April 7, 2012 Hi I'm starting to get somewhere, with an email being sent to the inbox, with the titles of Name: Email: Comments: on different lines however there is no content from the form being completed on the contact form. I think the problem is the $body line: $body = "Name: $Name\n\n Email: $Email\n\n Comments: $Comments"; I have checked with the contact form page and the field names are definitely as written with capitals etc: <p>Name: <input name="Name" size="30"> <p>E-mail: <input name="Email" size="30"> <p><textarea name="Comments" rows="5" cols="40"> Although the message is sent - the echo comes back with "Message successfully sent!" but there is also this too: Notice: Undefined variable: Name in /home/***/public_html/form_mailed.php on line 18 Notice: Undefined variable: Email in /home/***/public_html/form_mailed.php on line 19 Notice: Undefined variable: Comments in /home/***/public_html/form_mailed.php on line 19 This is the page so far: <?php error_reporting(E_ALL); ini_set('display_errors', True); $path = '/home/***/php'; set_include_path(get_include_path() . PATH_SEPARATOR . $path); require('Mail.php'); $from = "Info <info@**.co.uk>"; $to = "Info <info@**.co.uk>"; $subject = "Hi - Test message!"; $body = "Name: $Name\n\n Email: $Email\n\n Comments: $Comments"; $host = "mail.**.co.uk"; $username = "info@**.co.uk"; $password = "***"; $headers = array ('From' => $from, 'To' => $to, 'Subject' => $subject); $smtp = Mail::factory('smtp', array ('host' => $host, 'auth' => true, 'username' => $username, 'password' => $password)); $mail = $smtp->send($to, $headers, $body); if (PEAR::isError($mail)) { echo("<p>" . $mail->getMessage() . "</p>"); } else { echo("<p>Message successfully sent!</p>"); } ?> Thank you again, for your help and looking at this for me. It has given me the glimmer of hope I had almost lost. Louise Quote Link to comment https://forums.phpfreaks.com/topic/260474-php-contact-form-sending-to-email-via-smtp-authentication/#findComment-1335244 Share on other sites More sharing options...
viviosoft Posted April 7, 2012 Share Posted April 7, 2012 Your are most welcome. In your code. I notice $body = "Name: $Name\n\n Email: $Email\n\n Comments: $Comments" Where are $Name, $Email, and $Comments getting set? I believe that's where the error is happening. They this and see what happens. <?php error_reporting(E_ALL); ini_set('display_errors', True); $path = '/home/***/php'; set_include_path(get_include_path() . PATH_SEPARATOR . $path); // Set the email variables from the form here: $Name = $_POST['Name']; // Pass the Name value to the $Name variable $Email = $_POST['Email']; // Pass the Email value to the $Email variable $Comment = $_POST['Comment']; // Pass the Comment value to the $Comment variable require('Mail.php'); $from = "Info <info@**.co.uk>"; $to = "Info <info@**.co.uk>"; $subject = "Hi - Test message!"; $body = "Name: $Name\n\n Email: $Email\n\n Comments: $Comments"; $host = "mail.**.co.uk"; $username = "info@**.co.uk"; $password = "***"; $headers = array('From' => $from, 'To' => $to, 'Subject' => $subject); $smtp = Mail::factory('smtp', array('host' => $host, 'auth' => true, 'username' => $username, 'password' => $password)); $mail = $smtp->send($to, $headers, $body); if (PEAR::isError($mail)) { echo("<p>" . $mail->getMessage() . "</p>"); } else { echo("<p>Message successfully sent!</p>"); } ?> Quote Link to comment https://forums.phpfreaks.com/topic/260474-php-contact-form-sending-to-email-via-smtp-authentication/#findComment-1335254 Share on other sites More sharing options...
viviosoft Posted April 7, 2012 Share Posted April 7, 2012 Because you have error checking set in your code. Any PHP errors (like "Undefined variable") will be displayed. If you were to comment those two lines out, you would most likely not have seen those errors. It's a nice thing sometimes to be able to debug using the below two lines of code in PHP. However, sometimes those two lines of code could create error messages that you may not care about. error_reporting(E_ALL); ini_set('display_errors', True); Happy Coding!! Quote Link to comment https://forums.phpfreaks.com/topic/260474-php-contact-form-sending-to-email-via-smtp-authentication/#findComment-1335256 Share on other sites More sharing options...
bethlou Posted April 11, 2012 Author Share Posted April 11, 2012 Hi I just wanted to say thank you - I've got a form working via SMTP, yay - and none of those undefinable variables, turned out I hadn't put them in capitals as they are in my form Cheers Quote Link to comment https://forums.phpfreaks.com/topic/260474-php-contact-form-sending-to-email-via-smtp-authentication/#findComment-1336292 Share on other sites More sharing options...
websoftexpert Posted June 15, 2012 Share Posted June 15, 2012 Hi I am also trying to sent email using SMTP. I have used similar example on internet but that is not working. I think I am missing require page require("Mail.php"). Can you provide me complete working code along with missing require file? Thanks in advance Quote Link to comment https://forums.phpfreaks.com/topic/260474-php-contact-form-sending-to-email-via-smtp-authentication/#findComment-1354086 Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.