15,10 → 15,17 |
*/ |
|
class Mail extends Script { |
|
//TODO: cette classe est en doublon avec du code de l'annuaire |
// une fois passé à la dernière version du framework, il faudrait factoriser ces fonctions |
// dans une lib commune accessible aux scripts et au code standard |
const STATUT_A_TRAITER = 'a_traiter'; |
const STATUT_EN_TRAITEMENT = 'en_traitement'; |
|
// Définit le délai au bout du quel on remet des mails en traitement à traiter |
// au format (avec la syntaxe utilisée avec INTERVAL en SQL) |
// http://dev.mysql.com/doc/refman/5.0/fr/date-and-time-functions.html |
const DELAI_MAX_TRAITEMENT = '10 HOUR'; |
|
private $modele = null; |
|
public function executer() { |
28,14 → 35,18 |
$this->mode_verbeux = $this->getParametre('v'); |
|
switch($cmd) { |
case "Tous": |
$this->traiterMailsEnAttente(); |
case "tous": |
$retour = $this->traiterMailsEnAttente(); |
break; |
// TODO: case supplémentaire pour traiter un mail par son id ? |
// TODO: option "force" pour traiter les mails quelques soient leur statut ? |
default: |
} |
|
if($this->mode_verbeux) { |
print_r($retour); |
} |
} |
|
private function traiterMailsEnAttente() { |
// Gaston Lagaffe |
48,15 → 59,23 |
$mail_a_moderer = $this->decoderDonneeTemporaire($donnees_brutes_mail); |
$id_mail = $donnees_brutes_mail['adt_id']; |
|
$resultat_envoi = $this->envoyerMail($mail_a_moderer['expediteur'], |
$resultat_envoi = true; |
$envois_echoues = $this->envoyerMail($mail_a_moderer['expediteur'], |
$mail_a_moderer['destinataires'], |
$mail_a_moderer['sujet'], |
$mail_a_moderer['message']); |
|
if($resultat_envoi) { |
if(empty($envois_echoues)) { |
$this->supprimerMailTraite($id_mail); |
} else { |
// TODO: supprimer les destinataires qui ont fonctionné, et mettre à jour |
// le mail dans les données temporaire avec les destinataires qui restent |
// pour pouvoir finir de l'envoyer |
$this->avertirModerateurEchecEnvoi($envois_echoues, $mail_a_moderer); |
$resultat_envoi = false; |
} |
// TODO: logger erreur d'envoi ? envoyer mail récapitulatif |
|
// TODO: logger également erreur d'envoi ? |
$retour[$id_mail] = $resultat_envoi; |
} |
} |
63,6 → 82,27 |
return $retour; |
} |
|
private function avertirModerateurEchecEnvoi($envois_echoues, $mail_a_moderer) { |
|
$corps_mail_echoue = "L'envoi d'un mail modéré à échoué pour les destinataires suivants (".count($envois_echoues)." au total) : <br />"; |
$corps_mail_echoue .= implode(", ", $envois_echoues); |
$corps_mail_echoue .= "<br /><br /><br />"; |
$corps_mail_echoue .= "--- <i> Message original ---</i><br />"; |
$corps_mail_echoue .= "Expéditeur : ".$mail_a_moderer['expediteur']."<br />"; |
$corps_mail_echoue .= "Sujet : ".$mail_a_moderer['sujet']."<br />"; |
$corps_mail_echoue .= "Message original : ".$mail_a_moderer['message']."<br />"; |
|
$sujet = "L'envoi d'un mail modéré a échoué pour un ou plusieurs destinataires"; |
|
// TODO: Que faire si l'envoi de mail d'avertissement échoue également ? |
$envoi_avertissement = $this->envoyerMail(Config::get('adresse_mail_annuaire'), |
Config::get('mail_moderateur'), |
$sujet, |
$corps_mail_echoue); |
|
return $envoi_avertissement; |
} |
|
private function obtenirMailsEnAttente() { |
$requete = "SELECT * FROM annu_donnees_temp WHERE statut = '".self::STATUT_A_TRAITER."' "; |
$retour = $this->bdd->recupererTous($requete); |
91,9 → 131,11 |
} |
|
private function remettreATraiterMailsEnRetard() { |
// Les mails a traiter depuis plus de 10 heures sont considérés comme échoués et donc remis à traiter |
// (en cas de plantage du script ou du serveur de mail pendant leur traitement) |
$requete = "UPDATE annu_donnees_temp SET statut = '".self::STATUT_A_TRAITER."', date_debut_traitement = NULL ". |
"WHERE statut = '".self::STATUT_EN_TRAITEMENT."' ". |
"AND date_debut_traitement < (DATE_SUB(now(), INTERVAL 10 HOUR)) "; |
"AND date_debut_traitement < (DATE_SUB(now(), INTERVAL ".self::DELAI_MAX_TRAITEMENT.")) "; |
|
$maj = $this->bdd->requeter($requete); |
return ($maj !== false); |
115,7 → 157,6 |
if (!is_array($destinataires)) { |
$destinataires = array($destinataires); |
} |
$message_html = $this->encoderChainePourEnvoiMail($message_html); |
if ($message_texte == '') { |
$message_texte = $this->filtrerChaine($message_html); |
} |
151,15 → 192,48 |
$message_html.$eol.$eol. |
"--$limite--".$eol.$eol; |
|
$sujetEncode = mb_encode_mimeheader($this->encoderChainePourEnvoiMail($sujet), $encodage, "B", "\n"); |
$sujetEncode = mb_encode_mimeheader($sujet, mb_internal_encoding(), "B", "\n"); |
$resultats_envois_echoues = array(); |
$ok = true; |
foreach ($destinataires as $destinataire) { |
$ok = mail($destinataire, $sujetEncode, $contenu, $entetes); |
if (!$ok) { |
break; |
$resultats_envois_echoues[] = $destinataire; |
} |
} |
return $ok; |
return $resultats_envois_echoues; |
} |
|
/** Transforme automatiquement le message html en message txt. |
* |
* Réalise un strip_tags et avant ça un remplacement des liens sur mesure pour les mettre au format email txt. |
*/ |
private function filtrerChaine($messageHtml) { |
$messageTxt = strip_tags($messageHtml); |
if ($messageHtml != $messageTxt) { |
$html = $this->ajouterHrefDansBalise($messageHtml); |
$messageAvecEntites = strip_tags($html); |
// TODO : en précisant l'encodage de l'appli dans html_entity_decode un double encodage UTF-8 se produit... |
$messageTxt = html_entity_decode($messageAvecEntites, ENT_QUOTES); |
} |
return $messageTxt; |
} |
|
/** |
* Extrait la valeur de l'attribut href des balises HTML de liens (a) et ajoute le lien entre |
* chevrons (<>) dans le contenu de la balise "a". |
*/ |
private function ajouterHrefDansBalise($html) { |
$dom = new DOMDocument; |
$dom->loadHTML($html); |
foreach ($dom->getElementsByTagName('a') as $node) { |
if ($node->hasAttribute( 'href' )) { |
$href = $node->getAttribute('href'); |
$node->nodeValue = $node->nodeValue." < $href >"; |
} |
} |
$html = $dom->saveHtml(); |
return $html; |
} |
} |
?> |