[PHP] Geklooi met nieuwe regels

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Wolf3D
  • Registratie: Augustus 2001
  • Laatst online: 22-08 12:03
Ik raak helemaal gefrustreerd van dit probleem .. dus heb maar eens besloten hem met jullie te delen.

Ik probeer een heel eenvoudig mailtje via PHP te versturen, maar kan geen touw vastknopen aan het 'nieuwe regel'-gebeuren. De ene keer wordt alles achterelkaar geplakt, dan zit er weer een lege regel teveel tussen.

Ik heb alle denkbare combinaties geprobeerd, alle denkbare lengtes, inhoud, echte enters, \n, \r, \n\r, en alle combinaties hiervan, maar .. wat ik wil lukt nooit.

Volgens mij zit er een maximum van 40 tekens aan een regel. Als de regel langer is, komt de regel eronder, erachter te staan. Maar als de regel eronder ook langer is dan 40 tekens, dan gebeurd dit weer niet. Hoewel dit in sommige gevallen ook weer niet het geval is....

Nou ff kort en krachtig: Ik snap er niets van, en het lijkt allemaal erg willekeurig.
Dus zijn er regels hiervoor, en wat zijn deze regels?

Acties:
  • 0 Henk 'm!

  • gvanh
  • Registratie: April 2003
  • Laatst online: 02-12-2023

gvanh

Webdeveloper

Volgens mij werkt \n als karakter voor nieuwe regels altijd, ook in Windows en Mac Mail programma's. (\n = Unix-style newline, \r\n =Windows-style, \r = Mac-style)

Wellicht dat sommige mail-programma's voor de leesbaarheid inderdaad een maximale regel-breedte aanhouden, maar daar zou ik me niets van aantrekken in je e-mails.

Wanneer je gewoon alle nieuwe alinea's begint met \n\n (twee newlines), dan zou alles er prima uit moeten zien. De Outlook's van deze wereld moeten er dan maar voor zorgen dat de regels niet eindeloos naar rechts doorlopen (terugloop).

Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

bij tekst gewoon \n (nooit problemen mee gehad)

en anders gewoon html mails opmaken

Acties:
  • 0 Henk 'm!

  • OkkE
  • Registratie: Oktober 2000
  • Laatst online: 04-09 08:16

OkkE

CSS influencer :+

Ik krijg inderdaad ook af en toe een regel teveel, ik gebruik eigenlijk altijd \r\n btw. Maar liever een regel teveel als te weinig. :)

“The best way to get the right answer on the Internet is not to ask a question, it's to post the wrong answer.”
QA Engineer walks into a bar. Orders a beer. Orders 0 beers. Orders 999999999 beers. Orders a lizard. Orders -1 beers.


Acties:
  • 0 Henk 'm!

  • Wolf3D
  • Registratie: Augustus 2001
  • Laatst online: 22-08 12:03
Ik snap het niet, ik heb er juist altijd problemen mee. En ik wil het juist in plain-text e-mail, omdat het opzich een simpele mail is welke door iedereen goed gelezen moet kunnen worden.

Ik ben een aantal tests aan het doen .. en .. ik kan er gewoon geen conclusie uit trekken.

Voorbeeld:

Categorie: ${cat_naam}/${subcat_naam}\nAdvertentienummer: 123456789\nAangemaakt op: $datum_aanmaak\nGeplaatst op: $datum_plaatsing\n

Output:

Categorie: Transportmiddelen/Vrachtvervoer
Advertentienummer: 123456789
Aangemaakt op: 11-10-2005
Geplaatst op: 11-10-2005

Goed dus, maar

Categorie: ${cat_naam}/${subcat_naam}\nUw advertentienummer: 123456789\nAangemaakt op: $datum_aanmaak\nGeplaatst op: $datum_plaatsing\n

Wordt:

Categorie: Transportmiddelen/Vrachtvervoer Uw advertentienummer: 123456789 Aangemaakt op: 11-10-2005 Geplaatst op: 11-10-2005

(EDIT: FOUT GEPLAKT.....)

[ Voor 8% gewijzigd door Wolf3D op 11-10-2005 16:23 ]


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 16:36
Misschien helpt het als je gebruik gaat maken van de mogelijkheid tot concateneren. Je huidige manier van opmaken vind ik niet erg overzichtelijk. Meestal maak ik plaintext mail ongeveer zo op:
PHP:
1
2
3
4
$message = 'Categorie: ' .$categorie ."\r\n"
         . 'Uw adevertentienummer: ' .$advertentienummer ."\r\n"
         . 'Aangemaakt op: ' .$aanmaakdatum ."\r\n"
         . 'Geplaatst op: ' .$plaatsingsdatum ."\r\n";


Wat er bij jou precies misgaat kunnen we verder moeilijk bepalen als je niet een stukje code laat zien waarin de inhoud van de mail wordt gegenereerd.

