[php]multipart/alternative

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

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb een scriptje gemaakt om mime-mail mee te verzenden: hij verstuurt plain text en html-geformatteerde tekst met een embedded plaatje.
Het gaat bijna goed, op 2 dingen na:
1. outlook express toont een attachment-icoontje terwijl het plaatje getoond wordt in het mailtje. in outlook gaat het wel goed. dit probleem ontstond pas nadat ik de scheiding plain/html had aangebracht.
2. in de webmail van ons bedrijf zie ik zowel de platte tekst als de geformatteerde; in mijn eigen webmail zie ik alleen de platte tekst, maar krijg ik de geformatteerde tekst en het plaatje als attachment.

nou heb ik twee vragen:
weet iemand waar dit aan ligt?
hoe noodzakelijk is het om de scheiding plain/html aan te brengen?

PHP:
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
<?
$to = "iemand@adres.com";
$naam = "naam van afzender";
$from = "iemand@ergens.com";
$subject = "test formattedMail";

$arrHeaders = array();
$arrBodyparts = array();

$bodyPlain = "platte bodytekst";
$body = "<b>bodytekst</b><br>";
$body .= "[img]'cid:uniekeIDvoorMijnPlaatje'[/img]";

//------------------ plaatje encoden
    $fileNaam = "plaatje.gif";
    $filePointer = fopen($fileNaam,"r") or die ("niet geopend");
    $fileEncoded = fread($filePointer, filesize($fileNaam));
    $fileEncoded = chunk_split(base64_encode($fileEncoded));

//----------------- definieer headers
    $arrHeaders[] = "From: ".$naam." <".$from.">";

//----------------- definieer mime-headers
    $arrHeaders[] = "MIME-Version: 1.0";
    $boundaryAlternative = md5(uniqid(time()));
    $boundaryRelated = md5(uniqid(time()));
    $arrHeaders[] = "Content-Type: multipart/alternative; boundary=\"".$boundaryAlternative."\"\r\n";

    $headers = implode ("\r\n",$arrHeaders);

//------------------ definieer body
    //plain text
    $arrBodyparts[] = "--".$boundaryAlternative;
    $arrBodyparts[] = "Content-Type: text/plain; charset=us-ascii";
    $arrBodyparts[] = "Content-Transfer-Encoding: 7bit\r\n";
    $arrBodyparts[] = $bodyPlain."\r\n";

    //html-formatted
    $arrBodyparts[] = "--".$boundaryAlternative;
    $arrBodyparts[] = "Content-Type: multipart/related; boundary=\"".$boundaryRelated."\"\r\n";

    $arrBodyparts[] = "--".$boundaryRelated;
    $arrBodyparts[] = "Content-Type: text/html; charset=us-ascii";
    $arrBodyparts[] = "Content-Transfer-Encoding: 7bit\r\n";
    $arrBodyparts[] = $body."\r\n";

    //nu attachments
    $arrBodyparts[] = "--".$boundaryRelated;
    $arrBodyparts[] = "Content-Type: image/gif; name=\"".$fileNaam."\"";
    $arrBodyparts[] = "Content-Transfer-Encoding: base64";
    $arrBodyparts[] = "Content-ID: uniekeIDvoorMijnPlaatje";
    $arrBodyparts[] = "Content-Disposition: inline; filename=\"".$fileNaam."\"\r\n";
    $arrBodyparts[] = $fileEncoded."\r\n";

    //bodyparts afsluiten
    $arrBodyparts[] = "--".$boundaryRelated."--\r\n";
    $arrBodyparts[] = "--".$boundaryAlternative."--";

    $body = implode ("\r\n",$arrBodyparts);

mail ($to, $subject, $body, $headers);
?>

Acties:
  • 0 Henk 'm!

  • SWfreak
  • Registratie: Juni 2001
  • Niet online
