Hallo, ik ben op zoek naar een voorbeeld van mailparse om alleen de verzend-datum uit een msg file de halen.
Meerdere pogingen ondernomen, lukt niet.

Met dank en vriendelijke groeten,
Wim


$msgpart->extract_headers(MAILPARSE_EXTRACT_RETURN)
er staat ook nog veel vaker "Date: " ..

Yes, daar gaat het mij nu om, ik wil de datum elke keer zien, ik weet ook dat deze er in staat, maar waar?

Imap gaat direct de mailbox in als ik het goed begrijp en niet voor losse .msg files
In het blok van de headers mbt DKIM staat bij mij nog een paar keer date:.
Weliswaar zonder spatie erachter, maar het is een risico.

Maar de vraag is, wat zit er op regel 19 in $result?

Hoe past dat met je zoektocht met strpos()?

Waarom eigenlijk de preg_replace() van regel 18?

persoonlijk zou ik als regex-fan eerder gaan voor

<?php
$aM = [];
$b = preg_match('#Date: ([A-Z]{3}, \d{1,2} [A-Z]{3} \d{4})#i', $result, $aM);

print_r($aM);
?>

Waarbij je dus op moet letten met jouw "16" aangezien je in de eerste 9 dagen van een maand een 1 karakter kortere string hebt.
De dump zonder date, bevat mij dus helemaal geen datum, daar gaat vraag dus over hier
$result is de variable uit de header zonder non -ascii tekens
Zonder de non ascii doe ik de str pos
preg_replace is het verwijderen van de non-ascci tekens
de eerste 9 dagen heb je 15 tekens en een spatie, daarna 16 werkt dus hele maand

Bedankt voor de preg_match, ook hier, als er toevallig in de body van de mail "Date:" zou staan, werkt dit ook niet meer
Mijn regex zoekt naar een stuk tekst dat begint met "Date: " maar per se gevolgd door "Mon, 01 Nov 9999"

of andere letters, danwel andere cijfers.

Als je met strpos() alleen maar zoekt naar "Date: " en er daarna vanuit gaat dat de daarop volgende 16 tekens de datum zijn, kún je net een andere "Date: " treffen.

Maar wat is het bezwaar tegen de non-ascii tekens? In elk geval voor het zoeken naar de datum lijkt met dat niet nodig.

[size=xsmall]Toevoeging op 31/10/2023 16:40:56:[/size]

a) kun je de datum eens proberen te vinden in $result ipv $var?

b) wat als je een letter u toevoegt?
dus ipv
$result = preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $var);
maak je ervan
$result = preg_replace('/[\x00-\x1F\x80-\xFF]/u', '', $var);
Mijn regex zoekt naar een stuk tekst dat begint met "Date: " maar per se gevolgd door "Mon, 01 Nov 9999"
Yes ...je hebt gelijkt.. Top

Ik zoek de datum in $result, maar deze staat in beide niet

Letter u toevoegen, wat zou dat kunnen veranderen? Snap ik ff niet
die U zorgt ervoor dat je regex ervan bewust is dat er 2byte karakters in je tekst staan.

Dus dan hakt hij niet botweg de eerste of tweede byte weg van een karaketer.

Maar je opmerking
"Ik zoek de datum in $result, maar deze staat in beide niet"

Als je zelf kijkt (var_dump) zie je die datum ook niet staan? Want dan heeft geen enkele zoekopdracht zin natuurlijk

Kun je een dump laten zien van $result voor het geval het misgaat? (waarbij je dan liefst even de mailadressen vervangt door [email protected])

En dan is het voldoende om te laten zien tot iets voorbij de mogelijke datum
Inderdaad, als ik in $var en of $result zoek, vind ik geen datum, en dat af en toe, dat is de vraag die ik hier stel.

Ook via een find op het scherm is een datum niet te vinden bij sommige message files.
en staat er wel een datum in de oorspronkelijke msg file?

[size=xsmall]Toevoeging op 01/11/2023 09:50:14:[/size]

mijn debugvolgorde zou zijn:

1) bekijke de msg file die mislukt eerst in notepad oid
2) MimeMessage is kennelijk https://github.com/php/pecl-mail-mailparse/blob/master/mailparse.c
Daar kun je niet veel aan debuggen.
3) $var zou de headers moeten bevatten van je msg. Is dat gevuld met iets? zit daar de datum ook bij?

4) $result: om een of andere reden wil je sommige ascii tekens (ascii code 250 is nog steeds ascii hoor) kwijt
doet dat wat je verwacht en niet te veel? klopt wat in $result zit nog steeds

5) daarna ga je zoeken. Ofwel met mijn regex, ofwel met strpos.
5a) strpos(): wat is $pos? is dat niet FALSE (= niet gevonden); $ppp: klopt de inhoud van $ppp met wat je verwacht?

6) strtotime(): begrijpt strtotime in dit geval de datum? Is er iets bijzonders met de datumstring? bijvoorbeeld dat de spatie achter : onbreekt, of dat er een extra Enter is, of dat de naam van de dag in het Frans is.
Elke Message heeft welzeker een datum als ik deze bekijk.
Als het php scripthe geen datum vind, dan staat deze ook niet in de dump van de variabele $var of result. Dat is snel gecheckt.
Dus het ligt er niet aan hoe de datum eruit gehaald zou moeten worden
Met dank
Als je datum wel in de raw file staat, maar niet in $var dan gaat $msgpart->extract_headers() mis.

How about:

<?php
$file = "Bosche Bollen.msg";
$content = file_get_contents($file);

$aM = [];
$b = preg_match('#Date: ([A-Z]{3}, \d{1,2} [A-Z]{3} \d{4})#i', $result, $aM);

echo '<pre>' . print_r($aM, true) . '</pre>';
?>


[size=xsmall]Toevoeging op 03/11/2023 21:51:06:[/size]

Ik ben trouwens nog steeds benieuwd wat dan WEL in $var staat.

Ik kan me niet voorstellen dat alleen de datum verdwijnt. Zit er überhaupt wel inhoud in die var?

Reageren