Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1104 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  Envoi de mails avec SMTP problème avec caractères spéciaux

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Envoi de mails avec SMTP problème avec caractères spéciaux

n°2234545
Damien060
Posté le 30-07-2014 à 21:32:06  profilanswer
 

Bonsoir,
 
Voilà depuis plusieurs jours je bloque sur un de mes scripts qui me permet d'envoyer des mails en smtp depuis mon site.
J'ai repris le script dans tous les sens, mais je pense avoir trouvé le problème.
 
Dès que je tente d'envoyer un mail avec des caractères spéciaux (û, à, ç etc.) le script ne m'envoi rien...
 
Je sais que le même message (corps du mail) sans ces caractères, passe...
 
Voici le script qui gère l'envoi :
 

Code :
  1. class Mail{
  2.     private $smtpServer = 'xxxx'; //     YOURSMTPHOST    Enter the smtp server
  3.     private $port = '26';
  4.     private $timeout = '45';
  5.     private $uname = 'xxxx@xxxx.xxxx';             // YourSiteName  enter uname
  6.     private $username = 'xxxx@xxxx.xxxx';             //  YourEmail enter username (smtp server)
  7.     private $password = 'xxxx';             // YourPassword enter password (smtp server)
  8.     private $newline = "\r\n";
  9.     private $localdomain = 'xxxx';          //enter localdomain.
  10.     private $charset = 'utf-8';  //charser code
  11.     private $contentTransferEncoding = false;
  12.     // Do not change anything below
  13.     private $smtpConnect = false;
  14.     private $to = false;
  15.     private $subject = false;
  16.     private $message = false;
  17.     private $format = 1;
  18.     private $headers = false;
  19.     private $logArray = array(); // Array response message for debug
  20.     private $Error = '';
  21. //ajour de $webmasteremail, $nom_autorep
  22.     public function __construct($to, $subject, $message, $format, $webmasteremail, $nom_autorep, $idmembre) {
  23.         $this->to = &$to;
  24.         $this->subject = &$subject;
  25.         $this->message = &$message;
  26.         echo "message : ".$this->message;
  27.         $this->format = &$format;
  28. $this->webmasteremail = &$webmasteremail;
  29. $this->nom_autorep = &$nom_autorep;
  30. $this->idmembre = &$idmembre;
  31. $this->newmailmembre = $this->idmembre.'@xxxx';
  32.         // Connect to server
  33.         if(!$this->Connect2Server()) {
  34.          // Display error message
  35.             echo $this->Error.$this->newline.' '.$this->newline;
  36.             print_r($this->logArray);
  37.             echo $this->newline.' '.$this->newline;
  38.             return false;
  39.         }
  40.         return true;
  41.     }
  42.     private function Connect2Server() {
  43.         // Connect to server
  44.         $this->smtpConnect = fsockopen($this->smtpServer,$this->port,$errno,$error,$this->timeout);
  45.         $this->logArray['CONNECT_RESPONSE'] = $this->readResponse();
  46.         if (!is_resource($this->smtpConnect)) {
  47.             return false;
  48.         }
  49.         $this->logArray['connection'] = "Connection accepted: $smtpResponse";
  50.         // Hi, server!
  51.         $this->sendCommand("EHLO $this->localdomain" );
  52.         $this->logArray['EHLO'] = $this->readResponse();
  53.         // Let's know each other
  54.         $this->sendCommand('AUTH LOGIN');
  55.         $this->logArray['AUTH_REQUEST'] = $this->readResponse();
  56.         // My name...
  57.         $this->sendCommand(base64_encode($this->username));
  58.         $this->logArray['REQUEST_USER'] = $this->readResponse();
  59.         // My password..
  60.         $this->sendCommand(base64_encode($this->password));
  61.         $this->logArray['REQUEST_PASSWD'] = $this->readResponse();
  62.         // If error in response auth...
  63.         if (substr($this->logArray['REQUEST_PASSWD'],0,3)!='235') {
  64.             $this->Error .= 'Authorization error! '.$this->logArray['REQUEST_PASSWD'].$this->newline;
  65.             return false;
  66.         }
  67.         // "From" mail...
  68.         $this->sendCommand("MAIL FROM: $this->username" );
  69.         $this->logArray['MAIL_FROM_RESPONSE'] = $this->readResponse();
  70.         if (substr($this->logArray['MAIL_FROM_RESPONSE'],0,3)!='250') {
  71.             $this->Error .= 'Mistake in sender\'s address! '.$this->logArray['MAIL_FROM_RESPONSE'].$this->newline;
  72.             return false;
  73.         }
  74.         // "To" address
  75.         $this->sendCommand("RCPT TO: $this->to" );
  76.         $this->logArray['RCPT_TO_RESPONCE'] = $this->readResponse();
  77.         if (substr($this->logArray['RCPT_TO_RESPONCE'],0,3)!='250') {
  78.             $this->Error .= 'Mistake in reciepent address! '.$this->logArray['RCPT_TO_RESPONCE'].$this->newline;
  79.         }
  80.         // Send data to server
  81.         $this->sendCommand('DATA');
  82.         $this->logArray['DATA_RESPONSE'] = $this->readResponse();
  83.         // Send mail message
  84.         if (!$this->sendMail()) return false;
  85.         // Good bye server! =)
  86.         $this->sendCommand('QUIT');
  87.         $this->logArray['QUIT_RESPONSE'] = $this->readResponse();
  88.         // Close smtp connect
  89.         fclose($this->smtpConnect);
  90.         return true;
  91.     }
  92.     // Function send mail
  93.     private function sendMail() {
  94.         $this->sendHeaders();
  95.         $this->sendCommand($this->message);
  96.         $this->sendCommand('.');
  97.         $this->logArray['SEND_DATA_RESPONSE'] = $this->readResponse();
  98.         if(substr($this->logArray['SEND_DATA_RESPONSE'],0,3)!='250') {
  99.             $this->Error .= 'Mistake in sending data! '.$this->logArray['SEND_DATA_RESPONSE'].$this->newline;
  100.             return false;
  101.         }
  102.         return true;
  103.     }
  104.     // Function read response
  105.     private function readResponse() {
  106.         $data="";
  107.         while($str = fgets($this->smtpConnect,4096))
  108.         {
  109.             $data .= $str;
  110.             if(substr($str,3,1) == " " ) { break; }
  111.         }
  112.         return $data;
  113.     }
  114.     // function send command to server
  115.     private function sendCommand($string) {
  116.         fputs($this->smtpConnect,$string.$this->newline);
  117.         return ;
  118.     }
  119.     // function send headers
  120.     private function sendHeaders() {
  121.         $this->sendCommand("Date: ".date("D, j M Y H:i:s" )." +0700" );
  122.  //changement $this->sendCommand("From: $this->uname <$this->username>" ); en $this->sendCommand("From: $this->nom_autorep <$this->webmasteremail>" );
  123.         $this->sendCommand("From: $this->nom_autorep <$this->webmasteremail>" );
  124.  //changement $this->sendCommand("Reply-To: <$this->username>" ); en $this->sendCommand("Reply-To: <$this->webmasteremail>" );
  125.         $this->sendCommand("Reply-To: <$this->webmasteremail>" );
  126.  //ajout $this->sendCommand("Sender: <$this->newmailmembre" );
  127.  $this->sendCommand("Sender: <$this->newmailmembre>" );
  128.         $this->sendCommand("To: <$this->to>" );
  129.         $this->sendCommand("Subject: $this->subject" );
  130.         $this->sendCommand("MIME-Version: 1.0" );
  131. if(($this->format)==1)
  132.         $this->sendCommand("Content-Type: text/plain; charset=$this->charset" );
  133. else
  134.         $this->sendCommand("Content-Type: text/html; charset=$this->charset" );
  135.         if ($this->contentTransferEncoding) $this->sendCommand("Content-Transfer-Encoding: $this->contentTransferEncoding" );
  136.         $this->sendCommand($this->newline);
  137. //  print_r($this->to);  
  138.         return ;
  139.     }
  140.     public function __destruct() {
  141.         if (is_resource($this->smtpConnect)) fclose($this->smtpConnect);
  142.     }
  143. }


 
Voilà, c'est pas du code propre de chez propre, mais ça à le mérite de marcher (presque)...
Avez-vous une idée de là où je pourrais corrigé la machine pour que ça fonctionne parfaitement ?
 
Merci par avance pour votre aide.
 
 
EDIT :  
Re... après quelques tests c'est surtout le "^" qui semble ne pas passer (j'ai fais le test avec août).
Le ç et le à passe sans problème...
 
Merci pour votre aide.


Message édité par Damien060 le 30-07-2014 à 22:10:09
mood
Publicité
Posté le 30-07-2014 à 21:32:06  profilanswer
 

n°2234563
xjames56x
Posté le 31-07-2014 à 09:28:30  profilanswer
 

Je suis pas bon en JavaScript mais j'avais eu le même problème en PHP...  
Voilà ce que j'avais rajouté (mais c'est du php :-/)
[PHP]
mail($mail,utf8_decode($sujet), utf8_decode($message),$header);
[/PHP]
peut être existe-il quelque chose de semblable à utf-8 décode en JS ?
voilà, je suis désolé de pas avoir mieux :-/

n°2234568
rufo
Pas me confondre avec Lycos!
Posté le 31-07-2014 à 10:19:22  profilanswer
 

euh xjames56x, son code, c'est du php :/
 
