2010-08-05 3 views
0

J'ai un client qui voulait que son personnel de vente soit capable de remplir des modèles html 2 colonnes hautement conçus et d'envoyer des emails en utilisant ceux-ci. 6 destinataires max par email. Solution a très bien fonctionné jusqu'à ce qu'ils ont décidé qu'ils veulent envoyer à chacun des destinataires séparément. Pas de CC, pas de BCC.PHP mail() envoie un contenu vide lors d'une boucle sur un tableau d'adresses

Je me suis rendu compte que j'avais simplement implosé le tableau d'adresses avant de boucler à la place, mais cela a produit des emails avec du contenu vide. La ligne d'objet était correcte mais le contenu était zéro octet. Il est intéressant de noter que si j'insère un die() et que je jette le $ html_text à l'écran, je vois ce que je pense avoir comme contenu. Au départ, j'ai mis le contenu, le sujet etc en dehors de la boucle, mais en voyant le contenu vide, je pensais que je devrais peut-être définir les vars dans la boucle si cela n'avait aucun sens pour moi. Cela n'a rien changé.

Voici le code de mise en boucle:

if (count($_SESSION['recipients']) > 0) { 
foreach ($_SESSION['recipients'] as $to) { 
    $template = $_SERVER['DOCUMENT_ROOT'] . '/leads/templates/'.$_SESSION['templateFile']; 
    ob_start(); 
    include($template); 
    $html = ob_get_contents(); 
    ob_end_clean(); 

    if (strlen($html) == 0) { 
    echo "The template at $template did not load."; 
    exit; 
    } 

    $bullets = unslash($_SESSION['bullets']); 
    $bullets = preg_replace('/<li>/', '* ', $bullets); 
    $bullets = strip_tags($bullets); 
    $TextMessage = strip_tags(unslash($_SESSION['message'])) . "\n\n" . $bullets; 

    $notice_text = "This is a multi-part message in MIME format."; 
    $plain_text = str_replace('&nbsp;',' ', $TextMessage); 

    $html_text = $html; 

    $email = $_SESSION['user']->email; 
    $name = $_SESSION['user']->first_name . ' ' . $_SESSION['user']->last_name; 
    $from = "$name <$email>"; 
    $subject = unslash($_SESSION['subject']); 

    $semi_rand = md5(time()); 
    $mime_boundary = "==MULTIPART_BOUNDARY_$semi_rand"; 
    $mime_boundary_header = chr(34) . $mime_boundary . chr(34); 

    $body = "$notice_text 

    --$mime_boundary 
    Content-Type: text/plain; charset=us-ascii 
    Content-Transfer-Encoding: 7bit 

    $plain_text 

    --$mime_boundary 
    Content-Type: text/html; charset=us-ascii 
    Content-Transfer-Encoding: 7bit 

    $html_text 

    --$mime_boundary--"; 

    if (@mail($to, $subject, $body, 
    "From: " . $from . "\n" . 
    "MIME-Version: 1.0\n" . 
    "Content-Type: multipart/alternative;\n" . 
    "  boundary=" . $mime_boundary_header)) { 
    $out .= " Email sent to " . htmlentities($to) . ".<br />"; 
    } else { 
    $out .= " Email to htmlentities($to) NOT sent successfully!"; 
    } 
} // foreach 

Des conseils très appréciés!

2010.08.06 - EDIT: J'ai essayé de remplacer $ html_text et $ plain_text par du texte codé en dur et trouvé les mêmes résultats: Envoi de courrier vide. Également essayé de déplacer la génération $ mime_boundary et $ mime_boundary_header en dehors de la boucle sans succès.

Cependant, si j'ajouter die('<pre>'.$body.'</pre>'); immédiatement après la poste vide est envoyé, je vois tout ce que je me attends dans le code HTML et le texte et les limites ... Voici un exemple:

This is a multi-part message in MIME format. 

    --==MULTIPART_BOUNDARY_94e43eed6cf2826fc5787c860814066e 
    Content-Type: text/plain; charset=us-ascii 
    Content-Transfer-Encoding: 7bit 

    My plain text here 


* Bullet point 1 
* Bullet point 2 


    --==MULTIPART_BOUNDARY_94e43eed6cf2826fc5787c860814066e 
    Content-Type: text/html; charset=us-ascii 
    Content-Transfer-Encoding: 7bit 

// RENDERED HTML CONTENTS SHOW UP HERE 
+0

Comme vous l'avez souligné, le déplacement du code de chargement du gabarit vers le corps de la boucle ne devrait pas être nécessaire. –

+0

Andre - Certainement mais je craignais que leur utilisation dans le $ body soit liée à leur indéfini. Saisir des pailles pour lutter contre un comportement mystérieux. – jerrygarciuh

Répondre

0

Je reconnais volontiers que je ne sais pas pourquoi cela réussit là où l'foreach() a échoué, mais la solution kludgy était d'éliminer le foreach() et d'affecter les six adresses possibles comme ceci:

// #5 // 
if ($to = $_SESSION['recipients'][4]) { 
    mail($to, $subject, $body, 
    "From: " . $from . "\n" . 
    "MIME-Version: 1.0\n" . 
    "Content-Type: multipart/alternative;\n" . 
    "  boundary=" . $mime_boundary_header); 
    echo "Email sent to " . htmlentities($to) . ".<br />"; 
} 

Il fait le travail ici sans autres modifications de code et comme Larry Wall a déclaré que "Makeshifts dure le plus longtemps."

1

montrant peut-être le contenu de chaque variable composant en boucle pourrait donner quelques idées?

On dirait qu'une valeur NULL peut apparaître dans la composition $ body d'une manière ou d'une autre - d'abord instinct.

+0

Merci pour la réponse. Comme je l'ai mentionné, j'ai essayé de vider la variable de contenu et j'ai trouvé qu'elle contenait du HTML attendu. De plus, j'ai essayé de remplacer $ html_text et $ plain_text par un "oh hai" codé en dur et j'ai constaté que cela n'a pas donné de résultats différents. – jerrygarciuh