PB CRON et envoi de mail (V1.6) sur plate-forme Windows 2003

PB CRON et envoi de mail (V1.6) sur plate-forme Windows 2003

par Jean-paul Veuillez,
Nombre de réponses : 4
    Bonjour à tous,

J'ai installé Moodle Version 1.6 (2006050506) sur une plate-forme Windows 2003 (car il devait cohabiter avec d'autres applications windows).

L'accès se fait via un serveur IIS avec php intégré, la base de données est Mysql (5.0)
pour plus d'informtions sur la version de php utilisée http://webdfd.ema.fr/php/test.php


La tâche cron a été mise en place avec l'outil
MoodleCron
Released August 2004
pour lancer cron en tant que service.

Le serveur semble fonctionner correctement mais l'envoi de mail via cron ne fonctionne pas... pourtant le résultat de la tâche cron semble indiquer qu'il a fonctionné correctement :
Type de l'événement :    Aucun
Source de l'événement :    MoodleCron
Catégorie de l'événement :    Aucun
ID de l'événement :    0
Date :        10/08/2006
Heure :        08:55:43
Utilisateur :    AUTORITE NT\SYSTEM
Ordinateur :    WEBDFD
Description :
La description pour l'ID d'événement ( 0 ) dans la source (MoodleCron) est introuvable. L'ordinateur local n'a peut-être pas les informations de Registre ou les librairies requises pour afficher les messages émanant d'un ordinateur distant. Vous pourrez peut-être utiliser l'option /AUXSOURCE= pour récupérer cette description. Reportez-vous aux rubriques Aide et support pour plus de détails. Les informations suivantes font partie de l'événement : http://webdfd/moodle/admin/cron.php<pre>
Server Time: Thu, 10 Aug 2006 08:55:43 +0200


Starting activity modules
Processing module function assignment_cron ...done.
Processing module function chat_cron ...done.
Processing module function forum_cron ...done.
Processing module function journal_cron ...done.
Processing module function workshop_cron ...done.
Finished activity modules
Starting blocks
Finished blocks
Updating languages cache
Running clean-up tasks...
checking for create_password
Running backups if required...
    Checking backup status...INACTIVE
Backup tasks finished.
Cron script completed correctly
Execution took 0.383299 seconds
.

J'ai essayé d'indiquer ou de laisser le paramêtrage par défaut en ce qui concerne le serveur smtp sans plus de résultats... j'ai essayé un autre script php pour envoyer des mails

<?PHP
    require "phpmailer/class.phpmailer.php";
    $mail = new PHPmailer();
    $mail->IsSMTP();
    $mail->Host='mail.ema.fr';
    $mail->From='noreply@webdfd.ema.fr';
    $mail->AddAddress('jpveuill@ema.fr');
    $mail->AddReplyTo('jpveuill@ema.fr');   
    $mail->Subject='Exemple trouvé sur DVP';
    $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);
?>
et là cela fonctionnait correctement.

J'avoue ne pas avoir trouvé l'origine de ce disfonctionnement. Quelqun aurait-il déjà rencontré ce type de problème ?

Y a-t-il un moyen de déclancher "mannuellement" l'envoi de mail par les routines de Moodle pour comprendre ce qui ne fonctionne pas ?

Merci pour toute aide que vous pourrez m'apporter : j'ai cherché dans ce forum sans trouver d'explication précise sur ce point.

cordialement

Moyenne des évaluations  -
En réponse à Jean-paul Veuillez

Re: PB CRON et envoi de mail (V1.6) sur plate-forme Windows 2003

par Nicolas Martignoni,
Avatar Développeurs Avatar Développeurs de plugins Avatar Documentation writers Avatar Moodleurs particulièrement utiles Avatar Testeurs Avatar Traducteurs
Quelques questions :
  1. Est-ce que Moodle doit bien envoyer quelque chose, c'est-à-dire, il y a bien un utilisateur abonné à un forum et des messages dans ce forum et l'adresse de cet utilisateur n'est pas désactivée dans son profil ?
  2. Qu'as-tu renseigné dans le champ smtphost des paramètres techniques ?
Je ne crois pas que l'on puisse lancer l'envoi de courriels manuellement, mais on peut lancer le cron manuellement, à partir d'un navigateur, en chargeant l'URL http://<ton-moodle>/admin/cron.php.
En réponse à Nicolas Martignoni

