Jump to content

[Resolu]Récupération du body des mails


rebo

Recommended Posts

Bonsoir,

Suite à un changement de serveur je suis obligé d'utiliser le mode SMTP de prestashop pour envoyer des mails mais celui-ci ne fonctionne pas donc j'utilise une autre méthode utilisant également le SMTP qui fonctionne parfaitement. Mais je reste bloqué sur la récupération du texte des mails, ce qui est appelé body sur prestashop . Je dispose de toutes les informations dont j'ai besoin pour envoyer correctement mes mails mais cela ne sert à rien si je n'ai pas le texte. J'utilise prestashop 1.6.1.17 et n'utilise que les mails en format txt.  

Le code est dans la fonction send() du fichier mail.php se trouvant dans classes mais impossible de savoir quelle fonction utiliser sur l'instance $message ou $swift.

$message->getBody(); ou $message->_bodyToString() m'envoie sur une erreur 500 tandis que $message->toString(); me renvoie tout le contenu de l'objet message donc inutile mais cela montre bien que $message possède toutes les infos nécessaire à la construction du mail.

 

Edited by rebo (see edit history)
Link to comment
Share on other sites

Bonjour.

Comme son nom l'indique la méthode send() de Mail envoie un message. Donc elle ne permet pas de récupérer le texte du mail, elle envoie le mail. Elle retourne false en cas d'erreur ou un entier correspondant au nombre de destinataires/messages si tout a fonctionné.

Ensuite les argument sont détaillés dans le fichier Mail.php, il suffit de regarder à quoi ils correspondent.

Pour résumer le fonctionnement de cette méthode, on peut comparer ça à du publipostage comme on peut en faire avec Word.

Le template contient des "emplacements" qui serviront à injecter le contenu des variables.

Si le template contient {firstname} et {lastname} il faudra que l'array $template_vars soient formatés comme ceci :

$template_vars = array(
    '{firstname}' => $firstname,
    '{lastname}' => $lastname,
);

Il faut bien faire attention aux accolades car derrière il y a un système de remplacement de chaînes de caractères (str_replace() si ma mémoire est bonne) donc s'il n'y a pas de correspondance ça ne fonctionnera pas.

Link to comment
Share on other sites

C'est un peu ce que je voulais éviter de faire et utiliser les fonctions déjà existantes pour obtenir le texte final car il y a bien quelque chose qui utilisent ces variables et le template pour en faire un texte. 

Dans la fonction sendMailTest il y a un texte que l'on ajoute à l'instance $message avec la ligne ->setBody($content);  ce fameux content est le texte final sachant que l'instance $message de la fonction test et celle utilisée pour envoyer les mails aux clients sont du même type (Swift_Message) il doit bien y avoir un moment où on donne à l'instance $message le texte final avant son envoi mais où ? C'est ce que je cherche à découvrir.

Je retrouve le setBody à la ligne 366 mais elle est utilisée pour donner les pièces jointes et non le texte.

$message->attach(Swift_Attachment::newInstance()->setFilename($attachment['name'])->setContentType($attachment['mime'])->setBody($attachment['content']));

Edited by rebo (see edit history)
Link to comment
Share on other sites

La classe Mail de PS implémente la bibliothèque SwiftMailer, qui est une des plus communes (en PHP en tout cas)

Si vous voulez réinventer la roue vous pouvez coder votre propre implémentation.

Mais ça sent la perte de temps, il faudrait plutôt chercher à comprendre et résoudre le problème que vous avez avec le mode SMTP.

S'il ne fonctionne pas c'est qu'il doit y avoir une raison. Le serveur de courrier doit renvoyer une erreur, il faut savoir laquelle. 

Link to comment
Share on other sites

Le 27/12/2017 à 10:12 AM, BeComWeb a dit :

La classe Mail de PS implémente la bibliothèque SwiftMailer, qui est une des plus communes (en PHP en tout cas)

Si vous voulez réinventer la roue vous pouvez coder votre propre implémentation.

Mais ça sent la perte de temps, il faudrait plutôt chercher à comprendre et résoudre le problème que vous avez avec le mode SMTP.

S'il ne fonctionne pas c'est qu'il doit y avoir une raison. Le serveur de courrier doit renvoyer une erreur, il faut savoir laquelle. 

J'aimerai ne pas réinventer la roue mais je n'ai pas vraiment le choix.

Sans encryption  -> Expected response code 250 but got code "530", with message "530 5.7.0 Must issue a STARTTLS command first "

Encryption TLS -> Unable to connect with TLS encryption

Encryption SSL -> Connection could not be established with host mondomain.com [ #0]

 

Pour palier à ce problème j'utilise PHPMailer et n'ai aucun soucis à envoyer des mails sans aucune encryption.

 

 

 

 

Link to comment
Share on other sites

La version est 1.6.1.17 et je ne connais pas le nom du serveur mail mais mon hébergeur est Ikoula. Ils décrivent comment configurer l'envoi de mail par SMTP ici https://support.ikoula.com/index-1-2-136-2672-Hébergement-Linux-Mail-Imap.html

 

Dans mon back office j'ai rempli dans l'ordre

nomdedomain.com

mail.nomdedomain.com

[email protected]

mdp

aucune encryption

port 587

 

Ce sont les même informations que je fournis lors de l'envoi d'un mail avec PHPMailer.

 

Link to comment
Share on other sites

Déjà le port 587 et pas de chiffrement ça me semble étrange. Pas impossible mais étrange. Vous avez essayé sur le 25 ?

Ensuite est ce que l'adresse mail d'expédition est la même que celle qui est définie comme adresse mail de la boutique (menu "Préférences > Coordonnées et Magasins") ?

Edited by BeComWeb (see edit history)
Link to comment
Share on other sites

Les seuls informations que j'ai au sujet de l'erreur que me produit la configuration SMTP est que SwiftMailer ne supporte pas STARTTLS qu'utilise justement mon serveur mail donc je ne peux bel et bien pas utiliser ce que me donne prestashop pour envoyer des mails avec SMTP. Je m'étais tourné vers cela car mon hébergeur a désactivé la fonction mail() de PHP.

 

Par rapport à 

Tools::file_get_contents('chemin_vers_le_template/nom_du_template.html');

 

cela est utilisé pour recupérer le template à utiliser et se trouvent dans les variables $template_html et $template_txt

Mais ces templates ne sont que dans leur version d'origine, il y a encore $user_name ect dans le texte. Ce que je cherche à obtenir c'est la version final du texte mais je ne sais pas ou et comment ils passent de $template_txt + $template_vars  au texte final.

template_vars disparait dans les limbes à ce moment $swift->registerPlugin(new Swift_Plugins_DecoratorPlugin(array($to_plugin => $template_vars))); (ligne 351)

le template_txt dans $message->addPart($template_txt, 'text/plain', 'utf-8'); (ligne 353)

Puis les 2 instances $message et $swift se retrouvent ici $send = $swift->send($message); (ligne 372)

 

 

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...