vraag 1: dit ligt hoogst waarschijnlijk aan (de instellingen van) het mailprogramma. Ieder programma gaat op een eigen manier om met HTML-email. Ik zie niet zo snel iets in de code dat vervelend kan doen. Kun je misschien plain en HTML omwisselen (dus eerst HTML en dan plain) :?
vraag 2: Tsja, sommige mensen hebben gewoon een oud mailprogramma of misschien een tekst-gebaseerd mailprogramma en kunnen niets met die HTML-boel. Voor hen zal dat er dan lelijk uit zien. Anderen hebben Outlook XP en vinden die HTML-dingetjes hartstikke mooi. Het hangt een beetje van je doelgroep af wat je wilt doen. Ik zou echter eerder de HTML-versie niet versturen dan de plain-versie, omdat iedereen de plain-versie kan bekijken.

Acties:
  • 0 Henk 'm!

  • stekkel
  • Registratie: Augustus 2001
  • Laatst online: 17-09 08:05
nou heb ik twee vragen:
weet iemand waar dit aan ligt?
Content-Type: Multipart/related vereist een type als ik het goed heb:
Content-Type: Multipart/related; type=text/html (check maar ff in de RFC's)

$arrBodyparts[] = "Content-ID: uniekeIDvoorMijnPlaatje";
syntax is incorrect:
$arrBodyparts[] = "Content-ID: <uniekeIDvoorMijnPlaatje>";
hoe noodzakelijk is het om de scheiding plain/html aan te brengen?
Heel noodzakelijk. Het is bijzonder irritant om html mail te krijgen met een client die alleen text/plain aan kan.
Zie bijvoorbeeld jouw webmail programma. Wanneer je alleen html verzend dan krijg je bagger. Met dat text/plain onderdeel erin kan je webmail client in ieder geval wat toonbaars laten zien.


Wat betreft de vorige reactie. text/plain moet altijd voor text/html
het is multipart alternative en dat betekend dat de alternative parts gerangschikt zijn van minder -> best. Wanneer een alternative part niet weergegeven kan worden dan zoekt de client ook niet verder naar alternative parts die achteraan komen.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ik heb het probleem opgelost door de nesting-volgorde van de multipart/alternative en multipart/related te wijzigen.
dus in plaats van
code:
1
2
3
4
5
6
7
8
9
10
11
multipart/alternative
--boundaryAlternative
    plaintext
--boundaryAlternative
    multipart/related
    --boundaryRelated
        html
    --boundaryRelated
        plaatje
    --boundaryRelated--
--boundaryAlternative--

nu in deze volgorde:
code:
1
2
3
4
5
6
7
8
9
10
11
multipart/related
--boundaryRelated
    multipart/alternative
    --boundaryAlternative
        plaintext
    --boundaryAlternative
        html
    --boundaryAlternative--
--boundaryRelated
    plaatje
--boundaryRelated--


ik weet niet zeker of dit helemaal netjes is, omdat volgens mij related bedoeld is om de bij elkaar horende content te definieren, en het plaatje wordt nu dus ook aan de plain text gerelateerd...
het werkt in elk geval wel :)

en stekkel, ik heb ook content-id gewijzigd in <uniekeIDvoorMijnPlaatje>
dit had ik eerder gewijzigd in een poging het te laten werken, en in outlook lijkt het allebei te werken.

