Page 1 of 1

How do I output form values in html php email?

Posted: Tue May 23, 2006 3:02 pm
by Subyne Simean
Hi, I have a form which uses the following form field names:

name
age
dob
interests
comments

What I am trying to do is output the values of the form into a html email to my personal email address. I have found this code to send a html email but I'm not sure how I output the values into the html.

I would be very grateful if someone could help me with this :)

Here's the PHP code for the html email:

Code: Select all

<?
    //change this to your email.
    $to = "a.mcleod4@ntlworld.com";
    $from = "noreply@myserver.com";
    $subject = "New message!";

    //begin of HTML message
    $message = <<<EOF
<html>
<body>
I would like to list the user's form input values here, that can be placed in html tables etc...
</body>
</html>
EOF;
   //end of message
    $headers  = "From: $from\r\n";
    $headers .= "Content-type: text/html\r\n";

    //options to send to cc+bcc
    //$headers .= "Cc: [email][/email]";
    //$headers .= "Bcc: [email][/email]";
    
    // now lets send the email.
    mail($to, $subject, $message, $headers);
?>

Posted: Tue May 23, 2006 3:06 pm
by RobertGonzalez
Remember to make sure to clean your vars before sending to prevent malicious people passing bad data.

Code: Select all

<?php
$name = $_POST['name'];
$age = $_POST['age'];
$dob = $_POST['dob'];
$interests = $_POST['interests'];
$comments = $_POST['comments'];
?>
Once the vars are assigned the values from the form, use them how you will throughout the script.

Also, you may want to check out d11wtq's SwiftMailer class for a neat PHP based mailing application. It is in the code Snippets section of this community.

Posted: Tue May 23, 2006 3:11 pm
by Flamie
yes, what everah said but then you need to do this to have them into your 1 $message variable:
$message = "name: ".$name."<br> age: ".$age". etc etc
This way you'll have the whole message in 1 variable and you can send it afterwards.
Good luck :)

thanks

Posted: Wed May 24, 2006 6:27 pm
by Subyne Simean
Thanks you have solved that for me! One thing... I have a text area for the comments. When I use carriage returns in the textarea, they are not replicated when sending the email. All the text just looks bunched up.

Is there an easy way to output the exact way someone types their message?

Re: thanks

Posted: Wed May 24, 2006 6:31 pm
by Chris Corbyn
Subyne Simean wrote:Thanks you have solved that for me! One thing... I have a text area for the comments. When I use carriage returns in the textarea, they are not replicated when sending the email. All the text just looks bunched up.

Is there an easy way to output the exact way someone types their message?
nl2br() will sort out the line breaks for you. If you want full on strucutures the same as the user types them try downloading a WYSIWYG editor like TinyMCE - it's pretty neat :)

Posted: Thu May 25, 2006 7:06 am
by Subyne Simean
sorry mate, how do i use that nl2br() thingy?

Posted: Thu May 25, 2006 7:14 am
by Chris Corbyn
Subyne Simean wrote:sorry mate, how do i use that nl2br() thingy?

Code: Select all

$string = "some string\nwith new lines\n in it";

echo nl2br($string);

/*
some string<br />
with new lines<br />
in it
*/

Posted: Thu May 25, 2006 9:54 am
by RobertGonzalez
Matt Mullenweg (of WordPress fame) developed a cool little snippet that is a bit more advanced version of nl2br(). I have used it a couple and it is pretty clean.

He has a few other neat little code bits if your interested in those as well.

Posted: Thu May 25, 2006 11:49 am
by Subyne Simean

Code: Select all

<?
    //change this to your email.
    $to = "a.mcleod4@ntlworld.com";
    $from = "noreply@myserver.com";
    $subject = "new message";

$name = $_POST['name'];
$age = $_POST['age'];
$dob = $_POST['dob'];
$interests = $_POST['interests'];
$comments = $_POST['comments'];

function wpautop($pee, $br = 1) {
        $pee = $pee . "\n"; // just to make things a little easier, pad the end
        $pee = preg_replace('|<br />\s*<br />|', "\n\n", $pee);
        // Space things out a little
        $pee = 

preg_replace('!(<(?:table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|selec

t|form|blockquote|address|math|p|h[1-6])[^>]*>)!', "\n$1", $pee); 
        $pee = 

