[PHP] Email script, MS Outlook toont de HTML niet

Pagina: 1
Acties:
  • 151 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • bas.kb
  • Registratie: Oktober 2002
  • Laatst online: 04-05 23:35

bas.kb

BI'er :P

Topicstarter
Goedemiddag,

Ik heb een emailscriptje geschreven voor een nieuwsbrief. Dit mailscriptje werkt opzich goed, de mail wordt verstuurd, alleen Microsoft Outlook 2003 toont alleen de plain text van het emailbericht. Dat ziet er zo uit:
Email niet goed weergegeven? <http://www.domein.nl/nieuwsbrief/02022007/>
In de bijlage, genaamd ATT12312.htm, staat de inhoud van het HTML email bericht:
code:
1
2
3
4
5
6
7
8
9
10
11
12
<html>      
        <head>
            <title>
                Nieuwsbrief 02-02-2007
            </title>
        </head>
        <body>
            <div>
                Dit is een test <b>HTML</b> email berichtje
            </div>
        </body>
</html>


Het zou zo moeten zijn dat het emailbericht gewoon als HTML in de email wordt getoond.

Ik gebruik de volgende headers:
PHP:
1
2
3
4
5
// Maak headers van email op    
$headers = "From: GeefenZie.nl <info@geefenzie.nl>\n";
$headers.= "Reply-to: GeefenZie.nl <info@geefenzie.nl>\n";
$headers.= "MIME-Version: 1.0\n";
$headers.= "Content-Type: multipart/mixed; boundary = $boundary\n\n";


Ik bouw de body zo op:
PHP:
1
2
3
4
5
6
7
8
9
10
11
        $boundary = uniqid(md5(time()));    
        // Plain text versie van bericht
        $body = "\n--$boundary\n" .
                "Content-Type:text/plain; charset=\"iso-8859-1\"\n";

        $body .= $plain_text_email;
        
        // HTML versie van bericht
        $body .= "\n--$boundary\n" .
                "Content-Type:text/html; charset=\"iso-8859-1\"\n";
        $body .= $html_email;


Ik snap niet waarom Outlook de plaintext laat zien, en de HTML als bijlage toont. Gmail toont de plaintext EN de html mail onder elkaar. Dit is gewoon overzichtelijk, maar helaas gaat er bij het openen van de mail in Outlook iets niet goed.

Ik verstuur de mail zo:

PHP:
1
mail($email, $onderwerp, $body, $headers);


Heeft iemand een tip voor mij?

// edit
Outlook toont normaal gesproken wel HTML, dit staat niet uit :)

[ Voor 5% gewijzigd door bas.kb op 02-02-2007 16:07 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Hieronder een HTML pagina die wel goed wordt verzonden.

PHP:
<?php
$recipient="no@no.no"; // je e-mail adres
$subject="Offerte aanvraag"; // titel e-mail
$from_mail="Mailform";
$headers = "From: $from_mail <> \n";
$headers .= "Content-type: text/html; charset=iso-8859-1";

$content .="<html>
<head>
<title></title>
<style>
body {
background-color: #efefef;
margin: 0;
}

td {
font-family: Arial, Helvetica, sans-serif;
font-size: 12px;
}
</style>
</head>
<body>
<table width=\"100%\" border=\"0\">
<tr>
<td>
Inhoud
</td>
</tr>
</body>
</html>"
;

mail("$recipient",$subject,stripslashes($content),$headers);
?>

[ Voor 36% gewijzigd door Verwijderd op 02-02-2007 16:08 ]


Acties:
  • 0 Henk 'm!

  • bas.kb
  • Registratie: Oktober 2002
  • Laatst online: 04-05 23:35

bas.kb

BI'er :P

Topicstarter
Dank je :) Maar ik wil ook plaintext toevoegen voor het geval dat iemand de mail opent in een emailclient waar HTML uit staat. In dat geval moet er een link getoond worden naar het webadres van de nieuwsbrief.

Ik denk dat het daar ergens fout gaat. Outlook toont standaard de plaintext, terwijl de HTML getoond moet worden. |:(

Daarom gebruik ik bij het openen van de headers de content type : multipart/mixed; en een unieke boundary. Dan kan ik vervolgens in het bericht zelf plain text EN html toevoegen. Weet iemand wat ik fout doe?

[ Voor 24% gewijzigd door bas.kb op 02-02-2007 16:21 ]


Acties:
  • 0 Henk 'm!

  • evolnick
  • Registratie: Januari 2006
  • Laatst online: 04-06-2024
ik maak altijd gebruik van een php mailer class: http://phpmailer.sourceforge.net/
Die werk altijd goed.

Maar als ik jouw code vergelijk met die van phpmailer, dan zie ik de volgende verschillen:
  • er moet 2x een newline na elk stuk tekst (zonder opmaak en html)
  • mis een end boundary regel, deze moet na de html versie komen
  • phpmailer zet de content-type op 'multipart/alternative', wanneer er een html en plain text in de mail staat

[ Voor 12% gewijzigd door evolnick op 02-02-2007 16:25 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Daarnaast is er natuurlijk een verschil tussen miltupart/mixed en multipart/alternative.

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Nu online

Creepy

Tactical Espionage Splatterer

En niet vergeten dat je een lege regel voor een boundary moet hebben (twee keer een \n dus).
Misschien dat het verstandig is om de volledige bron van twee e-mails even naast elkaar te leggen (dus een goede en en verkeerde) en zo te achterhalen wat er verschillend is.

Is er overigens een reden waarom je geen bestaande class ofzo gebruikt voor het versturen van een mail? Kan je een hoop ellende schelen ;)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • bas.kb
  • Registratie: Oktober 2002
  • Laatst online: 04-05 23:35

bas.kb

BI'er :P

Topicstarter
Ik had phpmailer moeten gebruiken, dat had idd sneller geweest. Alleen vind ik het leuk om uit te zoeken hoe je precies een header en body van een mail maakt. Anyways, hartelijk bedankt voor jullie antwoorden. Ik had idd een aantal line breaks nodig voor de boundary.

Ik kwam op deze link ook nog een aantal antwoorden tegen:
http://www.experts-exchan...uages/PHP/Q_21469204.html
$my_mail .= "Content-Type: multipart/alternative;\n";
$my_mail .= "\tboundary=\"" . $my_boundary . "\"\n";

// don't know why, but Outlook seems to need a tab before the boundary (\t), else everything is screwed up
Dat deed ét em. Nu werkt ie primaaa :)

Acties:
  • 0 Henk 'm!

Verwijderd

bas.kb schreef op maandag 05 februari 2007 @ 10:43:
Ik had phpmailer moeten gebruiken, dat had idd sneller geweest. Alleen vind ik het leuk om uit te zoeken hoe je precies een header en body van een mail maakt. Anyways, hartelijk bedankt voor jullie antwoorden. Ik had idd een aantal line breaks nodig voor de boundary.

Ik kwam op deze link ook nog een aantal antwoorden tegen:
http://www.experts-exchan...uages/PHP/Q_21469204.html

Dat deed ét em. Nu werkt ie primaaa :)
Betreft de "I don't know why": dit is omdat anders de regel met "boundary" als nieuwe header wordt gezien, waar dit eigenlijk een parameter is van de Content-Type header. Als de newline (\n) op de regel ervoor er niet zou staan zou het al werken. Als een parameter wel op een nieuwe regel moet, moet deze regel met whitespace (spatie of tab) beginnen.
Pagina: 1