Peter Kroman
asked on
Sending content of a form to one specific e-mail adress
Hi,
I am working on this page: https://kroweb.dk/gfdev/kontakt/
The form is a contact form which is meant to send its content to one specific e-mail address on submit.
The form:
The "action" file (send-email.php)
I need a little help to create the code that actually sends this e-mail, and to setup the if statement below to check if the e-mail is actually sent.
If anybody has ideas I am all ears :)
I am working on this page: https://kroweb.dk/gfdev/kontakt/
The form is a contact form which is meant to send its content to one specific e-mail address on submit.
The form:
<form id="myForm" action="send-email.php" method="post">
<?php if (isset($_SESSION['response'])): ?>
<?php
$response = json_decode($_SESSION['response']);
unset($_SESSION['response']);
?>
<div class="message <?php echo $response->success ? "success" : "error" ?>">
<?php echo $response->message; ?>
</div>
<?php endif ?>
<p class="form-input-top">Navn</p>
<input class="form-input" type="text" placeholder="Skriv dit navn" name="navn" id="navn" value="" required><br>
<p class="form-input-top">E-mail</p>
<input class="form-input" type="text" placeholder= "Skriv din e-mail adresse her" name= "e-mail" id="e-mail" value= "" required><br>
<p class="form-input-top">Emne</p>
<input class="form-input" type="text" placeholder= "Skrive dit emne her" name= "emne" id="emne" value="" required><br>
<p class="form-input-top">Besked</p>
<textarea class="form-input" type="textarea" placeholder= "Skriv din besked her" name= "besked" id="besked" value="" required></textarea><br>
<input type="text" placeholder= "Kort" name= "kort" id="Kort" value="  ️" hidden>
<div id="buttons">
<input class="form-button" type="submit" id= "send-btn" value="Send">
<input class="form-button" type="reset" id= "reset-btn" value="Fortryd">
</div>
</form>
The "action" file (send-email.php)
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
// Start the session
session_start();
$navn = $_POST['navn'];
$email = $_POST['e-mail'];
$emne = $_POST['emne'];
$besked = $_POST['besked'];
// Prevent direct access to the script
if (!isset($_POST['navn'])) die("Access Denied!");
// Code that sends the content of the form to one email adress
if (null !== ($_POST['navn'] && $_POST['e-mail'] && $_POST['emne'] && $_POST['besked'] )): // should be changed to something like if(the e-mail is actually sent):
$response = array(
"message" => "Din-email er sendt"
);
else:
$response = array(
"success" => 0,
"message" => "Noget gik galt. Prøv igen."
);
endif;
// Let's push the response to the SESSION
$_SESSION['response'] = json_encode($response);
// And send the user on his way
header('Location: ' . $_SERVER['HTTP_REFERER']);
?>
I need a little help to create the code that actually sends this e-mail, and to setup the if statement below to check if the e-mail is actually sent.
If anybody has ideas I am all ears :)
ASKER
Thanks Chris,
Looking ....
Looking ....
ASKER
OK. Tried this code. It says (in the message) that the mail is sent - but nothing seems to be sent. What am I doing wrong?
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
// Start the session
session_start();
$navn = $_POST['navn'];
$email = $_POST['e-mail'];
$emne = $_POST['emne'];
$besked = $_POST['besked'];
// Prevent direct access to the script
if (!isset($_POST['navn'])) die("Access Denied!");
// Code that sends the content of the form to one email adress
$message = $navn && $email && $emne && $besked;
$sent = mail('peter_kroman@genealogiskforum.dk', 'Henvendelse via Kontakt form på Gf', $message);
if ($sent):
$response = array(
"message" => "Din-email er sendt"
);
else:
$response = array(
"success" => 0,
"message" => "Noget gik galt. Prøv igen."
);
endif;
// Let's push the response to the SESSION
$_SESSION['response'] = json_encode($response);
// And send the user on his way
header('Location: ' . $_SERVER['HTTP_REFERER']);
?>
Hey Peter,
Fundamentally, you're not doing anything wrong. The mail() function will return true if it successfully passed the email off to the mail transport agent (SMTP) on your server. If the transport agent then fails to send the message, you won't know about it. This could be down to how your server is configured. You should check with your host on whether sendmail is configured correctly. You may also need to check the php.ini file which will contain some of the config settings. It may also be that the email you're sending needs additional info - this is provided by adding headers to the email:
Fundamentally, you're not doing anything wrong. The mail() function will return true if it successfully passed the email off to the mail transport agent (SMTP) on your server. If the transport agent then fails to send the message, you won't know about it. This could be down to how your server is configured. You should check with your host on whether sendmail is configured correctly. You may also need to check the php.ini file which will contain some of the config settings. It may also be that the email you're sending needs additional info - this is provided by adding headers to the email:
$to = 'nobody@example.com';
$subject = 'the subject';
$message = 'hello';
$headers = array(
'From' => 'webmaster@example.com',
'Reply-To' => 'webmaster@example.com'
'X-Mailer' => 'PHP/' . phpversion()
);
mail($to, $subject, $message, $headers);
It's for this reason that using something like PHPMailer is often preferred over the standard mail() function, and I'd certainly recommend you take that route. You get to set the options in a much more friendly way.
ASKER
I'll dive into PHP mailer :)
ASKER
Well - now I have got the phpmailer folder and composer.phar uploaded like this .
And what to do next??
It says everywhere that it is SO easy to install with Composer. But it is not very easy to guess how you do it when this is not something you have done before :)
I simply don't understand the explanations here: https://github.com/PHPMailer/PHPMailer.
So I need some help to get phpmailer set up and working.
Please :) :)
And what to do next??
It says everywhere that it is SO easy to install with Composer. But it is not very easy to guess how you do it when this is not something you have done before :)
I simply don't understand the explanations here: https://github.com/PHPMailer/PHPMailer.
So I need some help to get phpmailer set up and working.
Please :) :)
OK Peter,
That looks like you've downloaded the PHPLibrary rather than install it using Composer. Is that correct ?? If so, you will need to include (require) the relevant files in your mail script:
That looks like you've downloaded the PHPLibrary rather than install it using Composer. Is that correct ?? If so, you will need to include (require) the relevant files in your mail script:
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require '/gfdev/resources/PHPMailer-6.0/src/Exception.php';
require '/gfdev/resources/PHPMailer-6.0/src/PHPMailer.php';
require '/gfdev/resources/PHPMailer-6.0/src/SMTP.php';
$mail = new PHPMailer(true); // Passing `true` enables exceptions
try {
//Server settings
$mail->SMTPDebug = 2; // Enable verbose debug output
$mail->isSMTP(); // Set mailer to use SMTP
$mail->SMTPAuth = true; // Enable SMTP authentication
$mail->Username = 'user@example.com'; // SMTP username
$mail->Password = 'secret'; // SMTP password
$mail->SMTPSecure = 'tls'; // Enable TLS encryption, `ssl` also accepted
$mail->Port = 587; // TCP port to connect to
//Recipients
$mail->setFrom('chris@example.com', 'Chris');
$mail->addAddress('someone@example.net', 'Someone Else'); // Add a recipient
$mail->addReplyTo('chris@example.com', 'Chris');
//Content
$mail->Subject = 'Here is the subject';
$mail->Body = 'This is the HTML message body';
$mail->send();
echo 'Message has been sent';
} catch (Exception $e) {
echo 'Message could not be sent. Mailer Error: ', $mail->ErrorInfo;
}
Whilst your testing this, just create a script to send a basic email - take all of the POST / SESSION stuff out of the equation.
ASKER
Thanks Chris,
I'll try at once :)
I'll try at once :)
ASKER
Hi again,
I get this error:
2018-05-03 14:34:02 SMTP ERROR: Failed to connect to server: Connection refused (111)
SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting
Meddelelsen kunne ikke sendes. Mailer Error: SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting
with this code:
I have also tested port 465 and 993 - same result :)
But should I not set the right servers too - here is what they are in my mail system
I get this error:
2018-05-03 14:34:02 SMTP ERROR: Failed to connect to server: Connection refused (111)
SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting
Meddelelsen kunne ikke sendes. Mailer Error: SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting
with this code:
// Code that sends the content of the form to one email adress
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require '../resources/PHPMailer-6.0/src/Exception.php';
require '../resources/PHPMailer-6.0/src/PHPMailer.php';
require '../resources/PHPMailer-6.0/src/SMTP.php';
$mail = new PHPMailer(true); // Passing `true` enables exceptions
try {
//Server settings
$mail->SMTPDebug = 2; // Enable verbose debug output
$mail->isSMTP(); // Set mailer to use SMTP
$mail->SMTPAuth = true; // Enable SMTP authentication
$mail->Username = 'admin@genealogiskforum.dk'; // SMTP username
$mail->Password = '#myPassword"'; // SMTP password
$mail->SMTPSecure = 'tls'; // Enable TLS encryption, `ssl` also accepted
$mail->Port = 587; // TCP port to connect to
//Recipients
$mail->setFrom('admin@genealogiskforum.dk', 'Admin');
$mail->addAddress('peter_kroman@genealogiskforum.dk', 'Peter Gf'); // Add a recipient
//$mail->addReplyTo('', '');
//Content
$mail->Subject = 'Meddelelse fra Gf Kontakt ';
$mail->Body = 'This is the HTML message body';
$mail->send();
echo 'Meddelelsen er sendt';
} catch (Exception $e) {
echo 'Meddelelsen kunne ikke sendes. Mailer Error: ', $mail->ErrorInfo;
}
I have also tested port 465 and 993 - same result :)
But should I not set the right servers too - here is what they are in my mail system
If you don't set a Host address it will default to localhost, which is the server the script is running on. If you need to send out through a specific server, then Yes - you should be setting a Host. Add a value to the Host property in your config and give that a go:
$mail->SMTPDebug = 2; // Enable verbose debug output
$mail->isSMTP(); // Set mailer to use SMTP
$mail->Host = 'asmtp.unoeuro,com';
$mail->SMTPAuth = true; // Enable SMTP authentication
$mail->Username = 'admin@genealogiskforum.dk'; // SMTP username
$mail->Password = '#myPassword"';
You might also want to set the reply address. Some servers may reject mail if it's not set:$mail->setFrom('admin@genealogiskforum.dk', 'Admin');
$mail->addAddress('peter_kroman@genealogiskforum.dk', 'Peter Gf'); // Add a recipient
$mail->addReplyTo('admin@genealogiskforum.dk', 'Admin');
ASKER
Right :)
Now I get this message. How do I get around that about automated mails?
I know that this can work because I have it working with these exact credentials on a similar page built from RapidWeaver .... (https://genealogiskforum.dk/kontakt/)
2018-05-03 15:04:00 SERVER -> CLIENT: 220 asmtp.unoeuro.com - Ready. No automated mails or mass-mailing activities allowed.
2018-05-03 15:04:00 CLIENT -> SERVER: EHLO kroweb.dk
2018-05-03 15:04:00 SERVER -> CLIENT: 250-asmtp.unoeuro.com250-P IPELINING2 50-SIZE250 -ETRN250-S TARTTLS250 -AUTH PLAIN LOGIN CRAM-MD5250-ENHANCEDSTATUS CODES250-8 BITMIME250 DSN
2018-05-03 15:04:00 CLIENT -> SERVER: STARTTLS
2018-05-03 15:04:00 SERVER -> CLIENT: 220 2.0.0 Ready to start TLS
2018-05-03 15:04:00 CLIENT -> SERVER: EHLO kroweb.dk
2018-05-03 15:04:00 SERVER -> CLIENT: 250-asmtp.unoeuro.com250-P IPELINING2 50-SIZE250 -ETRN250-A UTH PLAIN LOGIN CRAM-MD5250-ENHANCEDSTATUS CODES250-8 BITMIME250 DSN
2018-05-03 15:04:00 CLIENT -> SERVER: AUTH CRAM-MD5
2018-05-03 15:04:00 SERVER -> CLIENT: 334 PDUyNDE4NTE1MzY2OTk4NDguMT UyNTM1OTg0 MEBhc210cC 51bm9ldXJv LmNvbT4=
2018-05-03 15:04:00 CLIENT -> SERVER: YWRtaW5AZ2VuZWFsb2dpc2tmb3 J1bS5kayBh YTkxMDY1MD YyYzExMmE2 ODFmZWRiYW UzY2QxMDNk Mg==
2018-05-03 15:04:00 SERVER -> CLIENT: 235 2.7.0 Authentication successful
2018-05-03 15:04:00 CLIENT -> SERVER: MAIL FROM:<admin@genealogiskfor um.dk>
2018-05-03 15:04:00 SERVER -> CLIENT: 250 2.1.0 Ok
2018-05-03 15:04:00 CLIENT -> SERVER: RCPT TO:<peter_kroman@genealogi skforum.dk >
2018-05-03 15:04:00 SERVER -> CLIENT: 554 5.7.1 <linux159.unoeuro.com[94.2 31.103.180 ]>: Client host rejected: Relay from servers and automated mails are not allowed
2018-05-03 15:04:00 SMTP ERROR: RCPT TO command failed: 554 5.7.1 <linux159.unoeuro.com[94.2 31.103.180 ]>: Client host rejected: Relay from servers and automated mails are not allowed
2018-05-03 15:04:00 CLIENT -> SERVER: QUIT
2018-05-03 15:04:10 SERVER -> CLIENT: 221 2.0.0 Bye
SMTP Error: The following recipients failed: peter_kroman@genealogiskfo rum.dk: <linux159.unoeuro.com[94.2 31.103.180 ]>: Client host rejected: Relay from servers and automated mails are not allowed
Meddelelsen kunne ikke sendes. Mailer Error: SMTP Error: The following recipients failed: peter_kroman@genealogiskfo rum.dk: : Client host rejected: Relay from servers and automated mails are not allowed
Now I get this message. How do I get around that about automated mails?
I know that this can work because I have it working with these exact credentials on a similar page built from RapidWeaver .... (https://genealogiskforum.dk/kontakt/)
2018-05-03 15:04:00 SERVER -> CLIENT: 220 asmtp.unoeuro.com - Ready. No automated mails or mass-mailing activities allowed.
2018-05-03 15:04:00 CLIENT -> SERVER: EHLO kroweb.dk
2018-05-03 15:04:00 SERVER -> CLIENT: 250-asmtp.unoeuro.com250-P
2018-05-03 15:04:00 CLIENT -> SERVER: STARTTLS
2018-05-03 15:04:00 SERVER -> CLIENT: 220 2.0.0 Ready to start TLS
2018-05-03 15:04:00 CLIENT -> SERVER: EHLO kroweb.dk
2018-05-03 15:04:00 SERVER -> CLIENT: 250-asmtp.unoeuro.com250-P
2018-05-03 15:04:00 CLIENT -> SERVER: AUTH CRAM-MD5
2018-05-03 15:04:00 SERVER -> CLIENT: 334 PDUyNDE4NTE1MzY2OTk4NDguMT
2018-05-03 15:04:00 CLIENT -> SERVER: YWRtaW5AZ2VuZWFsb2dpc2tmb3
2018-05-03 15:04:00 SERVER -> CLIENT: 235 2.7.0 Authentication successful
2018-05-03 15:04:00 CLIENT -> SERVER: MAIL FROM:<admin@genealogiskfor
2018-05-03 15:04:00 SERVER -> CLIENT: 250 2.1.0 Ok
2018-05-03 15:04:00 CLIENT -> SERVER: RCPT TO:<peter_kroman@genealogi
2018-05-03 15:04:00 SERVER -> CLIENT: 554 5.7.1 <linux159.unoeuro.com[94.2
2018-05-03 15:04:00 SMTP ERROR: RCPT TO command failed: 554 5.7.1 <linux159.unoeuro.com[94.2
2018-05-03 15:04:00 CLIENT -> SERVER: QUIT
2018-05-03 15:04:10 SERVER -> CLIENT: 221 2.0.0 Bye
SMTP Error: The following recipients failed: peter_kroman@genealogiskfo
Meddelelsen kunne ikke sendes. Mailer Error: SMTP Error: The following recipients failed: peter_kroman@genealogiskfo
OK. Looks like you'll need to speak to your hosting company to see if there's any specific config that you need to provide. These problems are nearly always down to the way the server is configured, so not sure what else I can suggest. The code I've provided works as-is on my server, so I know it's correct (for my server!)
ASKER
Thanks Chris,
I am working on it, and I will be back to morrow :)
Take care :)
I am working on it, and I will be back to morrow :)
Take care :)
ASKER
I am back again - and a little less frustrated than yesterday - sorry for that :)
Well - I have now got it to send an email logging in to another of my mail accounts, which I can live with :)
But I still have a few issues. The code now looks like this:
The remaining issues are:
1. The charset in the e-mail is not UTF-8. How to set that right?
2. it goes very slowly - I think it might be the $mail->ErrorInfo that takes time?? How do I fix that?
3. I need the e-mail to reflect all the four lines in the form - on four lines in the e-mail. How do I set that up?
4. I need to return to the form after sending the e-mail, and not stay on the "action-file" page. The line: header('Location: ' . $_SERVER['HTTP_REFERER']); gives an error so I have commented that out for now. How do I set this up?
5. The form should reset after submitting, which it is not doing now. How do I fix that?
Well - I have now got it to send an email logging in to another of my mail accounts, which I can live with :)
But I still have a few issues. The code now looks like this:
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
// Start the session
session_start();
$navn = $_POST['navn'];
$email = $_POST['e-mail'];
$emne = $_POST['emne'];
$besked = $_POST['besked'];
// Prevent direct access to the script
if (!isset($_POST['navn'])) die("Access Denied!");
// Code that sends the content of the form to one email adress
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require '../resources/PHPMailer-6.0/src/Exception.php';
require '../resources/PHPMailer-6.0/src/PHPMailer.php';
require '../resources/PHPMailer-6.0/src/SMTP.php';
$mail = new PHPMailer(true); // Passing `true` enables exceptions
try {
//Server settings
$mail->SMTPDebug = 2; // Enable verbose debug output
$mail->isSMTP(); // Set mailer to use SMTP
$mail->Host = 'smtp.live.com';
$mail->SMTPAuth = true; // Enable SMTP authentication
$mail->Username = 'peter_kroman@live.dk'; // SMTP username
$mail->Password = 'myPassword?'; // SMTP password
$mail->SMTPSecure = 'tls'; // Enable TLS encryption, `ssl` also accepted
$mail->Port = 587; // TCP port to connect to
//Recipients
$mail->setFrom('peter_kroman@live.dk', 'Admin');
$mail->addAddress('peter_kroman@genealogiskforum.dk', 'Peter Gf'); // Add a recipient
$mail->addReplyTo($email, $navn);
//Content
$mail->Subject = 'genealogiskforum.dk fra Kontakt';
$mail->Body = $besked;
$mail->send();
echo 'Meddelelsen er sendt';
} catch (Exception $e) {
echo 'Meddelelsen kunne ikke sendes. Mailer Error: ', $mail->ErrorInfo;
}
if ($mail->send()):
$response = array(
"success" => 1,
"message" => "Din-email er sendt"
);
else:
$response = array(
"success" => 0,
"message" => "Noget gik galt. Prøv igen."
);
endif;
// Let's push the response to the SESSION
$_SESSION['response'] = json_encode($response);
// And send the user on his way
//header('Location: ' . $_SERVER['HTTP_REFERER']);
?>
The remaining issues are:
1. The charset in the e-mail is not UTF-8. How to set that right?
2. it goes very slowly - I think it might be the $mail->ErrorInfo that takes time?? How do I fix that?
3. I need the e-mail to reflect all the four lines in the form - on four lines in the e-mail. How do I set that up?
4. I need to return to the form after sending the e-mail, and not stay on the "action-file" page. The line: header('Location: ' . $_SERVER['HTTP_REFERER']);
5. The form should reset after submitting, which it is not doing now. How do I fix that?
Hey Peter. Glad you got it sending. Looks like your original mail server didn't allow the sending.
OK. To set the Character Set to UTF-8, you just set the property:
$mail->CharSet = 'UTF-8';
Regarding going slowly, it's not likely to be the ErrorInfo as that only gets called if there's an actual error. You are however sending the email twice in your code, which may slow things down. Each time you call $mail->Send(), the message get' sent, so you should only call that once. Sending an email won't be immediate as it has to connect to a remote server, so there is likely to be a slight delay.
You can generate whatever message you like, so if you want all four lines in the form, then build your message like so:
$_POST['navn'] . PHP_EOL . $_POST['e-mail'] . PHP_EOL . $_POST['emne'] . PHP_EOL . $_POST['besked'] . PHP_EOL;
This will concatenate your 4 fields into 4 new lines (PHP_EOL is the code for a new line);
The reason your header() method gives an error is because you have already output some data (echo 'Meddelelsen er sendt';). Header calls will only work if you haven't already output some info.
Resetting the form can be done a couple of ways, depending on how you're calling the mailing script. If you're calling it like a normal form (POST) then it should reset when the script redirects back to it. If you're calling it using an AJAX call (probably the nicest way to do it), then you can call the reset() method on the form:
$('#myForm').trigger("rese t");
Have a look at the following:
OK. To set the Character Set to UTF-8, you just set the property:
$mail->CharSet = 'UTF-8';
Regarding going slowly, it's not likely to be the ErrorInfo as that only gets called if there's an actual error. You are however sending the email twice in your code, which may slow things down. Each time you call $mail->Send(), the message get' sent, so you should only call that once. Sending an email won't be immediate as it has to connect to a remote server, so there is likely to be a slight delay.
You can generate whatever message you like, so if you want all four lines in the form, then build your message like so:
$_POST['navn'] . PHP_EOL . $_POST['e-mail'] . PHP_EOL . $_POST['emne'] . PHP_EOL . $_POST['besked'] . PHP_EOL;
This will concatenate your 4 fields into 4 new lines (PHP_EOL is the code for a new line);
The reason your header() method gives an error is because you have already output some data (echo 'Meddelelsen er sendt';). Header calls will only work if you haven't already output some info.
Resetting the form can be done a couple of ways, depending on how you're calling the mailing script. If you're calling it like a normal form (POST) then it should reset when the script redirects back to it. If you're calling it using an AJAX call (probably the nicest way to do it), then you can call the reset() method on the form:
$('#myForm').trigger("rese
Have a look at the following:
try {
//Server settings
$mail->SMTPDebug = 2; // Enable verbose debug output
$mail->isSMTP(); // Set mailer to use SMTP
$mail->Host = 'smtp.live.com';
$mail->SMTPAuth = true; // Enable SMTP authentication
$mail->Username = 'peter_kroman@live.dk'; // SMTP username
$mail->Password = 'myPassword?'; // SMTP password
$mail->SMTPSecure = 'tls'; // Enable TLS encryption, `ssl` also accepted
$mail->Port = 587; // TCP port to connect to
$mail->CharSet = 'UTF-8';
//Recipients
$mail->setFrom('peter_kroman@live.dk', 'Admin');
$mail->addAddress('peter_kroman@genealogiskforum.dk', 'Peter Gf'); // Add a recipient
$mail->addReplyTo($_POST['e-mail'], $_POST['navn']);
//Content
$mail->Subject = 'genealogiskforum.dk fra Kontakt';
$mail->Body = $_POST['navn'] . PHP_EOL . $_POST['e-mail'] . PHP_EOL . $_POST['emne'] . PHP_EOL . $_POST['besked'] . PHP_EOL;
$mail->send();
$response = array(
"success" => 1,
"message" => "Din-email er sendt"
);
} catch (Exception $e) {
$response = array(
"success" => 0,
"message" => "Noget gik galt. Prøv igen."
);
}
// Let's push the response to the SESSION
$_SESSION['response'] = json_encode($response);
// And send the user on his way
header('Location: ' . $_SERVER['HTTP_REFERER']);
One thing I missed in my previous comment. When i said the header function would error if you output anything, I referred to the echo 'Meddelelsen er sendt' line. Because you have the debug mode switched on, that will also output a lot of information, breaking the header() call.
If you need to use the header() call, then you should either turn off the debug (suggested for production):
$mail->SMTPDebug = 0;
Or you can turn on Output buffering in your script, and then flush it before header call.
If you need to use the header() call, then you should either turn off the debug (suggested for production):
$mail->SMTPDebug = 0;
Or you can turn on Output buffering in your script, and then flush it before header call.
ASKER
Yes - the line $mail->SMTPDebug = 0; returns now only the message 'Meddelelsen er sendt' :)
ASKER
Hey - I did'nt see your first post above.
I am going to work at once :)
I am going to work at once :)
Cool. That will still break your header call though because you've output data BEFORE calling header (i.e you've echoed something out). If you want you header() call to work, then you'll need to make sure nothing is echoed out before calling it.
ASKER
Everything seems to be working now :) The reset of the form came by it self as the other things got working right
The lase little issue I have is that I would like to be able to CSS control the output to the e-mail. The mail content is now built like this:
The lase little issue I have is that I would like to be able to CSS control the output to the e-mail. The mail content is now built like this:
//Content
$mail->Subject = 'genealogiskforum.dk fra Kontakt';
$mail->Body = 'Navn: ' . $_POST['navn'] . PHP_EOL . 'e-mail: ' . $_POST['e-mail'] . PHP_EOL . 'Emne: ' . $_POST['emne'] . PHP_EOL . 'Besked: ' . $_POST['besked'] . PHP_EOL;
OK Peter,
If you want to control the CSS, then you'll need to format your email to be HTML. CSS in HTML emails is only really basically supported so don't expect great things. You would then need to setup your message body to be a complete HTML document, including the CSS. You can either do this 'inline' or with an include. We should also include a non-html version of your email in the AltBody property for those that don't have HTML email clients:
If you want to control the CSS, then you'll need to format your email to be HTML. CSS in HTML emails is only really basically supported so don't expect great things. You would then need to setup your message body to be a complete HTML document, including the CSS. You can either do this 'inline' or with an include. We should also include a non-html version of your email in the AltBody property for those that don't have HTML email clients:
//Content
$htmlMessage = <<< EOT
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Chris Stanyon</title>
<style type="text/css">
body { font-family: Arial, Helvetica, sans-serif; font-size: 12px; }
table { border: 1px solid green; }
td { padding: 10px; }
</style>
</head>
<body>
<table>
<tr>
<td>Name:</td>
<td>{$_POST['navn']}</td>
</tr>
<tr>
<td>Email:</td>
<td><a href="{$_POST['e-mail']}">{$_POST['e-mail']}</a></td>
</tr>
<tr>
<td>Emne:</td>
<td>{$_POST['emne']}</td>
</tr>
<tr>
<td>Beksed:</td>
<td>{$_POST['besked']}</td>
</tr>
</table>
</body>
</html>
EOT;
$mail->isHTML(true); // Set email format to HTML
$mail->Subject = 'genealogiskforum.dk fra Kontakt';
$mail->Body = $htmlMessage;
$mail->AltBody = 'Navn: ' . $_POST['navn'] . PHP_EOL . 'e-mail: ' . $_POST['e-mail'] . PHP_EOL . 'Emne: ' . $_POST['emne'] . PHP_EOL . 'Besked: ' . $_POST['besked'] . PHP_EOL;
$mail->send();
ASKER
OK. Thanks Chris,
I will work with this :)
I will work with this :)
ASKER
Hey Peter. No - if you want fonts (or any formatting), then you have to go with HTML. Plain text is exactly what it sounds like - plain text!
What do mean specifically when you say 'it's not working'. I've tested the code I sent and it worked as it should. Post up your code and I'll take a look
What do mean specifically when you say 'it's not working'. I've tested the code I sent and it worked as it should. Post up your code and I'll take a look
ASKER
It returns a success message, but is is not sending any mail with the HTML stuff.
The phpmailer code:
The mail-body.php code (your code)
The phpmailer code:
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
// Start the session
session_start();
$navn = $_POST['navn'];
$email = $_POST['e-mail'];
$emne = $_POST['emne'];
$besked = $_POST['besked'];
// Prevent direct access to the script
if (!isset($_POST['navn'])) die("Access Denied!");
// Code that sends the content of the form to one email adress
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require '../resources/PHPMailer-6.0/src/Exception.php';
require '../resources/PHPMailer-6.0/src/PHPMailer.php';
require '../resources/PHPMailer-6.0/src/SMTP.php';
$mail = new PHPMailer(true); // Passing `true` enables exceptions
try {
$mail->CharSet = 'UTF-8';
//Server settings
$mail->SMTPDebug = 0; // Enable verbose debug output
$mail->isSMTP(); // Set mailer to use SMTP
$mail->Host = 'smtp.live.com';
$mail->SMTPAuth = true; // Enable SMTP authentication
$mail->Username = 'peter_kroman@live.dk'; // SMTP username
$mail->Password = 'mYpassword'; // SMTP password
$mail->SMTPSecure = 'tls'; // Enable TLS encryption, `ssl` also accepted
$mail->Port = 587; // TCP port to connect to
//Recipients
$mail->setFrom('peter_kroman@live.dk', 'Admin');
$mail->addAddress('peter_kroman@genealogiskforum.dk', 'Peter Gf'); // Add a recipient
$mail->addReplyTo($email, $navn);
// Send the user on his way
header('Location: ' . $_SERVER['HTTP_REFERER']);
//Content
$mail->Subject = 'genealogiskforum.dk fra Kontakt';
include('mail-body.php');
//$mail->Body = 'Navn: ' . $_POST['navn'] . PHP_EOL . 'e-mail: ' . $_POST['e-mail'] . PHP_EOL . 'Emne: ' . $_POST['emne'] . PHP_EOL . 'Besked: ' . $_POST['besked'] . PHP_EOL;
//$mail->send();
$response = array(
"success" => 1,
"message" => "Din-email er sendt"
);
} catch (Exception $e) {
$response = array(
"success" => 0,
"message" => "Noget gik galt. Prøv igen."
);
}
// Let's push the response to the SESSION
$_SESSION['response'] = json_encode($response);
?>
The mail-body.php code (your code)
//Content
$htmlMessage = <<< EOT
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Chris Stanyon</title>
<style type="text/css">
body { font-family: Arial, Helvetica, sans-serif; font-size: 12px; }
table { border: 1px solid green; }
td { padding: 10px; }
</style>
</head>
<body>
<table>
<tr>
<td>Name:</td>
<td>{$_POST['navn']}</td>
</tr>
<tr>
<td>Email:</td>
<td><a href="{$_POST['e-mail']}">{$_POST['e-mail']}</a></td>
</tr>
<tr>
<td>Emne:</td>
<td>{$_POST['emne']}</td>
</tr>
<tr>
<td>Beksed:</td>
<td>{$_POST['besked']}</td>
</tr>
</table>
</body>
</html>
EOT;
$mail->isHTML(true); // Set email format to HTML
$mail->Subject = 'genealogiskforum.dk fra Kontakt';
$mail->Body = $htmlMessage;
$mail->AltBody = 'Navn: ' . $_POST['navn'] . PHP_EOL . 'e-mail: ' . $_POST['e-mail'] . PHP_EOL . 'Emne: ' . $_POST['emne'] . PHP_EOL . 'Besked: ' . $_POST['besked'] . PHP_EOL;
$mail->send();
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Cheers :)
Now it is working nicely.
Thanks a lot Chris.
Now it is working nicely.
Thanks a lot Chris.
No worries Peter :)
Depending on your needs, there are a couple of options. Probably the most robust way, with lots of options, is to use a pre-built library. PHPMailer is a very popular and an easy one to use. You can find all the info you need here: https://github.com/PHPMail
If you want to roll your own solution and only have very simple needs, then PHP has built in mail capabilities with the mail() function. You can read all about it here: http://php.net/manual/en/f
A very simple example follows:
Open in new window
Whichever method you choose, they both return a a boolean (true/false) when you send the mail so you can check whether it sent or not.