Re: PB CRON et envoi de mail (V1.6) sur plate-forme Windows 2003

par Jean-paul Veuillez,
Bonjour,  et merci beaucoup pour les pistes...

1- oui, j'ai bien créé un forum avec plusieurs utilisateurs abonnés (il est possible de le vérifier sur http://webdfd.ema.fr/moodle/course/view.php?id=2

2- j'avais en effet renseigné le champ smtphost avec le serveur smtp de mon école. j'ai aussi fait l'essai sans remplir le champ pour que moodle se serve du champ smtp de la configuration générale de php mais rien n'a changé.

Dans le petit programme de test que j'avais récupéré en php, j'avais le même type d'envoi avec le même expéditeur et cela fonctionnait, d'où mon questionnement.

Sait-tu (ou quelqun sait-il...) sous quelles conditions cron envoie des messages ou recherche les messages de forum à envoyer ... cela pourra me guider dans l'analyse des causes d'anomalie...

en tous les cas merci encore pour les conseils... je continue de chercher et j'en informerai la communauté dès que j'aurai trouvé une solution

cordialement
En réponse à Nicolas Martignoni

Re: PB CRON et envoi de mail (V1.6) sur plate-forme Windows 2003

par Jean-paul Veuillez,
    Re bonjour,

Après un test plus fin pour connaitre précisément l'origine de la panne,  j'ai vu que certaines taches MoodleCron (celles qui servent à envoyer les messages) ont produit des erreurs dont voici la description :
Type de l'événement :    Erreur
Source de l'événement :    Moodlecron.exe
Catégorie de l'événement :    Aucun
ID de l'événement :    0
Date :        08/08/2006
Heure :        22:31:45
Utilisateur :    N/A
Ordinateur :    WEBDFD
Description :
La description pour l'ID d'événement ( 0 ) dans la source (Moodlecron.exe) est introuvable. L'ordinateur local n'a peut-être pas les informations de Registre ou les librairies requises pour afficher les messages émanant d'un ordinateur distant. Vous pourrez peut-être utiliser l'option /AUXSOURCE= pour récupérer cette description. Reportez-vous aux rubriques Aide et support pour plus de détails. Les informations suivantes font partie de l'événement : Socket Error # 10054
Connection reset by peer..
Par ailleurs, quand je fais en sorte de lancer moodleCron par l'intermédiaire du navigateur, je vois que le serveur web se met en boucle infinie et fini, lui aussi par "planter" : voici ce qu'il indique
Type de l'événement :    Erreur
Source de l'événement :    Application Error
Catégorie de l'événement :    (100)
ID de l'événement :    1000
Date :        08/08/2006
Heure :        22:31:45
Utilisateur :    N/A
Ordinateur :    WEBDFD
Description :
Application défaillante w3wp.exe, version 6.0.3790.1830, module défaillant php5isapi.dll, version 5.1.4.4, adresse de défaillance 0x00002437.

Données :
0000: 41 70 70 6c 69 63 61 74   Applicat
0008: 69 6f 6e 20 46 61 69 6c   ion Fail
0010: 75 72 65 20 20 77 33 77   ure  w3w
0018: 70 2e 65 78 65 20 36 2e   p.exe 6.
0020: 30 2e 33 37 39 30 2e 31   0.3790.1
0028: 38 33 30 20 69 6e 20 70   830 in p
0030: 68 70 35 69 73 61 70 69   hp5isapi
0038: 2e 64 6c 6c 20 35 2e 31   .dll 5.1
0040: 2e 34 2e 34 20 61 74 20   .4.4 at
0048: 6f 66 66 73 65 74 20 30   offset 0
0050: 30 30 30 32 34 33 37      0002437


et enfin quand je tente d'exécuter la tache cron en invite de commande, voici le trésultat :
D:\campus\PHP>php -f "d:\campus\moodle\admin\cron.php"
<pre>
Server Time: Fri, 11 Aug 2006 18:20:21 +0200


Starting activity modules
Processing module function assignment_cron ...done.
Processing module function forum_cron ...<div class="notifysuccess" align="cente
r">Succès</div><br />
Enregistrement de l'article 14
Un détail, c'est bien l'article 14 qui était à envoyer

J'ai pourtant retiré tous les murs de feu et antivirus qui pourraient bloquer les mails sur mon serveur sans plus de succes.

Enfin, pour déterminer l'emplacement précis de la panne je suis allé modifier à la main le fichier lib.php du module Forum et voici le résultat de la tâche cron :
D:\campus\PHP>php -f "d:\campus\moodle\admin\cron.php"
<pre>
Server Time: Fri, 11 Aug 2006 18:33:03 +0200


Starting activity modules
Processing module function forum_cron ...<div class="notifysuccess" align="cente
r">Succès</div><br />
Enregistrement de l'article 151
2
3
4
5
6
7
8 juste avant mail
après ici le script semble partir en boucle infinie...

voici le code modifié dans le fichier  /mod/forum/lib.php:
function forum_cron () {
/// Function to be run periodically according to the moodle cron
/// Finds all posts that have yet to be mailed out, and mails them
/// out to all subscribers

    global $CFG, $USER;
    static $strforums = NULL;

    if ($strforums === NULL) {
        $strforums = get_string('forums', 'forum');
    }

    if (!empty($USER->id)) { // Remember real USER account if necessary
        $realuser = $USER;
    }

    /// Posts older than 2 days will not be mailed.  This is to avoid the problem where
    /// cron has not been running for a long time, and then suddenly people are flooded
    /// with mail from the past few weeks or months

    $timenow   = time();
    $endtime   = $timenow - 0;//$CFG->maxeditingtime;
    $starttime = $endtime - 48 * 3600;   /// Two days earlier

    if ($posts = forum_get_unmailed_posts($starttime, $endtime)) {

        /// Mark them all now as being mailed.  It's unlikely but possible there
        /// might be an error later so that a post is NOT actually mailed out,
        /// but since mail isn't crucial, we can accept this risk.  Doing it now
        /// prevents the risk of duplicated mails, which is a worse problem.

        if (!forum_mark_old_posts_as_mailed($endtime)) {
            mtrace('Errors occurred while trying to mark some posts as being mailed.');
            return false;  // Don't continue trying to mail them, in case we are in a cron loop
        }

        @set_time_limit(0);   /// so that script does not get timed out when posting to many users

        $urlinfo = parse_url($CFG->wwwroot);
        $hostname = $urlinfo['host'];

        foreach ($posts as $post) {

            mtrace(get_string('processingpost', 'forum', $post->id), '');

            if (! $userfrom = get_record('user', 'id', $post->userid)) {
                mtrace('Could not find user '.$post->userid);
                continue;
            }

mtrace('1');

            if (! $discussion = get_record("forum_discussions", "id", "$post->discussion")) {
                mtrace("Could not find discussion $post->discussion");
                continue;
            }
mtrace('2');

            if (! $forum = get_record("forum", "id", "$discussion->forum")) {
                mtrace("Could not find forum $discussion->forum");
                continue;
            }
mtrace('3');

            if (! $course = get_record("course", "id", "$forum->course")) {
                mtrace("Could not find course $forum->course");
                continue;
            }
mtrace('4');

            $cleanforumname = str_replace('"', "'", strip_tags($forum->name));
            $userfrom->customheaders = array (  // Headers to make emails easier to track
                       'Precedence: Bulk',
                       'List-Id: "'.$cleanforumname.'" <moodleforum'.$forum->id.'@'.$hostname.'>',
                       'List-Help: '.$CFG->wwwroot.'/mod/forum/view.php?f='.$forum->id,
                       'Message-Id: <moodlepost'.$post->id.'@'.$hostname.'>',
                       'In-Reply-To: <moodlepost'.$post->parent.'@'.$hostname.'>',
                       'References: <moodlepost'.$post->parent.'@'.$hostname.'>',
                       'X-Course-Id: '.$course->id,
                       'X-Course-Name: '.strip_tags($course->fullname)
            );

mtrace('5');

            if (!empty($course->lang)) {
                $CFG->courselang = $course->lang;
            } else {
                unset($CFG->courselang);
            }

mtrace('6');
            $groupmode = false;
            if ($cm = get_coursemodule_from_instance("forum", $forum->id, $course->id)) {
                if ($groupmode = groupmode($course, $cm) and $discussion->groupid > 0) {   // Groups are being used
                    if (!$group = get_record("groups", "id", $discussion->groupid)) {   // Can't find group
                        continue;                                            // Be safe and don't send it to anyone
                    }
                }
            } else {
                $cm->id = 0;
            }

mtrace('7');
            if ($users = forum_subscribed_users($course, $forum)) {

                $mailcount=0;
                $errorcount=0;
                foreach ($users as $userto) {
                    if ($groupmode) {    // Look for a reason not to send this email
                        if (!isteacheredit($course->id, $userto->id)) {
                            if (!empty($group->id)) {
                                if (!ismember($group->id, $userto->id)) {
                                    continue;
                                }
                            }
                        }
                    }
                   
                    // make sure we're allowed to see it...
                    if (!forum_user_can_see_post($forum,$discussion,$post,$userto)) {
                        continue;
                    }

                    if ($userto->maildigest > 0) {
                        // This user wants the mails to be in digest form
                        $queue = New stdClass;
                        $queue->userid = $userto->id;
                        $queue->discussionid = $discussion->id;
                        $queue->postid = $post->id;
                        if(!insert_record('forum_queue', $queue)) {
                            mtrace("Error: mod/forum/cron.php: Could not queue for digest mail for id $post->id to user $userto->id ($userto->email) .. not trying again.");
                        }
                        continue;
                    }

                    /// Override the language and timezone of the "current" user, so that
                    /// mail is customised for the receiver.
                    $USER->lang     = $userto->lang;
                    $USER->timezone = $userto->timezone;

                    $postsubject = "$course->shortname: ".format_string($post->subject,true);
                    $posttext = forum_make_mail_text($course, $forum, $discussion, $post, $userfrom, $userto);
                    $posthtml = forum_make_mail_html($course, $forum, $discussion, $post, $userfrom, $userto);
mtrace('8 juste avant mail');

                    if (!$mailresult = email_to_user($userto, $userfrom, $postsubject, $posttext,
                                                     $posthtml, '', '', $CFG->forum_replytouser)) {// lieu problable de la panne
                        mtrace("Error: mod/forum/cron.php: Could not send out mail for id $post->id to user $userto->id".
                             " ($userto->email) .. not trying again.");
                        add_to_log($course->id, 'forum', 'mail error', "discuss.php?d=$discussion->id#$post->id",
                                   substr(format_string($post->subject,true),0,30), $cm->id, $userto->id);
                        $errorcount++;
                    } else if ($mailresult === 'emailstop') {
                        add_to_log($course->id, 'forum', 'mail blocked', "discuss.php?d=$discussion->id#$post->id",
                                   substr(format_string($post->subject,true),0,30), $cm->id, $userto->id);
                    } else {
                        $mailcount++;

                    /// Mark post as read if forum_usermarksread is set off
                        if (!$CFG->forum_usermarksread && forum_tp_can_track_forums($forum, $userto) &&
                            forum_tp_is_tracked($forum, $userto->id)) {
                            if (!forum_tp_mark_post_read($userto->id, $post, $forum->id)) {
                                mtrace("Error: mod/forum/cron.php: Could not mark post $post->id read for user $userto->id".
                                     " while sending email.");
                            }
                        }
                    }
mtrace('9 apres mail');

                }

                mtrace(".... mailed to $mailcount users.");


J'avoue que là je suis à la limite de mes compétances.

A titre d'information technique je suis (malheureusement) sur un serveur Windows 2003 avec IIS comme serveur Web et PHP5 insallé (ps la tache cron plante qu'elle soit lancée par IIS ou en local via l'invite de commande.

Apparement, le programme entre dans une boucle infinie...

Si quelqun a une  idée je suis preneur. Au passage, y a-t-il des installations de Moodle sur PC windows 2000 ou 2003 avec la tâche cron qui fonctionne quelque part en france ?

cordialement
En réponse à Jean-paul Veuillez

Re: PB CRON et envoi de mail (V1.6) sur plate-forme Windows 2003

par Jean-paul Veuillez,
Bonsoir à tous,

Finalement, l'erreur difficile à trouver venait de la version 1.73 de PHPMAILER distribuée avec moodle 1.6. Elle semble incompatible avec la version 5.1.4 de PHP.

Pour corriger le problème, j'ai remplacé le dossier /lib/phpmailer de moodle par celui fourni avec la version 1.71 et le problème a été résolu

Je l'indique dans le forum pour les personnes qui rencontreraient (ou rencontreront) le même souci que moi

cordialement
Moyenne des évaluations Utile (1)