web-dev-qa-db-fra.com

Le courrier HTML est interrompu par de nouvelles lignes

J'utilise les modules Mail system et Swift mailer * pour envoyer des e-mails HTML. J'ai ensuite implémenté un module personnalisé pour envoyer des newsletters HTML aux utilisateurs, et j'ai remarqué les e-mails ne semblaient pas comme prévu: de nombreux styles continuaient de se briser au hasard.

Après avoir creusé, j'ai découvert que le problème était que la chaîne de courrier électronique était interrompue au hasard par de nouvelles lignes: si une nouvelle ligne arrivait dans une position critique dans la chaîne, tout le courrier serait rompu. J'avais besoin de savoir d'où venaient ces étranges nouvelles lignes.

Il s'est avéré que je ne fais rien pour m'attendre à cela.

$body = 'some html code without new lines';
$body .= 'some more html code without new lines';
$body .= 'some more and some more html code without new lines';

$params['body'] = Markup::create($body);
$language = $recipient['lang'];
$to = $recipient['mail'];
$params['to'] = $to;
$result = $mailManager->mail('custom_newsletter_mail', 'newsletter', $to, $language, $params, $from, $send_bool);

Je ne sais pas ce que fait Markup::create($body), j'ai donc essayé de le supprimer. L'e-mail a été livré sans nouvelles lignes, mais le code HTML n'a pas été rendu.

Dans la configuration du système de messagerie, j'ai défini swiftmailer comme FORMATTER et par défaut PHP mailer comme SENDER.

Il s'agit du fichier .module du module personnalisé.

function custom_newsletter_mail_mail($key, &$message, $params) {
  $message['body'] = [];
  $message['subject'] = [];
  $message['format'] = 'text/html';
  $message['subject'] = $params['title'];
  $message['body'][] = $params['body'];
  $message['headers'] = array(
    'content-type' => 'text/html',
    'charset' => 'UTF-8',
    'format' => 'flowed',
    'delsp' => 'yes',
    'from' => $params['from']
  );
}

J'ai découvert que mon environnement de test envoie des e-mails sans nouvelles lignes (l'e-mail semble comme prévu), contrairement à mon environnement de production. J'ai revérifié chaque paramètre; les deux sont identiques pour autant que je sache.

J'ai essayé d'utiliser le courrier mime au lieu de Swift mailer et cela a fonctionné !! il n'y a pas de sauts de ligne ou d'espaces (le courrier HTML a l'air bien), MAIS le courrier mime n'atteint que les messages en direct. Il ne fonctionne pas travailler avec yahoo ou gmail pour une raison quelconque.

Je dois réparer cela. Je dois supprimer ces nouvelles lignes ennuyeuses dans le corps de l'e-mail, ce qui, selon moi, est un problème de courrier électronique Swift.

2
Bassem Mohamed

Vous ne pouvez pas envoyer d'e-mail sans saut de ligne.

La norme SMTP nécessite que les lignes soient limitées à 1000 caractères. 998 vraiment parce que la ligne doit se terminer par "\r\n".

Si vous évitez avec succès d'insérer des sauts de ligne, ce qui se passera, c'est que de nombreux serveurs de messagerie sur Internet rejetteront votre courrier électronique. Certains l'accepteront, car ils ont décidé d'ignorer les normes. Devinez qui fait ça.

Beaucoup de serveurs ne le feront pas.

La bonne réponse à ce problème consiste à créer des e-mails HTML contenant des sauts de ligne. C'est vraiment facile à faire. Choisissez quelques éléments qui se produisent assez souvent, comme </tr> si vous utilisez des tables et des accolades de fin de règle CSS, et placez une nouvelle ligne après.

La révision de votre code HTML vous aidera également à éviter un texte HTML très stupide, si vous le souhaitez. Je regardais juste la source sur un email de newsletter de TweakTown où ils incluent d'abord un tas de règles CSS en haut. Ensuite, chaque ligne du tableau répète le même CSS que les styles en ligne. Vraiment. Pourquoi? Pas étonnant que leurs lignes comportent plus de 1 000 caractères.

Alors, les gens créent-ils intentionnellement du HTML sans saut de ligne pour économiser de l'espace? Parce que si c'est le cas, le spam de règles CSS est l'opposé de gagner de l'espace.

2
Zan Lynx