preg_replace('!(</(?:table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|sele

ct|form|blockquote|address|math|p|h[1-6])>)!', "$1\n\n", $pee);
        $pee = str_replace(array("\r\n", "\r"), "\n", $pee); // cross-platform newlines 
        $pee = preg_replace("/\n\n+/", "\n\n", $pee); // take care of duplicates
        $pee = preg_replace('/\n?(.+?)(?:\n\s*\n|\z)/s', "<p>$1</p>\n", $pee); // make paragraphs, 

including one at the end 
        $pee = preg_replace('|<p>\s*?</p>|', '', $pee); // under certain strange conditions it could 

create a P of entirely whitespace 
        $pee = 

preg_replace('!<p>\s*(</?(?:table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|h

r|pre|select|form|blockquote|address|math|p|h[1-6])[^>]*>)\s*</p>!', "$1", $pee); // don't pee all 

over a tag
        $pee = preg_replace("|<p>(<li.+?)</p>|", "$1", $pee); // problem with nested lists
        $pee = preg_replace('|<p><blockquote([^>]*)>|i', "<blockquote$1><p>", $pee);
        $pee = str_replace('</blockquote></p>', '</p></blockquote>', $pee);
        $pee = 

preg_replace('!<p>\s*(</?(?:table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|h

r|pre|select|form|blockquote|address|math|p|h[1-6])[^>]*>)!', "$1", $pee);
        $pee = 

preg_replace('!(</?(?:table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|sel

ect|form|blockquote|address|math|p|h[1-6])[^>]*>)\s*</p>!', "$1", $pee); 
        if ($br) $pee = preg_replace('|(?<!<br />)\s*\n|', "<br />\n", $pee); // optionally make line 

breaks
        $pee = 

preg_replace('!(</?(?:table|thead|tfoot|caption|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|

blockquote|address|math|p|h[1-6])[^>]*>)\s*<br />!', "$1", $pee);
        $pee = preg_replace('!<br />(\s*</?(?:p|li|div|dl|dd|dt|th|pre|td|ul|ol)>)!', '$1', $pee);
        $pee = preg_replace('!(<pre.*?>)(.*?)</pre>!ise', " stripslashes('$1') .  

stripslashes(clean_pre('$2'))  . '</pre>' ", $pee);

        return $pee; 
}
    //begin of HTML message
    $message = <<<EOF
<html>
<head>
<style type="text/css">
body, td { background-color: white; font-family: Verdana; font-size: 12px; color: black; }
table { border: 3 double black; width: 400px; }
td { border: 1 solid black; padding: 4px; }
.heading { font-weight: bold; font-size: 16px; }
</style>
</head>
<body>
<table>
<tr>
<td colspan="2" class="heading">Smart Recruitmat (UK) Ltd</td>
</tr>
<tr>
<td><strong>Visitor name:</strong></td>
<td>$name</td>
</tr>
<tr>
<td><strong>Age:</strong></td>
<td>$age</td>
</tr>
<tr>
<td><strong>DOB:</strong></td>
<td><a href="mailto:$mail">$dob</a></td>
</tr>
<tr>
<td><strong>Interests:</strong></td>
<td>$interests</td>
</tr>
<tr>
<td><strong>Comments:</strong></td>
<td>$comments</td>
</tr>
</table>
EOF;
   //end of message
    $headers  = "From: $from\r\n";
    $headers .= "Content-type: text/html\r\n";

    //options to send to cc+bcc
    //$headers .= "Cc: [email][/email]";
    //$headers .= "Bcc: [email][/email]";
    header("Location: thankyou.html");

    // now lets send the email.
    mail($to, $subject, $message, $headers);
    
?>
I added that code &pee thingy into my php file... should it just work or do I need to do something else? Sorry guys, I'm bleedin' useless!

Posted: Thu May 25, 2006 12:43 pm
by RobertGonzalez
At the top of the script include the wpautop function...

Code: Select all

