Solved

PHP Mail() Headers - Problems sending valid data.

Posted on 2006-12-01
22
226 Views
Last Modified: 2006-12-01
Hi guys,

I have recently been looking at the mail() function for a new project on a new dedicated server we have. I have copied "Example 4. Sending HTML email" from the PHP manual (http://uk.php.net/manual/en/function.mail.php) exactly and tried sending the mail but all the headers get put into the email body and dont seem to want to stay in the header section of the email.

Is there a setting in Apache/PHP.ini that might be wrong as this is a server from an ISP? Maybe I haven't set something up properly?

Any ideas?

Thanks,
MOZ
0
Comment
Question by:nikez2k4
  • 9
  • 8
  • 4
  • +1
22 Comments
 
LVL 13

Expert Comment

by:rhickmott
ID: 18052495
What is the code your using to send?

Normally headers int he body are caused by erroneous /r/n's
0
 
LVL 1

Author Comment

by:nikez2k4
ID: 18052501
Sorry... just FYI:

The code I am using:
************************************************************************************************
            // multiple recipients
            $to  = 'marshall@landau-forte.org.uk';
            
            // subject
            $subject = 'Birthday Reminders for August';
            
            // message
            $message = '
            <html>
            <head>
              <title>Birthday Reminders for August</title>
            </head>
            <body>
              <p>Here are the birthdays upcoming in August!</p>
              <table>
               <tr>
                   <th>Person</th><th>Day</th><th>Month</th><th>Year</th>
               </tr>
               <tr>
                   <td>Joe</td><td>3rd</td><td>August</td><td>1970</td>
               </tr>
               <tr>
                   <td>Sally</td><td>17th</td><td>August</td><td>1973</td>
               </tr>
              </table>
            </body>
            </html>
            ';
            
            // To send HTML mail, the Content-type header must be set
            $headers  = 'MIME-Version: 1.0' . "\r\n";
            $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
            
            // Additional headers
            $headers .= 'From: Birthday Reminder <birthday@example.com>' . "\r\n";
            
            // Mail it
            mail($to, $subject, $message, $headers);
************************************************************************************************

The email output:
************************************************************************************************
Content-type: text/html; charset=iso-8859-1

From: Birthday Reminder <birthday@example.com>



            <html>
            <head>
              <title>Birthday Reminders for August</title>
            </head>
            <body>
              <p>Here are the birthdays upcoming in August!</p>
              <table>
               <tr>
                   <th>Person</th><th>Day</th><th>Month</th><th>Year</th>
               </tr>
               <tr>
                   <td>Joe</td><td>3rd</td><td>August</td><td>1970</td>
               </tr>
               <tr>
                   <td>Sally</td><td>17th</td><td>August</td><td>1973</td>
               </tr>
              </table>
            </body>
            </html>
************************************************************************************************
0
 
LVL 1

Author Comment

by:nikez2k4
ID: 18052505
It is literally copied from PHP's website with a couple of headers (like CC & BCC) removed as I don't need them.

MOZ
0
 
LVL 13

Expert Comment

by:rhickmott
ID: 18052521
The content type normally has to be the last line in the header

Try

==========================================
$headers = "From: \"You\" <mail@you.com>\r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: text/html";
=====================================
0
 
LVL 13

Expert Comment

by:rhickmott
ID: 18052524
Failing that

Try

=======================================
$headers = "From: \"You\" <mail@you.com>\r\n";
$headers .= "MIME-Version: 1.0\n";
$headers .= "Content-Type: text/html";
=======================================
0
 
LVL 1

Author Comment

by:nikez2k4
ID: 18052541
Tried both of those and neither of them send out an email :|

MOZ
0
 
LVL 48

Expert Comment

by:hernst42
ID: 18052546
for sending HTML-mails I recommend not using the php-mail-function, as there are mayor problems if you do one little mistake in your code. Better use http://phpmailer.sf.net. Makes sending mails a lot easyer and you don't need bugfixing for that.
0
 
LVL 13

Expert Comment

by:rhickmott
ID: 18052558
I'm assuming you added the mail() function after it?

ie

// To send HTML mail, the Content-type header must be set
$headers = "From: \"Birthday Reminder\" <birthday@example.com>\r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: text/html";
 
// Mail it
mail($to, $subject, $message, $headers);



0
 
LVL 1

Author Comment

by:nikez2k4
ID: 18052560
Which is why I have come here to get some help on how to get the syntax right :)

I have looked at PHPMailer before but I want to do it on my own as it's interesting to know how it all works...

MOZ
0
 
LVL 1

Author Comment

by:nikez2k4
ID: 18052578
rhickmott - yes i did ;)

I have now got the "From" bit working but it's still not recognising the HTML header. I'm still getting "Content-Type: text/html" in the email body rather than as a header... looks like the - "MIME-Version: 1.0\r\n"; - bit is being sent though.

MOZ
0
 
LVL 13

Expert Comment

by:rhickmott
ID: 18052584
PHPMailer is a Class so you basically use it as such

require("class.phpmailer.php");

$mail = new PHPMailer();

$mail->From              = "birthday@example.com";
$mail->FromName     = "Birthday Reminder";
$mail->Host               = "your.smtp.server";
$mail->Mailer             = "smtp";

$mail->body                =    $message;
$mail->AddAddress      =   $to;

$mail->Send();

0
Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

 
LVL 13

Accepted Solution

by:
rhickmott earned 425 total points
ID: 18052602
Which code did you use? you sometimes have to play and tweak the \n\r values on the last two lines depending on the server.

Normally viewing the e-mail source is a good way of debugging this especially if it shows you the headers.

