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

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

Marsh Posté le 30-07-2014 à 21:32:06    

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
Reply

Marsh Posté le 30-07-2014 à 21:32:06   

Reply

Marsh Posté le 31-07-2014 à 09:28:30    

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 :-/

Reply

Marsh Posté le 31-07-2014 à 10:19:22    

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
Reply

Marsh Posté le 31-07-2014 à 12:42:29    

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.

Reply

Marsh Posté le 31-07-2014 à 13:44:34    

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
Reply

Marsh Posté le 31-07-2014 à 15:47:32    

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

Reply

Marsh Posté le 31-07-2014 à 16:20:01    

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
Reply

Marsh Posté le 31-07-2014 à 21:07:37    

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é.

Reply

Marsh Posté le 01-08-2014 à 10:04:01    

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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed