IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

"Unknow error" retourné par la fonction mail()


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Développeur Web
    Inscrit en
    Avril 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2006
    Messages : 12
    Points : 13
    Points
    13
    Par défaut "Unknow error" retourné par la fonction mail()
    Bonjour à vous,

    Je rencontre un problème avec un script d'envoi d'e-mails. Ce script récupère une liste d'adresses e-mail, et génère un courrier à destination de ces adresses, en concaténant celles-ci dans le champ Bcc (maximum 50 adresses en Bcc par e-mail, envoi en plusieurs e-mails si ça dépasse 50 adresses).
    Pour information, cette "alerte e-mail" est déclenchée à la publication d'un document sur le site, en direction des personnes intéressées.

    Le script fonctionne bien la plupart du temps. Cependant, par moments, en fonction des envois, une étrange erreur m'est retournée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Warning: mail(): Unknow error with '/usr/bin/sendmail -t -i in <path>/email.php on line 54.
    Ce qui m'étonne au premier abord, c'est la faute à "Unknow" au lieu de "Unknown"... Déjà
    Ensuite, je ne trouve pas de trace de cette erreur via Google. J'ai vu un post de quelqu'un ayant rencontré ça auparavant, mais c'était dû à un upgrade de PHP, et le php.ini était alors dans un mauvais répertoire... Ce qui n'est pas le cas ici

    Voici un screenshot :



    Quelques infos serveur :
    C'est un serveur dédié virtuel, et je n'ai pas accès au php.ini (Cependant, je peux demander à l'hébergeur d'intervenir dessus).
    La version de PHP est la 4.3 (oui, je sais... ), et tourne en SAFE_MODE=ON.

    Je vous mets quelques snippets du code qui a été écrit, même si je précise à nouveau que c'est fonctionnel par moments, et non fonctionnel par d'autres.

    Ma question est surtout par rapport à votre expérience : avez-vous déjà rencontré cette erreur ?...
    Et quelles seraient selon vous les pistes à explorer pour la résoudre ? (php.ini, RAM serveur, erreur de code, volume d'e-mails à envoyer peut-être trop grand, etc ?...).

    En annexe, au cas où, voici le code qui envoie les e-mails. (Je sais que le code n'est pas propre ou optimisé, mais là n'est pas la question )
    (info : $email_dest contient une liste séparée par des virgules, des adresses destinataires)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    // Nombre de mails par paquet
    $paquet = 50;
    // nombre de mails au total
    $tabTempMail = explode(',',$email_dest);
    for ($imail = 0; $imail < sizeof($tabTempMail); $imail++)
    {
        // parcours du tableau des mails destinataires pour virer ce qui serait vide ou incorrect
        if ( (strpos( $tabTempMail[$imail], '@') === 0 ) )
        {
            // Dans cet index de tableau, valeur incorrect = on vire
    	unset ($tabTempMail[$imail]);
        }
    }
     
    $nbMailsTotal = sizeof($tabTempMail);
     
    // envoi mails
    $compteur = 0;
     
    while (isset($tabTempMail[$compteur]))
    {
        $email_destinataires = '';
        for ($m=0;$m<$paquet;$m++)
        {
            if( isset($tabTempMail[$compteur]) )
            {
                // envoi des emails au paquet de 50
                $email_destinataires .= $tabTempMail[$compteur].',';
                $compteur++;
            }
        }			
     
     
        $email_destinataires = substr($email_destinataires,0,( strlen($email_destinataires) - 1 )); // enleve la derniere virgule
        $tmpEnvoi = envoi_email('../lib/email.html', $email_destinataires, $email_sujet, $contenu);		
    }
    Puis voici la procédure d'envoi d'e-mail (email.php) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    function envoi_email($emailFichier, $emailDestinataires, $emailSujet, $emailMessage)
    {
    	// Ouverture du fichier de l'email
    	if ((file_exists($emailFichier)) && (strlen($emailMessage) > 0))
    	{
    		$fichier = fopen($emailFichier, 'r');
    		if ($fichier)
    		{
    			$emailHtml = fread($fichier, filesize ($emailFichier));
    			fclose($fichier);
     
    			// Spécifie l'adresse de la personne qui envoie l'email
    			// Il faut que cette adresse soit valide et du même domaine que le serveur
    			// qui envoie pour que ça ne soit pas considéré comme du spam
    			$emailSource = 'Chambre d\'Agriculture de l\'Oise <contact@agriculture-de-groupe60.fr>';
    			$emailReply = 'Chambre d\'Agriculture de l\'Oise <contact@agriculture-de-groupe60.fr>';
     
    			// On fait une version HTML
    			// On place le contenu
    			$emailHtml = preg_replace('#!message!#', $emailMessage, $emailHtml);
    			$emailHtml = preg_replace('#!sujet!#', $emailSujet, $emailHtml);
     
    			// Entêtes des emails
    			$emailHeader = 'From: '.$emailSource."\r\n";
    			$emailHeader .= 'Reply-To: '.$emailReply."\r\n";
    			$emailHeader .= 'Bcc: '.$emailDestinataires."\r\n";
    			$emailHeader .= 'MIME-Version: 1.0'."\r\n";
    			$emailHeader .= 'Content-Type: text/html; charset=iso-8859-1';
    			$emailSujet = '=?iso-8859-1?q?'.str_replace('%', '=', rawurlencode($emailSujet)).'?=';
    			$emailCorps = $emailHtml;
     
    			// On vérifie que le sujet est OK
    			$emailSujet = html_entity_decode($emailSujet, ENT_QUOTES);
     
    			// On envoie l'email
    			$tmp = mail('', $emailSujet, $emailCorps, $emailHeader);
    		}
    		else
    		{
    			$tmp = false;
    		}
    	}
    	else
    	{
    		$tmp = false;
    	}
    	return $tmp;
    }
    Merci à vous si vous avez des pistes

    Clément

  2. #2
    Membre chevronné Avatar de nosferapti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 157
    Points : 1 895
    Points
    1 895
    Par défaut
    la 1er argument de la fonction "mail" c'est le destinataire donc si tu commences par "mail('', " l'e-mail sera envoyé nul part, c'est la 1re chose à corriger dans ton code

  3. #3
    Membre à l'essai
    Profil pro
    Développeur Web
    Inscrit en
    Avril 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2006
    Messages : 12
    Points : 13
    Points
    13
    Par défaut
    Effectivement, mais étonnamment ça marche quand même
    J'ai cependant corrigé cela, mais l'erreur rencontrée est toujours présente de temps en temps.

    Je me suis demandé, en trouvant (finalement !) quelqu'un ayant eu la même expérience sur un autre forum, si cela ne venait pas d'une (ou plusieurs) adresses e-mail incorrectes (bonne syntaxe, mais inexistantes). Est-ce que sendmail vérifie que l'adresse (ou les adresses) destinataire est bien existante ?... En imaginant que sur un envoi à 50 adresses, si une n'existe pas, ça génère une erreur et stoppe l'exécution ?...


  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 73
    Points : 60
    Points
    60
    Par défaut
    Bonjour, j'aurai aimé savoir comment tu envoyais ce mail, car j'aimerai utiliser cette fonction également pour envoyer des mails, mais automatiquement, genre tous les jours à 12h. Est ce que tu as une piste ?

    edit : utiliser des cronjobs, ce sont des scripts qui vont être lancer par le serveur suivant sa configuration (heures, jours, mois).

  5. #5
    Membre à l'essai
    Profil pro
    Développeur Web
    Inscrit en
    Avril 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2006
    Messages : 12
    Points : 13
    Points
    13
    Par défaut
    Tout d'abord, il semble que pour la résolution de mon problème, le serveur ne permet pas d'envoyer des email à des adresse @aol.com si on les place dans le champ Bcc : il faut obligatoirement les intégrer dans le champ To: pour éviter une erreur.
    Si ça résous mon problème, je passerai en résolu.

    Ensuite :

    Bonjour, j'aurai aimé savoir comment tu envoyais ce mail, car j'aimerai utiliser cette fonction également pour envoyer des mails, mais automatiquement, genre tous les jours à 12h. Est ce que tu as une piste ?
    Ça dépend de ton serveur d'hébergement... Si tu as un dédié UNIX, ou même un dédié virtuel, tu dois avoir accès à la crontab. Il ne te reste plus qu'à écrire la bonne ligne dans le fichier crontab, pour indiquer l'heure, le jour, la fréquence, et le fichier PHP à exécuter. Tu trouveras des tutos simples un peu partout.

    J'ai vu aussi que ça se faisait chez OVH en mutualisé : il suffit dans ce cas, dans l'interface de gestion, de cocher la périodicité (et l'heure) pour l'exécution du script PHP, et indiquer le script en question à exécuter.

Discussions similaires

  1. Réponses: 2
    Dernier message: 24/12/2007, 10h53
  2. Réponses: 4
    Dernier message: 07/04/2007, 21h02
  3. valeur retournée par une fonction
    Par Biosox dans le forum C
    Réponses: 13
    Dernier message: 20/01/2007, 00h17
  4. Réponses: 11
    Dernier message: 31/10/2005, 18h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo