Envoi Mails en Text / HTML et Fichier joint

Résolu/Fermé
rjl Messages postés 543 Date d'inscription mardi 16 mars 2004 Statut Membre Dernière intervention 25 mai 2019 - 3 sept. 2012 à 22:16
 Utilisateur anonyme - 12 sept. 2012 à 19:00
Bonsoir à Tous,

J'ai à envoyer à des adhérents (entre 60 et 150), tous les 15 jours, des mails avec un fichier Word joint et ce en text et HTML pour que le système récepteur décide du choix approprié (Text ou HTML).

Les tuto existent mais de qualité très variables et, même ayant choisi le Site du Zéro ( http://www.siteduzero.com/tutoriel-3-35146-e-mail-envoyer-un-e-mail-en-php.html#ss_part_1 ), j'ai peut-être visé un peu haut !
J'ai adapté le code à mon cas... mais j'ai, de plus, cru utile de passer en guillemets simples (') plutôt que doubles ("). Au final, même pensant ce choix justifié, j'ai du mal à m'y retrouver entre les échappements d'apostrophe et les antislash doublés, mais parfois aussi précédant des apostrophes.

Ma demande est triple :

*** le code origine étant accessible par le lien joint ci-dessus, de vérifier, et sans doute corriger mon code au niveau des ' et /

*** voir l'erreur en ligne 28 soit
$message_txt. = 'J\'ai le plaisir de communiquer à tous les inscrits qui ont fourni une adresse courriel valable le compte rendu de la dernière conférence de la saison écoulée.'.$passage_ligne;
traduite par le message : "Parse error: syntax error, unexpected '=' in /web/utlsudgoelo/www/pgUTL/Lanceur.php on line 28" alors que la possibilité $message_txt. = amène une concaténation sur le champ de gauche du contenu du membre de droite ?

*** Si nécessaire me donner votre avis sur la démarche pour envoi de ces mails.

Je vous remercie d'avance de votre implication. A bientôt. RJL2903

Ci-joint le code à partir de la ligne 13 après une amorce PHP sans utilité dans ce cadre :
<!DOCTYPE html>
	<html lang="fr"><head>
	<title>AdhMails</title>
<?php
$mail = 'rjl6122@gmail.com'; // Déclaration de l'adresse de destination.
if (!preg_match("#^[a-z0-9._-]+@(hotmail|live|msn).[a-z]{2,4}$#", $mail)) // filtrer serveurs avec bogues.
{
	$passage_ligne = "\r\n";
}
else
{
	$passage_ligne = "\n";
}
//=====Déclaration des messages au format texte et au format HTML.
$message_txt = 'Bonjour à tous les adhérents de l\'UTL Sud Goëlo,'.$passage_ligne;
$message_txt. = 'J\'ai le plaisir de... saison écoulée.'.$passage_ligne;
$message_txt. = 'S\'il est sans intérêt... radié de cette diffusion.'.$passage_ligne;
$message_html = '<html><head></head><body><h1>Bonjour à tous les adhérents de l\'UTL Sud Goëlo,</h1>'.$passage_ligne;
$message_html. = '<p>J\'ai le plaisir de... saison écoulée.</p>'.$passage_ligne;
$message_html.= '<p>Ce document, en pièce jointe, ... Office ou Swriter)<br />'.$passage_ligne;
$message_html. = 'S\'il est sans intérêt... radié de cette diffusion.</p>'.$passage_ligne.;
//==========
//=====Lecture et mise en forme de la pièce jointe
$fichier1  = 'www\\conf\\2529LoiLittoral\\LoiLittoral.php';
fopen($fichier1,'r'); // mettre résultat en $fichier1 ?
$attachement = fread($fichier1, filesize($fichier1));
$attachement = chunk_split(base64_encode($attachement));
fclose($fichier1);
//==========
//=====Création de la boundary
$boundary = '-----='.md5(rand());
//==========
$sep = md5(uniqid()); 
//=====Définition du sujet.
$sujet = 'Essai envoi de Compte-rendu !';
//=========
//=====Création du header de l'e-mail.
$header = 'From: \'webmaster\\'<webmaster@utl-sud-goelo.org>'.$passage_ligne;
$header.= 'Reply-to: \\'webmaster\\'<webmaster@utl-sud-goelo.org>'.$passage_ligne;
$header.= 'MIME-Version: 1.0'.$passage_ligne;
$header.= 'Content-Type: multipart/mixed;'.$passage_ligne'.'boundary=\\'$boundary\\'\'.$passage_ligne;
//==========
//=====Création du message.
$message = $passage_ligne.'--'.$boundary.$passage_ligne;
//=====Ajout du message au format texte.
$message.= 'Content-Type: text/plain; charset=\\'ISO-8859-1\''.$passage_ligne; // Mails lisent tous ISO-8859-1
$message.= 'Content-Transfer-Encoding: 8bit'.$passage_ligne;
$message.= $passage_ligne.$message_txt.$passage_ligne;
//==========
$message.= $passage_ligne.'--'.$boundary.$passage_ligne;
//=====Ajout du message au format HTML
$message.= 'Content-Type: text/html; charset=\\'ISO-8859-1\\''.$passage_ligne;
$message.= 'Content-Transfer-Encoding: 8bit'.$passage_ligne;
$message.= $passage_ligne.$message_html.$passage_ligne;
//==========
$message.= $passage_ligne.'--'.$boundary.'--'.$passage_ligne;
$message.= $passage_ligne.'--'.$boundary.'--'.$passage_ligne;
//==========
//=====Envoi de l'e-mail.
if(mail($mail,$sujet,$message,$additional_headers)) {
echo 'Email envoyé';
} else {
	echo 'Email non envoyé';
}
//==========
?>
     </body>
     </html>





A voir également:

11 réponses

Utilisateur anonyme
4 sept. 2012 à 00:00
Bonsoir rjl :-)

Voici ma triple réponse :
1 - Je vais regarder ton lien et je reviens
2 - l'opérateur qui combine la concaténation et l'affectation, c'est .= SANS ESPACE entre le . et le =
3 - je n'ai as regardé le détail de ton envoi de mail. Après avoir procédé comme toi pendant plusieurs années, c'est à dire tout faire à la main, je suis passé à phpmailer (bibliothèque php gratuite) depuis deux mois et je n'ai plus envie de revenir en arrière.
0
Utilisateur anonyme
4 sept. 2012 à 00:19
Ton éditeur ne colorie pas les chaînes ? Normalement, ça suffit pour détecter les erreurs.
Un truc : si tu veux mettre des simple quotes autour de certaines parties de ton texte, comme 'webmaster', il vaut mieux écrire ta chaîne entre double quotes : comme ça, tu n'as pas à échapper les simples quotes, ça rend le code plus lisible et ça limite les erreurs. Surtout qu'en définissant tes chaînes entre doubles quotes, tu peux mettre tes variables directement dedans, pas besoin de concaténation, c'est encore une source d'erreur de moins...

Par exemple :
$header = "From: 'webmaster' <webmaster@utl-sud-goelo.org>$passage_ligne";
$header.= "Reply-to: 'webmaster' <webmaster@utl-sud-goelo.org>$passage_ligne";
$header.= "MIME-Version: 1.0$passage_ligne";
$header.= "Content-Type: multipart/mixed;$passage_ligne";
$header.= "boundary='$boundary'$passage_ligne";
0
rjl Messages postés 543 Date d'inscription mardi 16 mars 2004 Statut Membre Dernière intervention 25 mai 2019 49
4 sept. 2012 à 00:58
Merci de tes réponses ; je n'ai pas le temps de les voir en détail maintenant ayant encore un courrier à écrire et faire partir en mail.
Toutefois, j'avais regardé (de loin) phpmailer mais hésité à me rajouter cela sur le dos !
Si tu penses que ce sera plus simple ou sécurisant... pourquoi pas !
@+ et merci
René-Jacques RJL2904
0
Utilisateur anonyme
4 sept. 2012 à 08:17
Oui, je pense vraiment que c'est plus simple. Ils donnent des exemples. Tu passes une ou deux heures à le faire marcher et ensuite c'est beaucoup plus simple à utiliser. De plus, comme ceux qui l'ont écrit connaissent bien mieux que nous les RFC, les mails envoyés ne finissent pas en spam.
0
rjl Messages postés 543 Date d'inscription mardi 16 mars 2004 Statut Membre Dernière intervention 25 mai 2019 49
5 sept. 2012 à 00:57
Bonjour le père,

Une situation embrouillée...
Après quelques péripéties difficultés à dézipper, coloration syntaxique à restaurer, etc, j'accède à class.phpmailer.php.
J'ai pris en compte le tuto de développez.com
Un mail d'essai à fonctionné avec les habituels problèmes d'encodzge !
Dans l'immédiat, je traduis une note (20 pages) assez complète sur class.phpmailer.php.
C'est à la fois nécessaire mais pas simple sans la pratique !
Mail envoyé de l'un de mes comptes et reçu sur un autre :

Un mail envoyé avec PHPMailer!
Boîte de réception x

René-Jacques
17:00 (Il y a 7 heures)


à rjl40


Bonjour à tous les adhérents de l\'UTL Sud Goëlo,



J'ai pris bonne note de tes conseils et espère m'y remettre demain.
@bientôt RJL2905
0
Utilisateur anonyme
5 sept. 2012 à 08:07
pour l'encodage, recherche 'Charset' dans la doc :
$mail->CharSet = 'UTF-8';

Pour le \ devant l'apostrophe, je n'ai rien fait de spécial et je n'ai pas ce problème. Compte tenu de ton manque d'aisance avec les ' et les ", j'ai tendance à penser que c'est toi qui l'as ajouté dans ton message.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
rjl Messages postés 543 Date d'inscription mardi 16 mars 2004 Statut Membre Dernière intervention 25 mai 2019 49
8 sept. 2012 à 22:48
Bonjour à tous,

Je suis toujours sur une tentative d'utiliser PHPMailer ; toutefois, dans l'immédiat (et de manière pratique), j'ai révisé mes ambitions à la baisse : envoi de mail TEXT avec une unique pièce jointe (Word ou équivalent) envoyé par le serveur SMTP de mon hébergeur.

Il n'empêche que je patauge lamentablement malgré la lecture (et traduction de plusieurs tutos).
Je m'inquiète d'autant plus que le plus important et précis des tutos est de 2006 ( https://www.askapache.com/php/phpfreaks-eric-rosebrocks-phpmailer-tutorial/ ) " This is meant to be an improved version of the article written by PHPFreaks founder" !

PHPMailer est-il toujours employé ?

J'ai créé un fichier de configuration config.php et l'ai adapté à mon application, j'ai isolé class.phpmailer.php ainsi que d'autres php mis à disposition : class.smtp.php, class.extender.php, ou encore MailClass.inc ; je trouve, toujours dans le même tuto une Fonction FreakMailer() servant à instancier un objet Mail le tout avec une fonction SMTPSend(); pour l'envoi par SMTP... (au lieu du send() habituel)

Problème : je ne sais pas faire la jonction entre ces divers php d'autant que bien que venant d'un tuto unique, les éléments semblent redondants pour partie (sauf à ce que certains soient alimentés en cascade) ?

Ça fait beaucoup pour un débutant comme moi qui peine déjà à décrypter un $this-> d'initialisation d'une propriété...

Merci d'avance à qui peut m'éclairer sur ces aspects ou m'aiguiller sur des pistes d'aide
@bientôt RJL2908
0
Utilisateur anonyme
8 sept. 2012 à 23:10
Sur le site https://sourceforge.net/projects/phpmailer/ on voit que la dernière version date du 29 juillet 2012. Alors oui, phpmailer est encore vivant !

Pour ma part, je n'ai installé sur mon site que :
class.phpmailer.php
class.smtp.php
phpmailer.lang-fr.php

Tu n'as à faire d'include que de class.phpmailer.php, il se charge d'inclure les autres.

J'ai démarré en me servant de l'exemple test_smtp_basic.php du dossier examples de l'installation.
0
rjl Messages postés 543 Date d'inscription mardi 16 mars 2004 Statut Membre Dernière intervention 25 mai 2019 49
Modifié par rjl le 10/09/2012 à 22:42
Bonjour le père,

Une nouvelle fois, je me suis fait piéger par une réponse transmise hier soir et non récupérée ! C'est d'autant plus difficile pour reprendre le fil !
OK pour n'appeler que phpmailer.php ; j'ai aussi chargé le module français ; Quels sont les autres modules à préparer, même s'ils ont chargés automatiquement ? class.smtp ? Là encore, je crois que je vais avoir difficile à connaître l'adresse du serveur et espère aussi que le pasword est prévu.
J'indiquais que ça allait moins mal puisque (actuellement), avec tes indications, je n'ai plus de problème d'encodage !
Par ailleurs, j'ai pu faire des essais (très sages car limités à un message text) avec destinataires multiples, REPLY-TO, ...
Pour autant, j'ai bloqué sur l'envoi de pièces jointes et il va falloir pour la nième fois que je reprenne les tutos avec pièces jointes (généralement tournés vers le HTML : c'est tellement simple en Text... !). Je n'ai pas mis en place de frontière et c'est déjà, je suppose une cause de blocage !
Dans l'immédiat, je vais devoir me tourner vers mon hébergeur NUXIT car les serveurs entrant et sortant ne fonctionnent pas :
"Impossible d'ouvrir http://pop.MonSite/. Impossible de télécharger les données demandées."
Idem pour le serveur sortant :
"Impossible d'ouvrir http://smtp.MonSite/. Impossible de télécharger les données demandées."
A mon sens, il n'y a rien à paramétrer pour qu'il soit opérationnel.
Je suis intervenu sur le serveur NUXIT mais il n'y a guère que 2 ou 3 personnes valables pour intervenir et ses premiers conseils tombent forcément un peu à plat (4 tutos de base proposés (non que ça me fait du mal de lire ces tutos mais la réponse aux questions n'y est pas ! D'ailleurs, j'ai ouvert un ticket chez l'hébergeur lui-même car ça me parait sortir de l'ordinaire : les accès sont créés par NUXIT et, un peu comme pour PhpMadmin, je n'ai juste qu'à cliquer pour y accéder ! Dans ces conditions, ou il y a présentation des mails ou il est dit que le serveur est vide.

Voila, je te donnerai des nouvelles soit en cas de problème... soit si je progresse vraiment bien !!!
Bonne soirée RJL2910
0
rjl Messages postés 543 Date d'inscription mardi 16 mars 2004 Statut Membre Dernière intervention 25 mai 2019 49
Modifié par rjl le 10/09/2012 à 23:23
Et, les problèmes n'ont pas trainé... une intuition pour mon mot de passe et smtp a suffit pour me relancer... et j'ai fait fort : une erreur en ligne 105 pour un script de 43 lignes !
Warning: fsockopen() expects parameter 2 to be long, string given in /web/utlsudgoelo/www/index_fichiers/phpmailer/class.smtp.php on line 105
Language string failed to load: connect_host Je ne joins que le code du script d'envoi du mail :
?> 
<!DOCTYPE html> 
 <html lang="fr"><head> 
 <title>AdhMails</title> 
<?php 
 $passage_ligne = "\n"; 
 require('../index_fichiers/phpmailer/class.phpmailer.php'); 
 $mail = new PHPmailer();  
//    header('Content-type: text/plain; charset=UTF-8'); 
 $mail->CharSet = 'UTF-8'; 
 $mail->IsSMTP(); 
 $mail->SMTPAuth   = true;                  // enable SMTP authentication 
 $mail->SMTPSecure = 'ssl';                 // sets the prefix to the servier 
 $mail->Host='http://smtp.utl-sud-goelo.org'; // sets GMAIL as the SMTP server 
 $mail->Port       = 25;                   // set the SMTP port 
 $mail->Username   = 'p******r'; 
 $mail->Password   = 'J******B';          // pst password 
  
 $mail->From='r********ail.com'; 
 $mail->AddAddress('r*********e.fr'); 
 $mail->Subject='Mal-être 5 envoyé avec PHPMailer !'; 
 $mail->Body='Voici un exemple d\'e-mail au format Texte'; 
 if(!$mail->Send()){   //Teste le return code de la fonction 
   echo $mail->ErrorInfo; //Affiche le message d'erreur (ATTENTION:voir section 7) 
 } 
 else{    
   echo 'Mail envoyé avec succès'; 
 } 
// $mail->SmtpClose(); 
 unset($mail); 
 exit; 
//


Merci si tu vois quelqquechose... ce dont je ne doute pas !
RJL2910
0
Quels sont les autres modules à préparer, même s'ils ont chargés automatiquement
Comme indiqué dans mon message #8, je n'ai installé que :
class.phpmailer.php
class.smtp.php
phpmailer.lang-fr.php
J'avais oublié de préciser : et ça marche comme ça...

D'autre part, tiens-tu vraiment à utiliser ssl ? Si la réponse est oui, vérifie auprès de Nuxit mais le port généralement utilisé pour la connexion ssl est 465, pas 25

Ton adresse de serveur smtp est également mauvaise : comme l'indique la première partie de l'URL, http://smtp.utl-sud-goelo.org, il s'agit d'un serveur http, pas smtp.
une liste ici : https://www.commentcamarche.net/faq/893-parametres-de-serveurs-pop-imap-et-smtp-des-principaux-fai#top
Pour Nuxit, d'après leur page d'aide : smtp.nuxit.net pour un client mail ordinaire, mais il est possible que pour les scripts php hébergés chez eux ce soit localhost
0
rjl Messages postés 543 Date d'inscription mardi 16 mars 2004 Statut Membre Dernière intervention 25 mai 2019 49
12 sept. 2012 à 18:41
Bonjour le père et merci de la dernière réponse,

Je suis très heureux que pour toi "ça marche comme ça" car de mon côté, je ne vois pas même ce qu peut foirer pour que ça bloque en ligne 105 de class.smpt.php !
J'ai essayé diverses combinaisons avec ou sans SSL (en adaptant le port SMTP) mais rien n'y fait.
De son côté, NUXIT refuse à juste titre de voir l'aspect programmation mais me précise "il suffit d'utiliser les paramètres mails fournis qui fonctionnent sans souci donc ce sera smtp.votredomaine ou pop.votredomaine".
Dans mes essais, j'ai même forcé en INCLUDE Config.php car c'était le seul endroit où je trouvais le nom du serveur SMPT (où doit-il être déclaré, sinon ?).
Il est certain que si je n'informe pas les bonnes données, ça ne peut fonctionner mais, je pensais que si on informait un module comme Config.php, l'info était récupérée !
Pour autant, que je mette ou non ces phases php, je retombe inévitablement sur Warning: fsockopen() expects parameter 2 to be long, string given in /web/utlsudgoelo/www/index_fichiers/phpmailer/class.smtp.php on line 105
Language string failed to load: connect_host...
Désespérant ?
Bonne soirée et @+ rjl2913
0
Utilisateur anonyme
12 sept. 2012 à 19:00
Quand tu essayes sans authentification, le fais-tu bien en retirant aussi
$mail->SMTPAuth = true; // enable SMTP authentication
As-tu bien indiqué un Host SANS http:// ?
j'ai même forcé en INCLUDE Config.php De quel Config.php parles-tu ? le nom du serveur SMTP est déclaré par le $mail->Host

Quant à ton erreur ligne 105, chez moi la ligne 105 est en commentaire (ma version n'est pas très vieille) mais c'est comme si tu avais donné une chaîne à la place d'un nombre comme numéro de port. Bizarre.

Peux-tu m'envoyer le source en MP (toujours en cachant les mots de passe..) ?
0