Damien060, pourquoi tu t'embête à faire tout ça pour envoyer un pauvre mail :??: Pourquoi n'utilises-tu pas juste la fonction mail() de php ?
 
Parce que là, dans la série "je m'emmerde bien à recoder tout le protocole SMTP", tu fais fort :pt1cable:


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2234605
Damien060
Posté le 31-07-2014 à 12:42:29  profilanswer
 

Bonjour et merci pour vos conseils.
Rufo, c'est un système de gestion de mailling list de plusieurs centaines de contacts. Afin de sécuriser l'envoi je dois passer par du smtp.

n°2234606
rufo
Pas me confondre avec Lycos!
Posté le 31-07-2014 à 13:44:34  profilanswer
 

SMTP, c'est le protocole d'envoi de mail. Quand tu utilises la fonction mail() de php, tu passes par du smtp via un outil d'envoi de mails (souvent, sendmail) qui est paramétré dans le php.ini.
Tout hébergeur digne de ce nom fournit un service smtp à la fonction mail() de php (ou une fonction similaire si l'hébergeur limite l'utilisation de mail()) : ovh, 1&1, free...
 
Qu'entends-tu par "sécuriser l'envoi" :??:


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2234628
Damien060
Posté le 31-07-2014 à 15:47:32  profilanswer
 

SMTP permet de faire des réglages de dkim, spf  spécifique...  
De meme on peut gérer plus finement l'expéditeur etc.

n°2234643
rufo
Pas me confondre avec Lycos!
Posté le 31-07-2014 à 16:20:01  profilanswer
 

Les paramètres 4 et 5 de la fonction mail() devraient te permette de faire ce que tu veux, non ? Pour l'expéditeur, en tout cas, tu peux parfaitement former un hearder (via le paramètre n°4) avec un From dans lequel tu peux l'adresse mail d'expédition que tu veux :/ je le fais dans mon appli Astres (cf ma signature)... C'est via le paramètre n°4 que tu peux aussi gérer le CC et le BCC.
 
Edit : pour le DKIM, je serais étonné que le paramètre n°5 ne puise pas te servir... Mais ça, j'ai jamais mis en application, donc je peux pas être aussi affirmatif que pour la construction de la valeur de l'expéditeur.
 
Edit 2 : SPF c'est pour quoi ? short path first (= Algorithme de Dijkstra) ?


Message édité par rufo le 31-07-2014 à 16:22:33

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2234665
Damien060
Posté le 31-07-2014 à 21:07:37  profilanswer
 

Ce sont des paramètres sur le serveur de mail qui permettent de certifier qu'ils sont officiels et pas de spam.
En tout cas il est recommandé d'utiliser SMTP sur tous les serveurs où je suis allé.

n°2234696
rufo
Pas me confondre avec Lycos!
Posté le 01-08-2014 à 10:04:01  profilanswer
 

Damien060 a écrit :

Ce sont des paramètres sur le serveur de mail qui permettent de certifier qu'ils sont officiels et pas de spam.
En tout cas il est recommandé d'utiliser SMTP sur tous les serveurs où je suis allé.


Ben évidemment, SMTP c'est le protocole d'envoi de mails. Tu ne peux pas faire sans. Et comme je te l'expliquais, la fonction mail() de php utilise un logiciel SMTP (sendmail, par ex). Les paramètres 4 et 5 de cette fonction servent à construire le header du mail et à passer des paramètres au logiciel d'envoi de mail SMTP.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  Envoi de mails avec SMTP problème avec caractères spéciaux

 

Sujets relatifs
Excel: Problème pour étendre une sélectionProblème d'utilisation d'une librairie JS..
Petit problème d'alignementJAVASCRIPT > problème de vérification mail (formulaire)
problème installation compilateur FLEX sur AIX 7.1Problème avec VBA, projet finance
problème genérique en code VHDLProbleme de InfoWindow sur des Marker Google Maps
Problème bios FreeDOSproblème impression
Plus de sujets relatifs à : Envoi de mails avec SMTP problème avec caractères spéciaux


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR