[php] MIME mail - wat doe ik fout?

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

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Ik ben bezig met een mail functie en ik probeer MIME mail te verzenden. Ik heb hier absoluut geen ervaring mee ik kan na een flinke zoektoch ook geen complete duidelijke documentatie vinden. Uit wat ik kon vinden in de php manual en wat ik toch heb kunnen vinden met Google heb ik dit gemaakt:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$headers = "From: " . $settings['mail_name'] . "<" . $settings['mail_address'] . ">\n";
$headers .= "To: " . $rs['name'] . "<" . $rs['address'] . ">\n";
$headers .= "Subject: " . $_POST['subject'] . "\n";
$headers .= "MIME-Version: 1.0\n";
$headers .= "X-Mailer: PHP4\n";
$headers .= "X-Priority: 3\n";
$headers .= "Content-Type: multipart/mixed; charset=\"iso-8859-1\"; boundary=\"" . $boundary . "_outer\"\n";

$message .= "--" . $boundary . "_outer\n";
$message .= "Content-Type: multipart/alternative; charset=\"iso-8859-1\"; boundary=\"" . $boundary . "_inner\"\n";
$message .= "--" . $boundary . "_inner\n";
$message .= "Content-Type: text/plain; charset=\"iso-8859-1\";\n";
$message .= "Content-Transfer-Encoding: quoted-printable\n\n";
$message .= strip_tags($_POST['body']) . "\n\n";
$message .= "--" . $boundary . "_inner\n";
$message .= "Content-Type: text/html; charset=\"iso-8859-1\";\n";
$message .= "Content-Transfer-Encoding: quoted-printable\n\n";
$message .= "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">\n"; 
$message .= "<HTML><BODY>\n"; 
$message .= $_POST['body'] . "\n";
$message .= "</BODY></HTML>\n\n";
$message .= "--" . $boundary . "_outer--\n";

Dit werkt dus niet. Mischien kan iemand me een beetje op weg helpen of een mischien een link naar goede documentatie?

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

Verwijderd

Ah gaaf, hij doet het niet... En wat doet hij dan niet precies? :?

Krijg je een foutmelding? Komt de e-mail niet over? ....

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
De email komt wel over. Ik krijg alleen geen HTML output. Ik krijg zowiezo de text/plain versie te zien inclusief te boundary die daar achterkomt, de Content-Type (text/html) declaratie, de Content-Transfer Declaratie en de HTML versie. Maar dan zie ik alleen de tags en de tekst ertussen, dus het is niet opgemaakt.

Edit:

Ik heb het nu hier in veranderd:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$headers = "From: " . $settings['mail_name'] . "<" . $settings['mail_address'] . ">\n";
$headers .= "To: " . $rs['name'] . "<" . $rs['address'] . ">\n";
$headers .= "Subject: " . $_POST['subject'] . "\n";
$headers .= "MIME-Version: 1.0\n";
$headers .= "X-Mailer: PHP4\n";
$headers .= "X-Priority: 3\n";
$headers .= "Content-Type: multipart/mixed; charset=\"iso-8859-1\"; boundary=\"" . $boundary . "\"\n";

$message .= "--" . $boundary . "\n";
$message .= "Content-Type: text/plain; charset=\"iso-8859-1\";\n";
$message .= "Content-Transfer-Encoding: quoted-printable\n\n";
$message .= strip_tags($_POST['body']) . "\n\n";
$message .= "--" . $boundary . "\n";
$message .= "Content-Type: text/html; charset=\"iso-8859-1\";\n";
$message .= "Content-Transfer-Encoding: quoted-printable\n\n";
$message .= "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">\n"; 
$message .= "<HTML><BODY>\n"; 
$message .= $_POST['body'] . "\n";
$message .= "</BODY></HTML>\n\n";
$message .= "--" . $boundary . "--\n";

Ik krijg nu de HTML wel goed te zien, maar ook de plain/text versie. Wat doe ik fout?

[ Voor 66% gewijzigd door Michali op 07-06-2004 18:49 ]

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

PHP:
1
2
3
4
5
6
7
$message .= "--" . $boundary . "\n"; 
$message .= "Content-Type: text/plain; charset=\"iso-8859-1\";\n"; 
$message .= "Content-Transfer-Encoding: quoted-printable\n\n"; 
$message .= strip_tags($_POST['body']) . "\n\n"; 
$message .= "--" . $boundary . "\n"; 
$message .= "Content-Type: text/html; charset=\"iso-8859-1\";\n"; 
$message .= "Content-Transfer-Encoding: quoted-printable\n\n";

Moet dit niet ook in de headers komen?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • zeroxcool
  • Registratie: Januari 2001
  • Laatst online: 19-09 09:59
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$message .= "\n--" . $boundary . "_outer\n"; 
$message .= "Content-Type: multipart/alternative; charset=\"iso-8859-1\"; boundary=\"" . $boundary . "_inner\"\n"; 
$message .= "--" . $boundary . "_inner\n"; 
$message .= "Content-Type: text/plain; charset=\"iso-8859-1\";\n"; 
$message .= "Content-Transfer-Encoding: quoted-printable\n\n"; 
$message .= strip_tags($_POST['body']) . "\n\n"; 
$message .= "--" . $boundary . "_inner\n"; 
$message .= "Content-Type: text/html; charset=\"iso-8859-1\";\n"; 
$message .= "Content-Transfer-Encoding: quoted-printable\n\n"; 
$message .= "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">\n"; 
$message .= "<HTML><BODY>\n"; 
$message .= $_POST['body'] . "\n"; 
$message .= "</BODY></HTML>\n\n"; 
$message .= "--" . $boundary . "_outer--\n";

zeroxcool.net - curity.eu


Acties:
  • 0 Henk 'm!

  • stekkel
  • Registratie: Augustus 2001
  • Laatst online: 17-09 08:05
je vergeet de inner boundary af te sluiten.

Oh en waarom zo moeilijk. Wanneer je geen attachments verstuurd kan je net zo goed het Content-Type op multipart/alternative zetten in plaats van multipart/mixed. Dan hoeft je ook niet met inner boundaries te klooien.

[ Voor 73% gewijzigd door stekkel op 07-06-2004 22:01 ]


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Dat weet ik dus niet. Ik weet ook niet waar ik dat van geleerd zou moeten hebben. Waar heb jij het bijvoorbeeld van geleerd (ik laat het wel zo trouwens, want ik wil uiteindelijk wel attachements kunnen toevoegen)

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • Jelmer
  • Registratie: Maart 2000
  • Laatst online: 21:30
Waar encode jij de body naar quoted-printable? (de functie om te encoden staat in de comment van quoted-printable-decode door tamas dot tompa at kirowski dot com @
20-Feb-2004 01:46 )

[ Voor 67% gewijzigd door Jelmer op 08-06-2004 11:54 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Klik hier voor de mail info van php.net.

En lees de user comments, en dan vooral deze
kieran dot huggins at rogers dot com
06-Nov-2002 03:52
Finally got MIME working with attachments and everything:

The following is an example of a plaintext/html e-mail with attachments

for the HTML code, I had to include the weird markup that outlook express 6 added when the message was sent, otherwise it wouldn't display properly. Send a copy of the message to yourself and copy the source.

Also, the /n newlines are important, normal rules of HTML seem to go kinda wonky with e-mail...

Experiment with your mailer and try different stuff.
Deze heb ik ook gebruikt en werkt hier perfect. De code zoals hij in de user comments staat is deze. Hij staat bijna helemaal onderaan vandaar dat ik hem even copy/paste.

Ik heb hier een aparte functie van gemaakt waarbij ik het een en ander meegeef. Zo ook de body deel. Het verbouwen van de functie moet wel lukken.

PHP:
1
2
3
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
// some local variables 
$from_name = "Sender Name"; 
$from_email = "sender@server.ca"; 
$to_name = "Recipient Name"; 
$to_email = "recipient@server.ca"; 
$subject = "Fantastic Subject"; 

// headers need to be in the correct order... 
$headers = "From: $from_name<$from_email>\n"; 
$headers .= "Reply-To: <$from_email>\n"; 
$headers .= "MIME-Version: 1.0\n"; 
// the following must be one line (post width too small) 
$headers .= "Content-Type: multipart/related; 
type=\"multipart/alternative\"; boundary=\"---- 
=MIME_BOUNDRY_main_message\"\n"; 
// 
$headers .= "X-Sender: $from_name<$from_email>\n"; 
$headers .= "X-Mailer: PHP4\n"; //mailer 
$headers .= "X-Priority: 3\n"; //1 UrgentMessage, 3 Normal 
$headers .= "Return-Path: <$from_email>\n"; 
$headers .= "This is a multi-part message in MIME format.\n"; 
$headers .= "------=MIME_BOUNDRY_main_message \n"; 
$headers .= "Content-Type: multipart/alternative; boundary=\"----=MIME_BOUNDRY_message_parts\"\n"; 

//plaintext section begins 
$message = "------=MIME_BOUNDRY_message_parts\n"; 
$message .= "Content-Type: text/plain; charset=\"iso-8859-1\"\n"; 
$message .= "Content-Transfer-Encoding: quoted-printable\n"; 
$message .= "\n"; 

// your text goes here 
$message .= "blah blah -- plaintext version of the message\n"; 
$message .= "\n"; 

// html section begins 
$message .= "------=MIME_BOUNDRY_message_parts\n"; 
$message .= "Content-Type: text/html;\n    charset=\"iso-8859-1\"\n"; 
$message .= "Content-Transfer-Encoding: quoted-printable\n"; 
$message .= "\n"; 

// your html goes here -- It didn't appear properly without 
// the weird markup that outlook added after sending 
$message .= "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">\n"; 
$message .= "<HTML><BODY>\n"; 
$message .= "blah blah -- html version of the message\n"; 

// look ma, I'm referencing an img attachment (see below) 
// watch out for weird markup!!! 
$message .= "[img]3D\"cid:some_picture\"[/img]\n"; 
$message .= "</BODY></HTML>\n"; 
$message .= "\n"; 

// this ends the message part 
$message .= "------=MIME_BOUNDRY_message_parts--\n"; 
$message .= "\n"; 

// now we add attachments (images, etc) 
$message .= "------=MIME_BOUNDRY_main_message\n"; 
$message .= "Content-Type: image/gif; \n name=\"some_picture.gif\"\n"; 
$message .= "Content-Transfer-Encoding: base64\n"; 
$message .= "Content-ID: <some_picture>\n"; 
$message .= "\n"; 
// (truncated for space) 
$message .= "R0lGODlheAAZAKIHAMTExCQkJJOTk\n"; 
$message .= "eLo7wzDKSatVQ5R3u7dDUUjcZ34D\n"; 
$message .= "\n"; 
// etc...etc...etc... 

//message ends 
$message .= "------=MIME_BOUNDRY_main_message--\n"; 

// send the message :-) 
mail("$to_name<$to_email>", $subject, $message, $headers);

[ Voor 13% gewijzigd door Verwijderd op 08-06-2004 11:55 ]


Acties:
  • 0 Henk 'm!

  • Helmet
  • Registratie: Januari 2002
  • Laatst online: 21-08 15:00
Er is een heel handige en complete class te verkijgen op het internet
HtmlMimeMail

Icons are overrated


Acties:
  • 0 Henk 'm!

  • stekkel
  • Registratie: Augustus 2001
  • Laatst online: 17-09 08:05
Michali schreef op 08 juni 2004 @ 10:32:
Dat weet ik dus niet. Ik weet ook niet waar ik dat van geleerd zou moeten hebben. Waar heb jij het bijvoorbeeld van geleerd (ik laat het wel zo trouwens, want ik wil uiteindelijk wel attachements kunnen toevoegen)
Waar ik dat van geleerd heb:
http://www.imc.org/rfcs.html#mime

Gewoon een kwestie van de rfc sheets lezen en je weet precies hoe een mail opgebouwd moet worden en wat er allemaal mogelijk is.

Met name rfc2045 - rfc2049 zijn belangrijk.

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
stekkel schreef op 08 juni 2004 @ 12:07:
[...]


Waar ik dat van geleerd heb:
http://www.imc.org/rfcs.html#mime

Gewoon een kwestie van de rfc sheets lezen en je weet precies hoe een mail opgebouwd moet worden en wat er allemaal mogelijk is.

Met name rfc2045 - rfc2049 zijn belangrijk.
Kijk, daar heb ik wat meer aan. Ik wil niet alleen dat het werkt zoals ik wil, ik wil ook graag weten waarom het wel werkt op een bepaalde manier en waarom niet op de manier waarop ik het probeerde. Thanks.

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Ik heb wat geprobeerd met de tips die jullie gaven en ik ben hier op uit gekomen:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
$boundary = md5(microtime());

$headers = "From: " . $settings['mail_name'] . "<" . $settings['mail_address'] . ">\n";
$headers .= "To: " . $rs['name'] . "<" . $rs['address'] . ">\n";
$headers .= "Subject: " . $_POST['subject'] . "\n";
$headers .= "MIME-Version: 1.0\n";
$headers .= "X-Mailer: PHP4\n";
$headers .= "X-Priority: 3\n";
$headers .= "Content-Type: multipart/mixed; charset=\"iso-8859-1\"; boundary=\"" . $boundary . "_outer\"\n";

$message .= "\n--" . $boundary . "_outer\n";
$headers .= "Content-Type: multipart/alternative; charset=\"iso-8859-1\"; boundary=\"" . $boundary . "_inner\"\n";
$message .= "--" . $boundary . "_inner\n";
$message .= "Content-Type: text/plain; charset=\"iso-8859-1\";\n";
$message .= "Content-Transfer-Encoding: quoted-printable\n\n";
$message .= quoted_printable_decode(strip_tags($_POST['body'])) . "\n\n";
$message .= "--" . $boundary . "_inner\n";
$message .= "Content-Type: text/html; charset=\"iso-8859-1\";\n";
$message .= "Content-Transfer-Encoding: quoted-printable\n\n";
$message .= "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">\n"; 
$message .= "<HTML><BODY>\n"; 
$message .= quoted_printable_decode($_POST['body']) . "\n";
$message .= "</BODY></HTML>\n\n";
$message .= "--" . $boundary . "_inner\n";
$message .= "--" . $boundary . "_outer\n";

mail($rs['address'], "", $message, $headers) or error("Could not send this mail!");

Het mailtje is nu alleen volledig leeg. Mischien iemand die ziet wat er fout aan zou kunnen zijn?

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • Jelmer
  • Registratie: Maart 2000
  • Laatst online: 21:30
quoted_printable_decode ??? encode (en die heeft php dus niet standaard aan boord)

Verder heb ik ook \r\n gebruikt, omdat sommige clients er over struikelen als er alleen een \n staat dacht ik.

[ Voor 78% gewijzigd door Jelmer op 09-06-2004 21:54 ]


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Zonder die decode functie geeft ie overigens ook niets weer. En ik zal eens met \r\n proberen

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • pierre-oord
  • Registratie: April 2002
  • Laatst online: 10-02 23:00
Voordat je dit met de mail() functie gaat doen: ga PHPMailer gebruiken. Dit is een groot open-source script, om berichten te versturen. Je kunt hiermee rechtstreeks gebruik maken van een smtp server, sendmail, en enkele manieren van verzenden, opgeven welk deel (of heel het bericht) je in html gaat versturen, attachments toevoegen (foto's...), BCC, CC, zo'n beetje alles wat je van een mailprogramma mag verwachten.

Ik gebruikte eerst ook altijd mail() maar ben daar toch vanaf gestapt, vanwege de beperkingen zoals geen mail sturen. O ja, je kunt je met smtp zelfs auth-en, zo gebruik ik een mail server op een andere locatie :)

edit:
@ helmet: je link is dood, en is nu: http://www.phpguru.org/static/mime.mail.html geloof ik :)

[ Voor 9% gewijzigd door pierre-oord op 09-06-2004 22:40 ]


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Als ik iets wil doen, wil ik het ook echt graag zelf doen. Ik ga dus even(?) die RFCx jes doorlezen en het daarna nog een keer opnieuw proberen. Wat ik iig niet wil gaan doen is een class van een ander gebruiken. Ik wil echt alles zelf geschreven hebben (behalve php zelf natuurlijk, maar dat is een heel ander verhaal).

Edit: het heeft me nu al een stuk verder geholpen. Ik ga er wel uit komen zo. Wat nu wel werkt is dit:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$headers = "From: " . $settings['mail_name'] . " <" . $settings['mail_address'] . ">\r\n";
$headers .= "To: " . $rs['name'] . " <" . $rs['address'] . ">\r\n";
$headers .= "Subject: " . $_POST['subject'] . "\r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "X-Mailer: PHP4\r\n";
$headers .= "X-Priority: 3\r\n";
$headers .= "Content-Type: multipart/mixed; charset=\"iso-8859-1\"; boundary=\"" . $boundary . "_outer\"\r\n";

$message .= "\r\n--" . $boundary . "_outer\r\n";
$headers .= "Content-Type: multipart/alternative; charset=\"iso-8859-1\"; boundary=\"" . $boundary . "_inner\"\r\n\r\n";
$message .= "--" . $boundary . "_inner\r\n";
$message .= "Content-Type: text/plain; charset=\"iso-8859-1\";\r\n\r\n";
$message .= strip_tags(stripslashes($_POST['body'])) . "\r\n\r\n";
$message .= "--" . $boundary . "_inner\r\n";
$message .= "Content-Type: text/html; charset=\"iso-8859-1\";\r\n\r\n";
$message .= "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">\r\n"; 
$message .= "<HTML><BODY>\r\n"; 
$message .= stripslashes($_POST['body']) . "\r\n";
$message .= "</BODY></HTML>\r\n\r\n";
$message .= "--" . $boundary . "_inner--\r\n\r\n";
$message .= "--" . $boundary . "_outer--\r\n";

(zonder stripslaches doet ie het ook overigens, dat was alleen voor iets anders)

[ Voor 89% gewijzigd door Michali op 09-06-2004 23:51 ]

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • stekkel
  • Registratie: Augustus 2001
  • Laatst online: 17-09 08:05
Michali schreef op 09 juni 2004 @ 23:03:
Als ik iets wil doen, wil ik het ook echt graag zelf doen. Ik ga dus even(?) die RFCx jes doorlezen en het daarna nog een keer opnieuw proberen. Wat ik iig niet wil gaan doen is een class van een ander gebruiken. Ik wil echt alles zelf geschreven hebben (behalve php zelf natuurlijk, maar dat is een heel ander verhaal).

Edit: het heeft me nu al een stuk verder geholpen. Ik ga er wel uit komen zo. Wat nu wel werkt is dit:
PHP:
1
2
3
4
5
...
$message .= "\r\n--" . $boundary . "_outer\r\n";
$headers .= "Content-Type: multipart/alternative; charset=\"iso-8859-1\"; boundary=\"" . $boundary . "_inner\"\r\n\r\n";
$message .= "--" . $boundary . "_inner\r\n";
...
Er zit nog een foutje in de $headers moet een $message zijn.
Verder feliciteer ik je met je email kennis opgedaan uit de rfc's _/-\o_

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
idd, helemaal overheen gekeken. Apart, hij doet et wel, maar ik pas het wel even aan.

Noushka's Magnificent Dream | Unity

Pagina: 1