[ Voor 21% gewijzigd door T-MOB op 11-10-2005 16:35 ]

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • Rac-On
  • Registratie: November 2003
  • Niet online
als je email wordt herkent als html email, moet je natuurlijk <br> gebruiken, probeer dat eens!

doet niet aan icons, usertitels of signatures


Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

Wolf3D schreef op dinsdag 11 oktober 2005 @ 16:22:
Ik snap het niet, ik heb er juist altijd problemen mee. En ik wil het juist in plain-text e-mail, omdat het opzich een simpele mail is welke door iedereen goed gelezen moet kunnen worden.

Ik ben een aantal tests aan het doen .. en .. ik kan er gewoon geen conclusie uit trekken.

Voorbeeld:

Categorie: ${cat_naam}/${subcat_naam}\nAdvertentienummer: 123456789\nAangemaakt op: $datum_aanmaak\nGeplaatst op: $datum_plaatsing\n

Output:

Categorie: Transportmiddelen/Vrachtvervoer
Advertentienummer: 123456789
Aangemaakt op: 11-10-2005
Geplaatst op: 11-10-2005

Goed dus, maar

Categorie: ${cat_naam}/${subcat_naam}\nUw advertentienummer: 123456789\nAangemaakt op: $datum_aanmaak\nGeplaatst op: $datum_plaatsing\n

Wordt:

Categorie: Transportmiddelen/Vrachtvervoer Uw advertentienummer: 123456789 Aangemaakt op: 11-10-2005 Geplaatst op: 11-10-2005

(EDIT: FOUT GEPLAKT.....)
Als je het woordje 'Uw' toevoegt werken je regelafbrekingen ineens niet meer? :P

Verder uiteraard zorgen dat je regels niet te lang worden, maar daar zorgen de \n's al voor.

Zo'n constructie is voor de overzichtelijkheid ook wel aan te raden:

PHP:
1
2
3
4
5
6
$txt = "
Categorie: $cat_naam/$subcat_naam
Advertentienummer: 123456789
Aangemaakt op: $datum_aanmaak
Geplaatst op: $datum_plaatsing
";


Hoef je ook niet handmatig \n toe te voegen.

[ Voor 6% gewijzigd door Bosmonster op 11-10-2005 16:48 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Wordt er niet domweg een geencodeerd return karakter gebruikt?

Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

Ik ging er even vanuit dat je gewoon mail() gebruikte om eenvoudige mailtjes te sturen, maar als dat niet zo is (of je allerlei exotische headers toevoegt) is dat wel het vermelden waard ja ;)

Acties:
  • 0 Henk 'm!

  • Wolf3D
  • Registratie: Augustus 2001
  • Laatst online: 22-08 12:03
Ik heb allebei de methodes gebruikt, die van Bosmonster en T-MOB, maar .. het lijkt erop dat inderdaad het woordje Uw niet wordt gewaardeerd.
Zodra ik deze weghaal is er geen probleem, maar met 'Uw' erbij wordt alles op 1 regel gegooid.
Verwijderd schreef op dinsdag 11 oktober 2005 @ 16:55:
Wordt er niet domweg een geencodeerd return karakter gebruikt?
Wat houdt dat in?

Acties:
  • 0 Henk 'm!

  • Wolf3D
  • Registratie: Augustus 2001
  • Laatst online: 22-08 12:03
Bosmonster schreef op dinsdag 11 oktober 2005 @ 17:00:
Ik ging er even vanuit dat je gewoon mail() gebruikte om eenvoudige mailtjes te sturen, maar als dat niet zo is (of je allerlei exotische headers toevoegt) is dat wel het vermelden waard ja ;)
Ik zie inderdaad dat ik dit nergens heb aangegeven en is misschien inderdaad het vermelden waard.
Het is lastig om alles te copy pasten hier, aangezien het een flink stuk code is.

Er wordt een mixed-mailtje verstuurd, met daarbij 2 bijlagen ... en nu ik aan het schrijven ben .. zie ik inderdaad dat de header van het tekst gedeelte niet goed meegegeven wordt! DOH!
Maar vraag me af of dit het probleem veroorzaakt, maar het is het proberen waard natuurlijk.

Hieronder toch een poging het belangrijkste stukje code over te gooien, hopelijk heb ik alles meegepakt:

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
$extra = 'Categorie: ' .$cat_naam .'/'.$subcat_naam."\r\n" 
         . 'Advertentienummer: 12345678' ."\r\n" 
         . 'Aangemaakt op: ' .$datum_aanmaak ."\r\n" 
         . 'Geplaatst op: ' .$datum_plaatsing ."\r\n"; 

$bericht = "Geachte $aanhef,
    
Bedankt voor het plaatsen van de volgende advertentie:
-------------------------------------
$titel:\n\n$beschrijving
-------------------------------------
$extra
-------------------------------------
";

  $header = "From: " . $afzender . "\n"; 
  $boundary = strtoupper(md5(uniqid(time()))); 
  $header .= "MIME-version: 1.0\n"; 
  $header .= "Content-Type: multipart/mixed;\n"; 
  $header .= "\tboundary= " . $boundary . "\n\n"; 
  $header .= "This is a multi-part message in MIME format.\n\n"; 

  $header .= "--" . $boundary . "\n"; 
  $header .= "Content-Type: " . $ct . ";\n"; 
  $header .= "\tcharset=\"iso-8859-1\"\n"; 
  $header .= "Content-Transfer-Encoding: quoted-printable\n\n"; 

  $header .=  $bericht . "\n\n";
  $header .= "--" . $boundary . "\n"; 
  $header .= "Content-Type: application/octetstream;\n"; 
  $header .= "Content-Transfer-Encoding: base64\n"; 
  $header .= "Content-Disposition: attachment; filename=\"".$file1_naam."\"\n\n"; 
  $header .= $file1_content . "\n\n"; 

  $header .= "--" . $boundary . "\n"; 
  $header .= "Content-Type: application/octetstream;\n"; 
  $header .= "Content-Transfer-Encoding: base64\n"; 
  $header .= "Content-Disposition: attachment; filename=\"".$file2_naam."\"\n\n"; 
  $header .= $file2_content . "\n\n"; 
  $header .= "--" . $boundary . "--"; 

mail($aan,$onderwerp,"",$header)


$ct is geef ik dus nergens een waarde .. nie goed. Wat moet hier eigenlijk in komen te staan?

[ Voor 11% gewijzigd door Wolf3D op 11-10-2005 17:16 ]


Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

In het eerste geval bijvoorbeeld "Content-Type: text/plain; charset=us-ascii" (voor het tekst gedeelte).

Die charset staat er nu bij jou ook nogal loos in ;)

[ Voor 26% gewijzigd door Bosmonster op 11-10-2005 17:21 ]


Acties:
  • 0 Henk 'm!

  • mocean
  • Registratie: November 2000
  • Laatst online: 04-09 10:34
Het Content Type misschien?

Koop of verkoop je webshop: ecquisition.com


Acties:
  • 0 Henk 'm!

  • Wolf3D
  • Registratie: Augustus 2001
  • Laatst online: 22-08 12:03
Oooooh, dus toch! :P
Mijn vraag was alleen welke content type precies, maar deze vraag is beantwoord door bosmonster.

Waar ik alleen al bang voor was ... het maakt niet veel uit voor de output. Geen verschil, en "Uw" erbij gooit nog steeds alle 4 regels op één hoop. Gek!

Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 14:28
Probeer eens een class als PHPmailer. Daarmee fix je in 1x dit soort bugs, afijn je omzeilt ze.

Acties:
  • 0 Henk 'm!

  • dajappie
  • Registratie: Januari 2005
  • Laatst online: 13:10
Andere mailer is sowieso een goed idee. Waarom prop je trouwens het hele mailtje in de headers? Alleen de Mime-type, From en Boundary horen daar in, de rest gewoon als body. Verder horen in een header geen complete witregels, volgens mij stopt nl. de header na \n\n. Alles wat je daarna nog stuurt hoort bij de body, dus na de boundary lijkt afgebroken te worden (wat overigens klopt in dit geval natuurlijk). Probeer eens in een simpele webmailer de exacte source en/of alleen headers van het verstuurde mailtje te bekijken of en zoja waar het misgaat. Mail() is in mijn ervaring niet ideaal voor dit soort uitgebreidere dingen.

[ Voor 12% gewijzigd door dajappie op 11-10-2005 18:18 ]


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 16:36
Volgens mij komt je probleem doordat je quoted-printable als transfer encoding instelt, terwijl je de tekst niet encodeert. Als je die header weglaat voor je text moet het goedgaan. Waarom het wel werkt zonder de Uw is me overigens een raadsel...

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • stekkel
  • Registratie: Augustus 2001
  • Laatst online: 17-09 08:05
Een aantal dingen:
1) gebruik \r\n i.p.v. \n in de body van een bericht
2) Zie dajappie, verstuur de body apart
3) zoals al eerder gezegd, bij quoted printable moet je de content ook als quoted printable coderen. (gebruik dus Content-Type: text/plain)
4) De maximale lijnlengte die geadviseerd wordt is 76 (exclusief \r\n).

Acties:
  • 0 Henk 'm!

  • Wolf3D
  • Registratie: Augustus 2001
  • Laatst online: 22-08 12:03
Kijk! Dank allen voor deze nuttige informatie!
Ik had niet verwacht dat er nog zoveel fouten in zaten, dacht dat ie wel redelijk klopte zo. Had er ook nooit problemen mee, behalve die regels die bij elkaar werden gegooid.

