2012-09-25 4 views
2

Je redirige mes emails entrants vers un handler.php. Je peux le faire avec succès et ça marche, mais quand il arrive à sortir les variables de l'en-tête du mail, par exemple le "Sujet", ou "À", ou le "corps du message", je rencontre quelques problèmes. Voici le code que je suis arrivé de hereTravailler avec les en-têtes Email - PHP

Voici le code:

<?php 
//Assumes $email contains the contents of the e-mail 
//When the script is done, $subject, $to, $message, and $from all contain appropriate values 

//Parse "subject" 
$subject1 = explode ("\nSubject: ", $email); 
$subject2 = explode ("\n", $subject1[1]); 
$subject = $subject2[0]; 

//Parse "to" 
$to1 = explode ("\nTo: ", $email); 
$to2 = explode ("\n", $to1[1]); 
$to = str_replace ('>', '', str_replace('<', '', $to2[0])); 

$message1 = explode ("\n\n", $email); 

$start = count ($message1) - 3; 

if ($start < 1) 
{ 
    $start = 1; 
} 

//Parse "message" 
$message2 = explode ("\n\n", $message1[$start]); 
$message = $message2[0]; 

//Parse "from" 
$from1 = explode ("\nFrom: ", $email); 
$from2 = explode ("\n", $from1[1]); 

if(strpos ($from2[0], '<') !== false) 
{ 
    $from3 = explode ('<', $from2[0]); 
    $from4 = explode ('>', $from3[1]); 
    $from = $from4[0]; 
} 
else 
{ 
    $from = $from2[0]; 
} 
?> 

des e-mails Gmail, il devient le sujet, de,, et l'amende de corps de message, mais il ne fonctionne pas pour l'entrée emails de Yahoo.

Existe-t-il une classe php universelle compatible avec tous les fournisseurs de services de messagerie célèbres? que se passe-t-il si quelqu'un envoie un e-mail à partir de RoundCube ou d'un autre expéditeur? Comment j'ai pu détecter avec succès les variables?

Merci!

+0

Les en-têtes d'e-mail doivent être standard. Vous devez jeter un oeil aux courriels de Yahoo et d'autres qui ne fonctionnent pas et essayer de voir quelle est la différence. Cela pourrait être quelque chose d'un espace manquant après «Sujet:» à un problème de sensibilité à la casse. Les en-têtes devraient être assez similaires pour que vous puissiez trouver quelques bugs, cela fonctionnera pour tous les emails. Je crains de ne pas pouvoir proposer une bibliothèque fourre-tout – Basic

+0

@Basic ce n'est pas si simple! par exemple le code ci-dessus obtiendra ce texte inclus dans le corps de l'e-mail (de Yahoo) "--1375426159-60184550-1348612182 =: 61766 Content-Type: texte/html; jeu de caractères = us-ascii", comment je suis supposé vérifier tous les clients de messagerie? comment fonctionnent les applications Web telles que WHMCS/Kayako? Cela devrait être intéressant! – behz4d

Répondre

1

Le format de message que vous décrivez dans vos commentaires est Multi-Part Mime.

Il y a toute une série de choses à considérer - si l'e-mail est en HTML et texte brut, a intégré des images, pièces jointes, etc., etc.

Si la version de PHP que vous utilisez a Construit avec les extensions MailParse, ils devraient vous donner un ensemble d'outils assez simple à utiliser.

Il y a aussi le Mime Email Parser disponible sur Google que je n'ai pas encore utilisé mais qui semble assez simple.

1

Si vous avez besoin quelque chose d'assez simple, cela est un point de départ:

list($headers, $message) = explode("\n\n", $email); 

$header = imap_rfc822_parse_headers($headers); 

// You can now access 
$header->from; 
$header->to; 
$header->subject; 

La partie e-mail (même si seul) pourrait également être analysé en utilisant imap_rfc822_parse_adrlist().