It should look like

header
header
header
header

body

0
 
LVL 1

Author Comment

by:nikez2k4
ID: 18052604
Yeah I know :) But like I said, I want to do it without "3rd party" classes.

I appreciate the suggestion though, but I really want to give it a go without any aids like that. I know it makes it a lot harder to get right but it is something I need to learn.

Thx,
MOZ
0
 
LVL 13

Expert Comment

by:rhickmott
ID: 18052614
No problem PhPMailer is a useful class even if you don't use it its worth looking into as it handles things such as Authenticated SMTP and such. If you have ever tried to make a e-mail with attachments using mail() you will realise what a PITA it is :(

mail works with most things but everyone has problems with the header.

0
 
LVL 48

Expert Comment

by:hernst42
ID: 18052630
Tried copy&paste the example from php and it works flawless. Either your Mail-client is not able to display the HTML-mail correctly or your sendmail-program screws up the mail. On which system did you try to do this.
0
 
LVL 11

Expert Comment

by:ch2
ID: 18052659
Is not PHP. You mail client dosen't accept MIME.

Which client are you using?
0
 
LVL 1

Author Comment

by:nikez2k4
ID: 18052661
AHHHH!

Managed to fix it....thats for your suggestion to play about with the line feeds. The carriage return was messing it up. Is that a server thing? Can you explain what causes this problem?

Sorry it will annoy me no end if I don't understand what is causing the problem!! :)

Thanks,
MOZ

P.S.

The code I am using that works for me:
********************************************************************************
            // multiple recipients
            $to  = 'marshall@landau-forte.org.uk';
            
            // subject
            $subject = 'Birthday Reminders for August';
            
            // message
            $message = '
            <html>
            <head>
              <title>Birthday Reminders for August</title>
            </head>
            <body>
              <p>Here are the birthdays upcoming in August!</p>
              <table>
               <tr>
                   <th>Person</th><th>Day</th><th>Month</th><th>Year</th>
               </tr>
               <tr>
                   <td>Joe</td><td>3rd</td><td>August</td><td>1970</td>
               </tr>
               <tr>
                   <td>Sally</td><td>17th</td><td>August</td><td>1973</td>
               </tr>
              </table>
            </body>
            </html>
            ';
            
            // To send HTML mail, the Content-type header must be set
            $headers = "From: \"Birthday Reminder\" <birthday@example.com>\n";
            $headers .= "MIME-Version: 1.0\n";
            $headers .= "Content-Type: text/html\n";
             
            // Mail it
            mail($to, $subject, $message, $headers);
********************************************************************************
0
 
LVL 48

Expert Comment

by:hernst42
ID: 18052894
What php on which platform are you using?
0
 
LVL 13

Expert Comment

by:rhickmott
ID: 18052905
Its normally caused by the outgoing mail server im not 100% sure what causes it as it varies the above code normally works fo rme in some instances but I sometime have to tweak the headers slughtly with regards to \r\n to get it to function correctly on different mail servers.

Most annoying.

Thats the bonus of phpmailer() because it acts as a outgoing server you know its consistent.
0
 
LVL 48

Assisted Solution

by:hernst42
hernst42 earned 75 total points
ID: 18052935
phpmailer uses "\n" as line-delimiter, because most mailserver accept "\n" also, but some don not accept "\r\n". It's ok to write your own code for that, but why always invent and reimplement the wheel again.
Keep your focus on putting good softwareparts together to build a application in lees time, with less errors and lower costs for your customers. This will make all people happy. So for php phpmailer is one of the best tools to send mails. Your own solution will take at least a month to be as good as phpmailer. There is no reason not to use good parts form others (if the licence permits this).
0
 
LVL 13

Expert Comment

by:rhickmott
ID: 18052951
I think what he means is that if you only sending a basic e-mail and your application is not mail-intensive then there no point in importing a class which can do x y z if you only want to do x and x is a few lines of code.

I will agree with you though in general if your doing a fair amount of e-mail work then using phpmailer is a good idea.
0
 
LVL 1

Author Comment

by:nikez2k4
ID: 18053048
Thanks for all your advice guys, really appreciate it.

I do agree with you, using ready made applications are always a good idea, however licencing issues are a pain in the neck sometimes and I really like working out how to do things my way...It is usually only for my own projects that I mess about so I have all the time I need to perfect what I am working on.

In this case I am doing some work for our Careers department and it's only going to be a temporary solution this year to see how much the online system gets used. We are planning to completely rethink how we store data in databases etc etc for next year and as I already have the groundwork on this system it will make it easier to work on the big project next year.

Again, thanks for all your advice and no doubt I will be back on EE when I have my next problem!! :)

Take care,
MOZ
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
calculated column 12 74
MySQL Grouping 2 21
Scope of $_SESSION 17 27
How do I remove all except the numbers?  PHP  Regex 3 3
This article will explain how to display the first page of your Microsoft Word documents (e.g. .doc, .docx, etc...) as images in a web page programatically. I have scoured the web on a way to do this unsuccessfully. The goal is to produce something …
Foreword (July, 2015) Since I first wrote this article, years ago, a great many more people have begun using the internet.  They are coming online from every part of the globe, learning, reading, shopping and spending money at an ever-increasing ra…
The viewer will learn how to look for a specific file type in a local or remote server directory using PHP.
The viewer will learn how to create and use a small PHP class to apply a watermark to an image. This video shows the viewer the setup for the PHP watermark as well as important coding language. Continue to Part 2 to learn the core code used in creat…

912 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

19 Experts available now in Live!

Get 1:1 Help Now