Ik ga morgen als ik wat meer tijd heb alles toepassen! Ben benieuwd of het met de tekst dan ook beter gaat, incl. 'Uw' :P. Jullie horen nog van me, maar iig bedankt tot dusver.

Acties:
  • 0 Henk 'm!

  • Wolf3D
  • Registratie: Augustus 2001
  • Laatst online: 22-08 12:03
Ik ben een paar hele kleine stapjes dichter bij het eindresultaat.
Van het puntenlijstje van stekkel heb ik 1) en 3) toegepast, en .. alles werkt nog, maar verder geen verandering. De mail komt nog steeds op dezelfde manier aan.

Bij puntje 2) loop ik echter helemaal vast. Als ik het stukje met de attachments in het message gedeelte zet werkt het niet meer. Of bedoelde dajappie dit niet?

Ik moet ook eerlijk zeggen dat ik nergens goeie voorbeelden kan vinden. Het is altijd weer heel anders dan ik wil. Het is of een simpele mailer zonder attachments, of zo'n uitgebreide dat ik door de bitjes de bytes niet meer zie. Dus als iemand een redelijk te snappen voorbeeld weet te vinden hoor ik dit ook graag...

Acties:
  • 0 Henk 'm!

  • stekkel
  • Registratie: Augustus 2001
  • Laatst online: 17-09 08:05
Probeer dit eens: (let op, ik heb niks getest.)
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
$header = "From: " . $afzender . "\n"; 
  $boundary = strtoupper(md5(uniqid(time()))); 
  $header .= "MIME-version: 1.0\n"; 
  $header .= "Content-Type: multipart/mixed;\n"; 
  $header .= "\tboundary= " . $boundary . "\n\n";

  $ct = 'text/plain';
  $rn = "\r\n";  
  $body = "This is a multi-part message in MIME format".$rn.$rn; 

  $body .= "--" . $boundary . $rn; 
  $body .= "Content-Type: " . $ct . ";$rn"; 
  $body .= "\tcharset=\"iso-8859-1\"$rn"; 
  $body .= "Content-Transfer-Encoding: 8bit".$rn.$rn; 

  $body .=  $bericht . $rn.$rn;
  $body .= "--" . $boundary . $rn; 
  $body .= "Content-Type: application/octetstream;".$rn; 
  $body .= "Content-Transfer-Encoding: base64".$rn; 
  $body .= "Content-Disposition: attachment; filename=\"".$file1_naam."\"".$rn.$rn; 
  $body .= $file1_content . $rn.$rn; 

  $body .= "--" . $boundary . $rn; 
  $body .= "Content-Type: application/octetstream;".$rn; 
  $body .= "Content-Transfer-Encoding: base64". $rn; 
  $body .= "Content-Disposition: attachment; filename=\"".$file2_naam."\"".$rn.$rn; 
  $body .= $file2_content . $rn.$rn; 
  $body .= "--" . $boundary . "--".$rn; 

mail($aan,$onderwerp,$body,$header)

[ Voor 30% gewijzigd door stekkel op 12-10-2005 11:39 ]


Acties:
  • 0 Henk 'm!

  • Wolf3D
  • Registratie: Augustus 2001
  • Laatst online: 22-08 12:03
Geprobeerd! En .. het werkt!! Toppie!

Maar.....het woordje 'Uw' erbij zorgt nog steeds voor dat die 4 regels bij elkaar op 1 hoop worden gegooid. Wel zie ik nu dat dit probleem zich alleen voordoet in Outlook 2003. Als ik de mail bekijk in bijv. SquirrelMail, of Outlook XP dan wordt hij WEL goed weergegeven. :S

Erg irritant. Moet ik dit maar gewoon negeren? Is het een bug in Outlook 2003? Of is er toch nog iets wat ik over het hoofd heb gezien?

Ik ben iig blij dat het mailtje nu op een correcte manier en met de juiste headers en content gestuurd wordt .. zodat dit niet opeens in de toekomst problemen gaat geven oid. Mijn dank daarvoor!

Acties:
  • 0 Henk 'm!

  • stekkel
  • Registratie: Augustus 2001
  • Laatst online: 17-09 08:05
Als het in squirrelmail wel goed werkt dan moet het haast wel een outlook bug zijn :)

Acties:
  • 0 Henk 'm!

  • Wolf3D
  • Registratie: Augustus 2001
  • Laatst online: 22-08 12:03
Ja, lijkt er wel op idd...
Ik heb het maar opgelost door het woordje "Uw" weg te halen, hoewel ik het een vreemde 'oplossing' vind. Maar het e-mailtje komt nu iig goed aan, met nieuwe regels op de juiste plek!

Bedankt voor jullie hulp!
Pagina: 1