<?php
function wpautop($pee, $br = 1) {
	$pee = $pee . "\n"; // just to make things a little easier, pad the end
	$pee = preg_replace('|<br />\s*<br />|', "\n\n", $pee);
	// Space things out a little
	$pee = preg_replace('!(<(?:table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|blockquote|address|math|p|h[1-6])[^>]*>)!', "\n$1", $pee); 
	$pee = preg_replace('!(</(?:table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|blockquote|address|math|p|h[1-6])>)!', "$1\n\n", $pee);
	$pee = str_replace(array("\r\n", "\r"), "\n", $pee); // cross-platform newlines 
	$pee = preg_replace("/\n\n+/", "\n\n", $pee); // take care of duplicates
	$pee = preg_replace('/\n?(.+?)(?:\n\s*\n|\z)/s', "<p>$1</p>\n", $pee); // make paragraphs, including one at the end 
	$pee = preg_replace('|<p>\s*?</p>|', '', $pee); // under certain strange conditions it could create a P of entirely whitespace 
	$pee = preg_replace('!<p>\s*(</?(?:table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|hr|pre|select|form|blockquote|address|math|p|h[1-6])[^>]*>)\s*</p>!', "$1", $pee); // don't pee all over a tag
	$pee = preg_replace("|<p>(<li.+?)</p>|", "$1", $pee); // problem with nested lists
	$pee = preg_replace('|<p><blockquote([^>]*)>|i', "<blockquote$1><p>", $pee);
	$pee = str_replace('</blockquote></p>', '</p></blockquote>', $pee);
	$pee = preg_replace('!<p>\s*(</?(?:table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|hr|pre|select|form|blockquote|address|math|p|h[1-6])[^>]*>)!', "$1", $pee);
	$pee = preg_replace('!(</?(?:table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|blockquote|address|math|p|h[1-6])[^>]*>)\s*</p>!', "$1", $pee); 
	if ($br) $pee = preg_replace('|(?<!<br />)\s*\n|', "<br />\n", $pee); // optionally make line breaks
	$pee = preg_replace('!(</?(?:table|thead|tfoot|caption|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|blockquote|address|math|p|h[1-6])[^>]*>)\s*<br />!', "$1", $pee);
	$pee = preg_replace('!<br />(\s*</?(?:p|li|div|dl|dd|dt|th|pre|td|ul|ol)>)!', '$1', $pee);
	$pee = preg_replace('!(<pre.*?>)(.*?)</pre>!ise', " stripslashes('$1') .  stripslashes(clean_pre('$2'))  . '</pre>' ", $pee);

	return $pee; 
}
?>
Then in your code, run your comments through the function...

Code: Select all

<?php
 //change this to your email.
$to = "a.mcleod4@ntlworld.com";
$from = "noreply@myserver.com";
$subject = "new message";

$name = $_POST['name'];
$age = $_POST['age'];
$dob = $_POST['dob'];
$interests = wpauto($_POST['interests']);
$comments = wpautop($_POST['comments']);

    //begin of HTML message
    $message = <<<EOF
<html>
<head>
<style type="text/css">
body, td { background-color: white; font-family: Verdana; font-size: 12px; color: black; }
table { border: 3 double black; width: 400px; }
td { border: 1 solid black; padding: 4px; }
.heading { font-weight: bold; font-size: 16px; }
</style>
</head>
<body>
<table>
<tr>
<td colspan="2" class="heading">Smart Recruitmat (UK) Ltd</td>
</tr>
<tr>
<td><strong>Visitor name:</strong></td>
<td>$name</td>
</tr>
<tr>
<td><strong>Age:</strong></td>
<td>$age</td>
</tr>
<tr>
<td><strong>DOB:</strong></td>
<td><a href="mailto:$mail">$dob</a></td>
</tr>
<tr>
<td><strong>Interests:</strong></td>
<td>$interests</td>
</tr>
<tr>
<td><strong>Comments:</strong></td>
<td>$comments</td>
</tr>
</table>
EOF;
   //end of message
    $headers  = "From: $from\r\n";
    $headers .= "Content-type: text/html\r\n";

    //options to send to cc+bcc
    //$headers .= "Cc: [email][/email]";
    //$headers .= "Bcc: [email][/email]";
    header("Location: thankyou.html");

    // now lets send the email.
    mail($to, $subject, $message, $headers);
   
?>

Posted: Thu May 25, 2006 1:13 pm
by Subyne Simean
I bow to you

Posted: Thu May 25, 2006 3:03 pm
by RobertGonzalez
Glad it worked.