overigens is het doel van mijn html mail eigenlijk alleen mailtjes voor klanten wat strakker te kunnen formatteren (huisstijl + logo'tje)

voor de liefhebber hieronder de werkende code:

PHP:
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
<?
$to = "iemand@adres.com";
$naam = "naam van afzender";
$from = "iemand@ergens.com";
$subject = "test formattedMail";

$arrHeaders = array(); 
$arrBodyparts = array();

$bodyPlain = "dit is platte bodytekst";
$body = "dit is <b>bodytekst</b><br>";
$body .= "[img]'cid:uniekeIDvoorMijnPlaatje'[/img]";

//----------------- plaatje encoden
    $fileNaam = "plaatje.gif";
    $filePointer = fopen($fileNaam,"r") or die ("niet geopend");
    $fileEncoded = fread($filePointer, filesize($fileNaam));
    $fileEncoded = chunk_split(base64_encode($fileEncoded));

//----------------- definieer headers
    $arrHeaders[] = "From: ".$naam." <".$from.">";
    //evt hier cc en bcc

//----------------- definieer mime-headers
    $arrHeaders[] = "MIME-Version: 1.0";
    $boundaryAlternative = md5(uniqid(time()));
    $boundaryRelated = md5(uniqid(time()));
    $arrHeaders[] = "Content-Type: multipart/related; boundary=\"".$boundaryRelated."\"\r\n\r\n";

    $headers = implode ("\r\n",$arrHeaders);

//------------------ definieer body
    $arrBodyparts[] = "--".$boundaryRelated;
    $arrBodyparts[] = "Content-Type: multipart/alternative; boundary=\"".$boundaryAlternative."\"\r\n";

        $arrBodyparts[] = "--".$boundaryAlternative;
        //plain text
        $arrBodyparts[] = "Content-Type: text/plain; charset=iso-8859-1";
        $arrBodyparts[] = "Content-Transfer-Encoding: 7bit\r\n";
        $arrBodyparts[] = $bodyPlain."\r\n";

        $arrBodyparts[] = "--".$boundaryAlternative;
        //html text
        $arrBodyparts[] = "Content-Type: text/html; charset=iso-8859-1";
        $arrBodyparts[] = "Content-Transfer-Encoding: 7bit\r\n";
        $arrBodyparts[] = $body."\r\n";

        //nu alternative afsluiten
        $arrBodyparts[] = "--".$boundaryAlternative."--\r\n";

    //nu attachments
    $arrBodyparts[] = "--".$boundaryRelated;
    $arrBodyparts[] = "Content-Type: image/gif; name=\"".$fileNaam."\"";
    $arrBodyparts[] = "Content-Transfer-Encoding: base64";
    $arrBodyparts[] = "Content-ID: <uniekeIDvoorMijnPlaatje>";
    $arrBodyparts[] = "Content-Disposition: inline; filename=\"".$fileNaam."\"\r\n";
    $arrBodyparts[] = $fileEncoded."\r\n";

    //evt attachments herhalen

    //bodyparts afsluiten
    $arrBodyparts[] = "--".$boundaryRelated."--\r\n";

    $body = implode ("\r\n",$arrBodyparts);

mail ($to, $subject, $body, $headers);

//output printen op scherm:
/*
$headers = str_replace ("\r\n","<br>",$headers);
$body = str_replace ("\r\n","<br>",$body);
print ($headers.$body);
*/
?>

[ Voor 13% gewijzigd door Verwijderd op 20-03-2003 10:07 ]


Acties:
  • 0 Henk 'm!

Verwijderd

_O_ ziet er goed uit, handig voor mij :) ik wist namelijk niet dat je zo images in mail kon zetten :)

[ Voor 44% gewijzigd door Verwijderd op 20-03-2003 12:13 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op 20 maart 2003 @ 09:59:
ik heb het probleem opgelost door de nesting-volgorde van de multipart/alternative en multipart/related te wijzigen.
.....

voor de liefhebber hieronder de werkende code:

PHP:
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?
$to = "iemand@adres.com";
$naam = "naam van afzender";
$from = "iemand@ergens.com";
$subject = "test formattedMail";

$arrHeaders = array(); 
$arrBodyparts = array();

$bodyPlain = "dit is platte bodytekst";
$body = "dit is <b>bodytekst</b><br>";
$body .= "[img]'cid:uniekeIDvoorMijnPlaatje'[/img]";

.....
Werkt goed, alleen vind eudora het niet erg leuk dat er quotjes om cid:uniekeIDvoorMijnPlaatje heen staan, zonder quotjes doet hij het overal goed .
Dus: $body .= "[img]cid:uniekeIDvoorMijnPlaatje[/img]";

(beetje laat, maarja misschien toch handig :D)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
was idd alweer een tijdje geleden, maar bedankt!

Acties:
  • 0 Henk 'm!

  • stekkel
  • Registratie: Augustus 2001
  • Laatst online: 17-09 08:05
Ja inderdaad een tijdje geleden, was al verbaast dat er een reply van mij tussen stond.
Maar om ff terug te komen op die quotes, met double quotes zou het moeten werken. Volgens mij moet je nooit single quotes in html tags gebruiken.
Pagina: 1