Browse Source

Dans ton trunk

v1
cedric@yterium.com 11 years ago
commit
ce7bc3364e
  1. 84
      .gitattributes
  2. 86
      base/facteur.php
  3. 491
      classes/facteur.php
  4. 63
      emails/css.html
  5. 22
      emails/inc-bas.html
  6. 31
      emails/inc-haut.html
  7. 28
      emails/test_email_html.html
  8. 12
      emails/test_email_texte.html
  9. 49
      exec/facteur.php
  10. 63
      facteur_fonctions.php
  11. 12
      facteur_ieconfig_metas.php
  12. 207
      formulaires/configurer_facteur.html
  13. 173
      formulaires/configurer_facteur.php
  14. 176
      inc/envoyer_mail.php
  15. 27
      inc/facteur_autorisations.php
  16. 17
      inc/facteur_classes.php
  17. 71
      lang/facteur_de.php
  18. 58
      lang/facteur_en.php
  19. 74
      lang/facteur_fr.php
  20. 504
      phpmailer-php4/LICENSE
  21. 102
      phpmailer-php4/README
  22. 1909
      phpmailer-php4/class.phpmailer.php
  23. 436
      phpmailer-php4/class.pop3.php
  24. 1062
      phpmailer-php4/class.smtp.php
  25. 26
      phpmailer-php4/language/phpmailer.lang-ar.php
  26. 23
      phpmailer-php4/language/phpmailer.lang-br.php
  27. 24
      phpmailer-php4/language/phpmailer.lang-ca.php
  28. 24
      phpmailer-php4/language/phpmailer.lang-ch.php
  29. 23
      phpmailer-php4/language/phpmailer.lang-cz.php
  30. 24
      phpmailer-php4/language/phpmailer.lang-de.php
  31. 23
      phpmailer-php4/language/phpmailer.lang-dk.php
  32. 23
      phpmailer-php4/language/phpmailer.lang-en.php
  33. 23
      phpmailer-php4/language/phpmailer.lang-es.php
  34. 24
      phpmailer-php4/language/phpmailer.lang-et.php
  35. 24
      phpmailer-php4/language/phpmailer.lang-fi.php
  36. 25
      phpmailer-php4/language/phpmailer.lang-fo.php
  37. 23
      phpmailer-php4/language/phpmailer.lang-fr.php
  38. 23
      phpmailer-php4/language/phpmailer.lang-hu.php
  39. 26
      phpmailer-php4/language/phpmailer.lang-it.php
  40. 24
      phpmailer-php4/language/phpmailer.lang-ja.php
  41. 23
      phpmailer-php4/language/phpmailer.lang-nl.php
  42. 23
      phpmailer-php4/language/phpmailer.lang-no.php
  43. 23
      phpmailer-php4/language/phpmailer.lang-pl.php
  44. 24
      phpmailer-php4/language/phpmailer.lang-ro.php
  45. 23
      phpmailer-php4/language/phpmailer.lang-ru.php
  46. 23
      phpmailer-php4/language/phpmailer.lang-se.php
  47. 24
      phpmailer-php4/language/phpmailer.lang-tr.php
  48. 23
      phpmailer-php4/language/phpmailer.lang-zh.php
  49. 24
      phpmailer-php4/language/phpmailer.lang-zh_cn.php
  50. 504
      phpmailer-php5/LICENSE
  51. 178
      phpmailer-php5/README
  52. 2320
      phpmailer-php5/class.phpmailer.php
  53. 407
      phpmailer-php5/class.pop3.php
  54. 814
      phpmailer-php5/class.smtp.php
  55. 27
      phpmailer-php5/language/phpmailer.lang-ar.php
  56. 26
      phpmailer-php5/language/phpmailer.lang-br.php
  57. 26
      phpmailer-php5/language/phpmailer.lang-ca.php
  58. 26
      phpmailer-php5/language/phpmailer.lang-ch.php
  59. 25
      phpmailer-php5/language/phpmailer.lang-cz.php
  60. 25
      phpmailer-php5/language/phpmailer.lang-de.php
  61. 26
      phpmailer-php5/language/phpmailer.lang-dk.php
  62. 25
      phpmailer-php5/language/phpmailer.lang-en.php
  63. 26
      phpmailer-php5/language/phpmailer.lang-es.php
  64. 26
      phpmailer-php5/language/phpmailer.lang-et.php
  65. 27
      phpmailer-php5/language/phpmailer.lang-fi.php
  66. 27
      phpmailer-php5/language/phpmailer.lang-fo.php
  67. 25
      phpmailer-php5/language/phpmailer.lang-fr.php
  68. 25
      phpmailer-php5/language/phpmailer.lang-hu.php
  69. 27
      phpmailer-php5/language/phpmailer.lang-it.php
  70. 26
      phpmailer-php5/language/phpmailer.lang-ja.php
  71. 25
      phpmailer-php5/language/phpmailer.lang-nl.php
  72. 25
      phpmailer-php5/language/phpmailer.lang-no.php
  73. 25
      phpmailer-php5/language/phpmailer.lang-pl.php
  74. 27
      phpmailer-php5/language/phpmailer.lang-ro.php
  75. 25
      phpmailer-php5/language/phpmailer.lang-ru.php
  76. 26
      phpmailer-php5/language/phpmailer.lang-se.php
  77. 27
      phpmailer-php5/language/phpmailer.lang-tr.php
  78. 26
      phpmailer-php5/language/phpmailer.lang-zh.php
  79. 26
      phpmailer-php5/language/phpmailer.lang-zh_cn.php
  80. 48
      plugin.xml
  81. 10
      prive/configurer_facteur.html
  82. BIN
      prive/images/facteur-24.png
  83. BIN
      prive/images/facteur-48.png
  84. BIN
      prive/themes/spip/images/facteur-16.png

84
.gitattributes vendored

@ -0,0 +1,84 @@
* text=auto !eol
base/facteur.php -text
classes/facteur.php -text
emails/css.html -text
emails/inc-bas.html -text
emails/inc-haut.html -text
emails/test_email_html.html -text
emails/test_email_texte.html -text
exec/facteur.php -text
/facteur_fonctions.php -text
/facteur_ieconfig_metas.php -text
formulaires/configurer_facteur.html -text
formulaires/configurer_facteur.php -text
inc/envoyer_mail.php -text
inc/facteur_autorisations.php -text
inc/facteur_classes.php -text
lang/facteur_de.php -text
lang/facteur_en.php -text
lang/facteur_fr.php -text
phpmailer-php4/LICENSE -text
phpmailer-php4/README -text
phpmailer-php4/class.phpmailer.php -text
phpmailer-php4/class.pop3.php -text
phpmailer-php4/class.smtp.php -text
phpmailer-php4/language/phpmailer.lang-ar.php -text
phpmailer-php4/language/phpmailer.lang-br.php -text
phpmailer-php4/language/phpmailer.lang-ca.php -text
phpmailer-php4/language/phpmailer.lang-ch.php -text
phpmailer-php4/language/phpmailer.lang-cz.php -text
phpmailer-php4/language/phpmailer.lang-de.php -text
phpmailer-php4/language/phpmailer.lang-dk.php -text
phpmailer-php4/language/phpmailer.lang-en.php -text
phpmailer-php4/language/phpmailer.lang-es.php -text
phpmailer-php4/language/phpmailer.lang-et.php -text
phpmailer-php4/language/phpmailer.lang-fi.php -text
phpmailer-php4/language/phpmailer.lang-fo.php -text
phpmailer-php4/language/phpmailer.lang-fr.php -text
phpmailer-php4/language/phpmailer.lang-hu.php -text
phpmailer-php4/language/phpmailer.lang-it.php -text
phpmailer-php4/language/phpmailer.lang-ja.php -text
phpmailer-php4/language/phpmailer.lang-nl.php -text
phpmailer-php4/language/phpmailer.lang-no.php -text
phpmailer-php4/language/phpmailer.lang-pl.php -text
phpmailer-php4/language/phpmailer.lang-ro.php -text
phpmailer-php4/language/phpmailer.lang-ru.php -text
phpmailer-php4/language/phpmailer.lang-se.php -text
phpmailer-php4/language/phpmailer.lang-tr.php -text
phpmailer-php4/language/phpmailer.lang-zh.php -text
phpmailer-php4/language/phpmailer.lang-zh_cn.php -text
phpmailer-php5/LICENSE -text
phpmailer-php5/README -text
phpmailer-php5/class.phpmailer.php -text
phpmailer-php5/class.pop3.php -text
phpmailer-php5/class.smtp.php -text
phpmailer-php5/language/phpmailer.lang-ar.php -text
phpmailer-php5/language/phpmailer.lang-br.php -text
phpmailer-php5/language/phpmailer.lang-ca.php -text
phpmailer-php5/language/phpmailer.lang-ch.php -text
phpmailer-php5/language/phpmailer.lang-cz.php -text
phpmailer-php5/language/phpmailer.lang-de.php -text
phpmailer-php5/language/phpmailer.lang-dk.php -text
phpmailer-php5/language/phpmailer.lang-en.php -text
phpmailer-php5/language/phpmailer.lang-es.php -text
phpmailer-php5/language/phpmailer.lang-et.php -text
phpmailer-php5/language/phpmailer.lang-fi.php -text
phpmailer-php5/language/phpmailer.lang-fo.php -text
phpmailer-php5/language/phpmailer.lang-fr.php -text
phpmailer-php5/language/phpmailer.lang-hu.php -text
phpmailer-php5/language/phpmailer.lang-it.php -text
phpmailer-php5/language/phpmailer.lang-ja.php -text svneol=unset#application/octet-stream
phpmailer-php5/language/phpmailer.lang-nl.php -text
phpmailer-php5/language/phpmailer.lang-no.php -text
phpmailer-php5/language/phpmailer.lang-pl.php -text
phpmailer-php5/language/phpmailer.lang-ro.php -text
phpmailer-php5/language/phpmailer.lang-ru.php -text
phpmailer-php5/language/phpmailer.lang-se.php -text
phpmailer-php5/language/phpmailer.lang-tr.php -text
phpmailer-php5/language/phpmailer.lang-zh.php -text
phpmailer-php5/language/phpmailer.lang-zh_cn.php -text
/plugin.xml -text
prive/configurer_facteur.html -text
prive/images/facteur-24.png -text
prive/images/facteur-48.png -text
prive/themes/spip/images/facteur-16.png -text

86
base/facteur.php

@ -0,0 +1,86 @@
<?php
/*
* Plugin Facteur
* (c) 2009-2010 Collectif SPIP
* Distribue sous licence GPL
*
*/
if (!defined("_ECRIRE_INC_VERSION")) return;
function facteur_upgrade($nom_meta_base_version, $version_cible){
$current_version = "0.0";
if (isset($GLOBALS['meta'][$nom_meta_base_version])) {
$current_version = $GLOBALS['meta'][$nom_meta_base_version];
}
if ($current_version=="0.0" OR isset($GLOBALS['meta']['spip_notifications_version']) ) {
// reprendre la config de l'ancien nommage
if (isset($GLOBALS['meta']['spip_notifications_version'])) {
ecrire_meta('facteur_smtp', $GLOBALS['meta']['spip_notifications_smtp']);
ecrire_meta('facteur_smtp_auth', $GLOBALS['meta']['spip_notifications_smtp_auth']);
ecrire_meta('facteur_smtp_secure', $GLOBALS['meta']['spip_notifications_smtp_secure']);
ecrire_meta('facteur_smtp_sender', $GLOBALS['meta']['spip_notifications_smtp_sender']);
ecrire_meta('facteur_filtre_images', $GLOBALS['meta']['spip_notifications_filtre_images']);
ecrire_meta('facteur_filtre_css', $GLOBALS['meta']['spip_notifications_filtre_css']);
ecrire_meta('facteur_filtre_iso_8859', $GLOBALS['meta']['spip_notifications_filtre_iso_8859']);
ecrire_meta('facteur_adresse_envoi', $GLOBALS['meta']['spip_notifications_adresse_envoi']);
ecrire_meta('facteur_adresse_envoi_nom', $GLOBALS['meta']['spip_notifications_adresse_envoi_nom']);
ecrire_meta('facteur_adresse_envoi_email', $GLOBALS['meta']['spip_notifications_adresse_envoi_email']);
// supprimer l'ancien nommage
effacer_meta('spip_notifications_smtp');
effacer_meta('spip_notifications_smtp_auth');
effacer_meta('spip_notifications_smtp_secure');
effacer_meta('spip_notifications_smtp_sender');
effacer_meta('spip_notifications_filtre_images');
effacer_meta('spip_notifications_filtre_css');
effacer_meta('spip_notifications_filtre_iso_8859');
effacer_meta('spip_notifications_adresse_envoi');
effacer_meta('spip_notifications_adresse_envoi_nom');
effacer_meta('spip_notifications_adresse_envoi_email');
effacer_meta('spip_notifications_version');
// KEZAKO ?
include_spip('base/abstract_sql');
sql_drop_table('spip_notifications', true);
} else {
ecrire_meta('facteur_smtp', 'non');
ecrire_meta('facteur_smtp_auth', 'non');
ecrire_meta('facteur_smtp_secure', 'non');
ecrire_meta('facteur_smtp_sender', '');
ecrire_meta('facteur_filtre_images', 1);
ecrire_meta('facteur_filtre_css', 1);
ecrire_meta('facteur_filtre_iso_8859', 1);
ecrire_meta('facteur_adresse_envoi', 'non');
}
ecrire_meta($nom_meta_base_version, $current_version=$version_cible);
}
if (version_compare($current_version,"1.1","<")){
// version compatible php4
ecrire_meta($nom_meta_base_version,$current_version="1.1");
}
}
function facteur_vider_tables($nom_meta_base_version) {
// cfg la dessus, ca serait mieux !
effacer_meta('facteur_version');
effacer_meta('facteur_smtp');
effacer_meta('facteur_smtp_auth');
effacer_meta('facteur_smtp_secure');
effacer_meta('facteur_smtp_sender');
effacer_meta('facteur_filtre_images');
effacer_meta('facteur_filtre_css');
effacer_meta('facteur_filtre_iso_8859');
effacer_meta('facteur_adresse_envoi');
effacer_meta('facteur_adresse_envoi_nom');
effacer_meta('facteur_adresse_envoi_email');
effacer_meta('facteur_cc');
effacer_meta('facteur_bcc');
effacer_meta($nom_meta_base_version);
}
?>

491
classes/facteur.php

@ -0,0 +1,491 @@
<?php
/*
* Plugin Facteur
* (c) 2009-2010 Collectif SPIP
* Distribue sous licence GPL
*
*/
if (!defined("_ECRIRE_INC_VERSION")) return;
include_spip('inc/charsets');
include_spip('inc/filtres');
if (!class_exists('PHPMailer')) {
if (intval(phpversion()) == 5) {
include_spip('phpmailer-php5/class.phpmailer');
include_spip('phpmailer-php5/class.smtp');
} else {
include_spip('phpmailer-php4/class.phpmailer');
include_spip('phpmailer-php4/class.smtp');
}
}
include_spip('facteur_fonctions');
class Facteur extends PHPMailer {
function Facteur($email, $objet, $message_html, $message_texte) {
if ($GLOBALS['meta']['facteur_adresse_envoi'] == 'oui'
AND $GLOBALS['meta']['facteur_adresse_envoi_email'])
$this->From = $GLOBALS['meta']['facteur_adresse_envoi_email'];
else
$this->From = $GLOBALS['meta']['email_webmaster'];
if ($GLOBALS['meta']['facteur_adresse_envoi'] == 'oui'
AND $GLOBALS['meta']['facteur_adresse_envoi_nom'])
$this->FromName = $GLOBALS['meta']['facteur_adresse_envoi_nom'];
else
$this->FromName = strip_tags(extraire_multi($GLOBALS['meta']['nom_site']));
$this->CharSet = "utf-8";
$this->Mailer = 'mail';
$this->Subject = unicode_to_utf_8(charset2unicode($objet,$GLOBALS['meta']['charset']));
//Pour un envoi multiple de mail, $email doit être un tableau avec les adresses.
if (is_array($email)) {
foreach ($email as $cle => $adresseMail) {
$this->AddAddress($adresseMail);
}
}
else
$this->AddAddress($email);
if (!empty($GLOBALS['meta']['facteur_smtp_sender'])) {
$this->Sender = $GLOBALS['meta']['facteur_smtp_sender'];
$this->AddCustomHeader("Errors-To: ".$this->Sender);
}
if (!empty($GLOBALS['meta']['facteur_cc'])) {
$this->AddCC( $GLOBALS['meta']['facteur_cc'] );
}
if (!empty($GLOBALS['meta']['facteur_bcc'])) {
$this->AddBCC( $GLOBALS['meta']['facteur_bcc'] );
}
if (isset($GLOBALS['meta']['facteur_smtp']) AND $GLOBALS['meta']['facteur_smtp'] == 'oui') {
$this->Mailer = 'smtp';
$this->Host = $GLOBALS['meta']['facteur_smtp_host'];
$this->Port = $GLOBALS['meta']['facteur_smtp_port'];
if ($GLOBALS['meta']['facteur_smtp_auth'] == 'oui') {
$this->SMTPAuth = true;
$this->Username = $GLOBALS['meta']['facteur_smtp_username'];
$this->Password = $GLOBALS['meta']['facteur_smtp_password'];
}
else {
$this->SMTPAuth = false;
}
if (intval(phpversion()) == 5) {
if ($GLOBALS['meta']['facteur_smtp_secure'] == 'ssl')
$this->SMTPSecure = 'ssl';
if ($GLOBALS['meta']['facteur_smtp_secure'] == 'tls')
$this->SMTPSecure = 'tls';
}
}
if (!empty($message_html)) {
$message_html = unicode_to_utf_8(charset2unicode($message_html,$GLOBALS['meta']['charset']));
$this->Body = $message_html;
$this->IsHTML(true);
if ($GLOBALS['meta']['facteur_filtre_css'])
$this->ConvertirStylesEnligne();
if ($GLOBALS['meta']['facteur_filtre_images'])
$this->JoindreImagesHTML();
$this->UrlsAbsolues();
}
if (!empty($message_texte)) {
$message_texte = unicode_to_utf_8(charset2unicode($message_texte,$GLOBALS['meta']['charset']));
if (!$this->Body) {
$this->IsHTML(false);
$this->Body = $message_texte;
}
else {
$this->AltBody = $message_texte;
}
}
if ($GLOBALS['meta']['facteur_filtre_iso_8859'])
$this->ConvertirUtf8VersIso8859();
}
/*
* Transforme du HTML en texte brut, mais proprement, c'est-à-dire en essayant
* de garder les titrages, les listes, etc
*
* @param string $html Le HTML à transformer
* @return string Retourne un texte brut formaté correctement
*/
function html2text($html){
// On remplace tous les sauts de lignes par un espace
$html = str_replace("\n", ' ', $html);
// Supprimer tous les liens internes
$texte = preg_replace("/\<a href=['\"]#(.*?)['\"][^>]*>(.*?)<\/a>/ims", "\\2", $html);
// Supprime feuille style
$texte = preg_replace(";<style[^>]*>[^<]*</style>;i", "", $texte);
// Remplace tous les liens
$texte = preg_replace("/\<a[^>]*href=['\"](.*?)['\"][^>]*>(.*?)<\/a>/ims", "\\2 (\\1)", $texte);
// Les titres
$texte = preg_replace(";<h1[^>]*>;i", "\n= ", $texte);
$texte = str_replace("</h1>", " =\n\n", $texte);
$texte = preg_replace(";<h2[^>]*>;i", "\n== ", $texte);
$texte = str_replace("</h2>", " ==\n\n", $texte);
$texte = preg_replace(";<h3[^>]*>;i", "\n=== ", $texte);
$texte = str_replace("</h3>", " ===\n\n", $texte);
// Une fin de liste
$texte = preg_replace(";</(u|o)l>;i", "\n\n", $texte);
// Une saut de ligne *après* le paragraphe
$texte = preg_replace(";<p[^>]*>;i", "\n", $texte);
$texte = preg_replace(";</p>;i", "\n\n", $texte);
// Les sauts de ligne interne
$texte = preg_replace(";<br[^>]*>;i", "\n", $texte);
//$texte = str_replace('<br /><img class=\'spip_puce\' src=\'puce.gif\' alt=\'-\' border=\'0\'>', "\n".'-', $texte);
$texte = preg_replace (';<li[^>]*>;i', "\n".'- ', $texte);
// accentuation du gras
// <b>texte</b> -> **texte**
$texte = preg_replace (';<b[^>]*>;i','**' ,$texte);
$texte = str_replace ('</b>','**' ,$texte);
// accentuation du gras
// <strong>texte</strong> -> **texte**
$texte = preg_replace (';<strong[^>]*>;i','**' ,$texte);
$texte = str_replace ('</strong>','**' ,$texte);
// accentuation de l'italique
// <em>texte</em> -> *texte*
$texte = preg_replace (';<em[^>]*>;i','/' ,$texte);
$texte = str_replace ('</em>','*' ,$texte);
// accentuation de l'italique
// <i>texte</i> -> *texte*
$texte = preg_replace (';<i[^>]*>;i','/' ,$texte);
$texte = str_replace ('</i>','*' ,$texte);
$texte = str_replace('&oelig;', 'oe', $texte);
$texte = str_replace("&nbsp;", " ", $texte);
$texte = filtrer_entites($texte);
// On supprime toutes les balises restantes
$texte = supprimer_tags($texte);
$texte = str_replace("\x0B", "", $texte);
$texte = str_replace("\t", "", $texte) ;
$texte = preg_replace(";[ ]{3,};", "", $texte);
// espace en debut de ligne
$texte = preg_replace("/(\r\n|\n|\r)[ ]+/", "\n", $texte);
//marche po
// Bring down number of empty lines to 4 max
$texte = preg_replace("/(\r\n|\n|\r){3,}/m", "\n\n", $texte);
//saut de lignes en debut de texte
$texte = preg_replace("/^(\r\n|\n|\r)*/", "\n\n", $texte);
//saut de lignes en debut ou fin de texte
$texte = preg_replace("/(\r\n|\n|\r)*$/", "\n\n", $texte);
// Faire des lignes de 75 caracteres maximum
//$texte = wordwrap($texte);
return $texte;
}
/**
* Transformer les urls des liens et des images en url absolues
* sans toucher aux images embarquees de la forme "cid:..."
*/
function UrlsAbsolues(){
include_spip('inc/filtres_mini');
if (preg_match_all(',(<(a|link)[[:space:]]+[^<>]*href=["\']?)([^"\' ><[:space:]]+)([^<>]*>),imsS',
$this->Body, $liens, PREG_SET_ORDER)) {
foreach ($liens as $lien) {
if (strncmp($lien[3],"cid:",4)!==0){
$abs = url_absolue($lien[3], $base);
if ($abs <> $lien[3] and !preg_match('/^#/',$lien[3]))
$this->Body = str_replace($lien[0], $lien[1].$abs.$lien[4], $this->Body);
}
}
}
if (preg_match_all(',(<(img|script)[[:space:]]+[^<>]*src=["\']?)([^"\' ><[:space:]]+)([^<>]*>),imsS',
$this->Body, $liens, PREG_SET_ORDER)) {
foreach ($liens as $lien) {
if (strncmp($lien[3],"cid:",4)!==0){
$abs = url_absolue($lien[3], $base);
if ($abs <> $lien[3])
$this->Body = str_replace($lien[0], $lien[1].$abs.$lien[4], $this->Body);
}
}
}
}
function JoindreImagesHTML() {
$image_types = array(
'gif' => 'image/gif',
'jpg' => 'image/jpeg',
'jpeg' => 'image/jpeg',
'jpe' => 'image/jpeg',
'bmp' => 'image/bmp',
'png' => 'image/png',
'tif' => 'image/tiff',
'tiff' => 'image/tiff',
'swf' => 'application/x-shockwave-flash'
);
while (list($key,) = each($image_types))
$extensions[] = $key;
preg_match_all('/["\'](([^"\']+)\.('.implode('|', $extensions).'))([?][^"\']+)?["\']/Ui', $this->Body, $images, PREG_SET_ORDER);
$html_images = array();
foreach($images as $im){
if (!preg_match(",^[a-z0-9]+://,i",$im[1])
AND ($src = $im[1].$im[4])
AND (
file_exists($f=$im[1]) // l'image a ete generee depuis le meme cote que l'envoi
OR (_DIR_RACINE AND file_exists($f=_DIR_RACINE.$im[1])) // l'image a ete generee dans le public et on est dans le prive
OR (!_DIR_RACINE AND strncmp($im[1],"../",3)==0 AND file_exists($f=substr($im[1],3))) // l'image a ete generee dans le prive et on est dans le public
)
AND !isset($html_images[$src])){
$extension = strtolower($im[3]);
$header_extension = $image_types[$extension];
$cid = md5($f); // un id unique pour un meme fichier
// l'ajouter si pas deja present (avec un autre ?...)
if (!in_array($cid,$html_images))
$this->AddEmbeddedImage($f, $cid, basename($f),'base64',$header_extension);
$this->Body = str_replace($src, "cid:$cid", $this->Body);
$html_images[$src] = $cid; // marquer l'image comme traitee, inutile d'y revenir
}
}
}
function ConvertirStylesEnligne() {
/*
Written by Eric Dols - edols@auditavenue.com
You may freely use or modify this, provided
you leave credits to the original coder.
Feedback about (un)successfull uses, bugs and improvements done
are much appreciated, but don't expect actual support.
PURPOSE OF THIS FUNCTION
It is designed to process html emails relying
on a css stylesheet placed in the <head> for layout in
order to enhance compatibility with email clients,
including webmail services.
Provided you use minimal css, you can keep styling separate
from the content in your email template, and let this function
"inject" those styles inline in your email html tags on-the-fly,
just before sending.
Technically, it grabs the style declarations found in the
<head> section and inserts each declaration inline,
inside the corresponding html tags in the email message.
Supports both HTML and XHTML markup seamlessly. Thus
tolerant to email message writers using non-xhtml tag,
even when template is xhtml compliant (e.g. they would
add <img ...> instead of a xhtml compliant <img ... />).
NEW 10 dec. 2003:
- code revised, including a few regexp bugs fixed.
- multiple class for a tag are now allowed <p class="firstclass secondclass">
- all unsupported css styles are now moved to the body section (not just a:hover etc...)
USE
Add this function to a function library include, like "inline.inc"
and include it near the beginning of your php page:
require ("inline.inc");
load the html source of message into a variable
like $html_source and process it using:
$html_source = sheet2inline($html_source)
STYLE DEFINITIONS SUPPORTED
TAG { ... }
TAG1, TAG2, ... { ... }
TAG.class { ... }
.class { ...)
TAG:pseudo { ... }
CSS definitions may be freely formatted (spaces, tabs, linefeeds...),
they are converted to oneliners before inserting them inline in the html tags.
.class definitions are processed AFTER tag definitions,
thus appended inline after any existing tag styling to
preserve the normal css priority behavior.
Existing style="..." attributes in tags are NOT stripped. However they MUST
be with double quotes. If not, an addtional style="..." attribute will be added
KNOWN LIMITATIONS
- style info should be placed in <head> section. I believe
it shouldnt be too hard to modify to point to an external
stylesheet instead.
- no support (yet?):
* chains like P UL LI { .... } or P UL LI.class { .... }
* #divname p { ... } and <tag id="...">
* a:hover, a:visited {...} multiple class:pseudo
They require a significantly more complicated processing likely
based on stylesheet and document trees parsing.
Many email clients don't handle more than what is supported
by this script anyway.
- pseudo-classes like a:hover {...} can't be inserted inline
in the html tags: they are moved to a <style> declaration in
the <body> instead. This is a limitation from html, not this script.
- It is still up to you to check if target email clients render
your css styled templates correctly, especially webmail services
like Hotmail, in which the email becomes a sub-part of an html page,
with styles already in place.
*/
// variables to be accessed in the callback sub-function too
global $styledefinition, $styletag, $styleclass;
// Let's first load the stylesheet information in a $styles array using a regexp
preg_match_all ( "/^[ \t]*([.]?)([\w, #]+)([.:])?(\S*)\s+{([^}]+)}/mi", $this->Body , $styles);
/*
$styles[1] = . or '' => .class or tag (empty)
$styles[2] = name of class or tag(s)
$styles[3] = : . or '' => followed by pseudo-element, class separator or nothing (empty)
$styles[4] = name of pseudo-element after a tag, if any
$styles[5] = the style definition itself, i.e. what's between the { }
*/
// Now loop through the styles found and act accordingly;
// process TAG {...} & TAG1, TAG2,... {...} definitions only first by order of appearance
foreach ($styles[1] as $i => $type) {
if ($type=="" && $styles[3][$i]=="") {
$styledefinition = trim($styles[5][$i]);
$styletag = preg_replace("/ *, */", "|", trim($styles[2][$i])); //echo $styletag."<br />";
$styleclass = "";
// process TAG {...} and TAG1, TAG2 {...} but not TAG1 TAG2 {...} or #divname styles
if (!preg_match("/ /", $styletag) && !preg_match("/#/", $styletag)) {
$pattern = "!<(".$styletag.")([^>]*(?= /)|[^>]*)( /)?>!mi";
$this->Body = preg_replace_callback ($pattern, 'facteur_addstyle' , $this->Body);
$styles[6][$i]=1; // mark as injected inline
}
}
}
// append additional .CLASS {...} and TAG.CLASS {...} styling by order of appearance
// important to do so after TAG {...} definitions, so that class attributes override TAG styles when needed
foreach ($styles[1] as $i => $type) {
if ($type!="." && $styles[3][$i]=="." ) { // class definition for a specific tag
$styledefinition = trim($styles[5][$i]);
$styletag = trim($styles[2][$i]);
$styleclass = trim($styles[4][$i]);
$pattern = "!<(".$styletag.")([^>]* class\=['\"][^'\"]*".$styleclass."[^'\"]*['\"][^>]*(?= /)|[^>]* class\=['\"][^'\"]*".$styleclass."[^'\"]*['\"][^>]*)( />)?>!mi";
$this->Body = preg_replace_callback ($pattern, 'facteur_addstyle' , $this->Body);
$styles[6][$i]=1; // mark as injected inline
}
elseif ($type=="." && $styles[3][$i]=="" ) { // general class definition for any tag
$styledefinition = trim($styles[5][$i]);
$styletag = "";
$styleclass = trim($styles[2][$i]);
$pattern = "!<(\w+)([^>]* class\=['\"]".$styleclass."['\"][^>]*(?= /)|[^>]* class\=['\"]".$styleclass."['\"][^>]*)( />)?>!mi";
$this->Body = preg_replace_callback ($pattern, 'facteur_addstyle' , $this->Body);
$styles[6][$i]=1; // mark as injected inline
}
}
/* move all style declarations that weren't injected from <head> to a <body> <style> section,
including but not limited to:
- pseudo-classes like a:hover {...} as they can't be set inline
- declaration chains like UL LI {...}
- #divname {...}. These are not supported by email clients like Mac/Entourage anyway, it seems. */
foreach ($styles[1] as $i => $type) {
if ($styles[6][$i]=="") {
// add a <style type="text/css"> section after <body> if there's isn't one yet
if (preg_match ("!<body[^>]*>\s*<style!mi", $this->Body)==0) {
$this->Body = preg_replace ("/(<body[^>]*>)/i", "\n\$1\n".'<style type="text/css">'."\n<!--\n-->\n</style>\n", $this->Body);
}
// append a copy of the pseudo-element declaration to that body style section
$styledefinition = trim($styles[5][$i]);
$styledefinition = preg_replace ("!\s+!mi", " ", $styledefinition ); // convert style definition to a one-liner (optional)
$declaration = $styles[1][$i].trim($styles[2][$i]).$styles[3][$i].trim($styles[4][$i])." { ".$styledefinition." }";
$this->Body = preg_replace ("!(<body[^>]*>\s*<style[^>]*>\s*<\!\-\-[^>]*)"."(\s*\-\->\s*</style>)!si", "\$1".$declaration."\n\$2", $this->Body);
$styles[6][$i]= 2; // mark as moved to <style> section in <body>
}
}
// remove stylesheet declaration(s) from <head> section (comment following line out if not wanted)
//$this->Body = preg_replace ("!(<head>.*)<style type.*</style>(.*</head>)!si", "\$1\$2" , $this->Body);
// check what styles have been injected
# print_r($styles);
}
function safe_utf8_decode($text,$mode='texte_brut') {
if (!is_utf8($text))
return ($text);
if (function_exists('iconv') && $mode == 'texte_brut') {
$text = str_replace('’',"'",$text);
$text = iconv("UTF-8", "ISO-8859-1//TRANSLIT", $text);
return str_replace('&#8217;',"'",$text);
}
else {
if ($mode == 'texte_brut') {
$text = str_replace('’',"'",$text);
}
$text = unicode2charset(utf_8_to_unicode($text),'iso-8859-1');
return str_replace('&#8217;',"'",$text);
}
}
function ConvertirUtf8VersIso8859() {
$this->CharSet = 'iso-8859-1';
$this->Body = str_replace('charset=utf-8', 'charset=iso-8859-1', $this->Body);
$this->Body = $this->safe_utf8_decode($this->Body,'html');
$this->AltBody = $this->safe_utf8_decode($this->AltBody);
$this->Subject = $this->safe_utf8_decode($this->Subject);
$this->FromName = $this->safe_utf8_decode($this->FromName);
}
function ConvertirAccents() {
// tableau à compléter au fur et à mesure
$cor = array(
'à' => '&agrave;',
'â' => '&acirc;',
'ä' => '&auml;',
'ç' => '&ccedil;',
'é' => '&eacute;',
'è' => '&egrave;',
'ê' => '&ecirc;',
'ë' => '&euml;',
'î' => '&icirc;',
'ï' => '&iuml;',
'ò' => '&ograve;',
'ô' => '&ocirc;',
'ö' => '&ouml;',
'ù' => '&ugrave;',
'û' => '&ucirc;',
'œ' => '&oelig;',
'€' => '&euro;'
);
$this->Body = strtr($this->Body, $cor);
}
}
?>

63
emails/css.html

@ -0,0 +1,63 @@
<style type="text/css" media="screen">
.faux_body {
background-color: #fff;
font-size: 12px;
font-family: verdana, sans-serif;
}
.titre {
text-align: center;
color: #000;
font-size: 24px;
}
h2 {
font-size: 18px;
}
h3 {
font-size: 16px;
clear: both;
}
a {
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
a:visited {
}
.spip_documents_left {
float: left;
margin-right: 10px;
}
.spip_documents_center {
display: block;
text-align: center;
margin: 10px 0;
}
.spip_documents_right {
float: right;
margin-left: 10px;
}
.petit {
padding-top: 20px;
text-align: center;
font-size: 10px;
}
ul {
clear: both;
}
.invisible {
color: #eee;
}
</style>

22
emails/inc-bas.html

@ -0,0 +1,22 @@
</td>
<td width="20" style="background-color: #fff;">&nbsp;</td>
</tr>
[<tr>
<td colspan="3" width="580" style="background-color: #fff;"><a href="#URL_SITE_SPIP" title="[(#DESCRIPTIF_SITE_SPIP|textebrut)]"><img src="(#LOGO_NOTIFICATION_SURVOL||extraire_attribut{src})" alt="[(#NOM_SITE_SPIP|textebrut)]" border="0" width="[(#LOGO_NOTIFICATION_SURVOL||extraire_attribut{width})]" height="[(#LOGO_NOTIFICATION_SURVOL||extraire_attribut{height})]" /></a></td>
</tr>
]<tr>
<td colspan="3" width="580" height="20">&nbsp;</td>
</tr>
</table>
</center>
</div><!-- fin faux_body -->
</body>
</html>

31
emails/inc-haut.html

@ -0,0 +1,31 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" dir="#LANG_DIR" xml:lang="#LANG" lang="#LANG">
<head>
<meta http-equiv="content-type" content="text/html; charset=#CHARSET" />
<meta name="language" content="#LANG" />
<INCLURE {fond=emails/css}>
</head>
<body>
<div class="faux_body">
<center>
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td colspan="3" width="580" height="10">&nbsp;</td>
</tr>
[<tr>
<td colspan="3" width="580" style="background-color: #fff; text-align: center;"><a class="titre" href="#URL_SITE_SPIP" title="[(#DESCRIPTIF_SITE_SPIP|textebrut)]"><img class="titre" src="(#LOGO_NOTIFICATION_NORMAL||extraire_attribut{src})" alt="[(#NOM_SITE_SPIP|textebrut)]" border="0" width="[(#LOGO_NOTIFICATION_NORMAL||extraire_attribut{width})]" height="[(#LOGO_NOTIFICATION_NORMAL||extraire_attribut{height})]" /></a></td>
</tr>
]<tr>
<td width="20" style="background-color: #fff;">&nbsp;</td>
<td width="540" style="background-color: #fff;">

28
emails/test_email_html.html

@ -0,0 +1,28 @@
#HTTP_HEADER{Content-Type:text/html}
#INCLURE{fond=emails/inc-haut}
<h2><:facteur:corps_email_de_test:></h2>
<p><:facteur:version_html:></p>
<BOUCLE_art(ARTICLES){texte==<img}{0,1}>
#TEXTE
<hr />
#NOTES
</BOUCLE_art>
<BOUCLE_art2(ARTICLES){0,1}>
#TEXTE
<hr />
#NOTES
</BOUCLE_art2>
<//B_art>
<BOUCLE_image(DOCUMENTS){extension IN jpg,png,gif}{0,1}>
#MODELE{img}
</BOUCLE_image>
<BOUCLE_pdf(DOCUMENTS){extension=pdf}{0,1}>
#MODELE{doc}
</BOUCLE_pdf>
#INCLURE{fond=emails/inc-bas}

12
emails/test_email_texte.html

@ -0,0 +1,12 @@
<:facteur:corps_email_de_test:>
--------------------------------
<:facteur:version_texte:>
<BOUCLE_art(ARTICLES){texte==<img}{0,1}>
[(#TEXTE|textebrut)]
</BOUCLE_art>
<BOUCLE_art2(ARTICLES){0,1}>
[(#TEXTE|textebrut)]
</BOUCLE_art2>
<//B_art>

49
exec/facteur.php

@ -0,0 +1,49 @@
<?php
/*
* Plugin Facteur
* (c) 2009-2010 Collectif SPIP
* Distribue sous licence GPL
*
*/
if (!defined("_ECRIRE_INC_VERSION")) return;
include_spip('inc/presentation');
include_spip('inc/config');
include_spip('inc/meta');
include_spip('classes/facteur');
function exec_facteur() {
if (!autoriser('configurer', 'facteur')) {
include_spip('inc/minipres');
echo minipres();
exit;
}
pipeline('exec_init',array('args'=>array('exec'=>'facteur'),'data'=>''));
$commencer_page = charger_fonction('commencer_page', 'inc');
echo $commencer_page(_T('titre_configuration'), "configuration", "configuration");
echo "<br /><br /><br />\n";
echo gros_titre(_T('titre_configuration'),'',false);
echo barre_onglets("configuration", "facteur");
echo debut_gauche('', true);
echo pipeline('affiche_gauche',array('args'=>array('exec'=>'facteur'),'data'=>''));
echo debut_droite('', true);
echo pipeline('affiche_milieu', array('args'=>array('exec'=>'facteur'),
'data'=>recuperer_fond("prive/configurer_facteur", $_GET)));
echo fin_gauche();
echo fin_page();
}
?>

63
facteur_fonctions.php

@ -0,0 +1,63 @@
<?php
/*
* Plugin Facteur
* (c) 2009-2010 Collectif SPIP
* Distribue sous licence GPL
*
*/
if (!defined("_ECRIRE_INC_VERSION")) return;
include_spip('inc/texte');
include_spip('classes/facteur');
/**
* facteur_addstyle
*
* @author Eric Dols
**/
function facteur_addstyle($matches) {
// $matches[1]=tag, $matches[2]=tag attributes (if any), $matches[3]=xhtml closing (if any)
// variables values set in calling function
global $styledefinition, $styletag, $styleclass;
// convert the style definition to a one-liner
$styledefinition = preg_replace ("!\s+!mi", " ", $styledefinition );
// convert all double-quotes to single-quotes
$styledefinition = preg_replace ('/"/','\'', $styledefinition );
if (preg_match ("/style\=/i", $matches[2])) {
// add styles to existing style attribute if any already in the tag
$pattern = "!(.* style\=)[\"]([^\"]*)[\"](.*)!mi";
$replacement = "\$1".'"'."\$2 ".$styledefinition.'"'."\$3";
$attributes = preg_replace ($pattern, $replacement , $matches[2]);
} else {
// otherwise add new style attribute to tag (none was present)
$attributes = $matches[2].' style="'.$styledefinition.'"';
}
if ($styleclass!="") {
// if we were injecting a class style, remove the now useless class attribute from the html tag
// Single class in tag case (class="classname"): remove class attribute altogether
$pattern = "!(.*) class\=['\"]".$styleclass."['\"](.*)!mi";
$replacement = "\$1\$2";
$attributes = preg_replace ( $pattern, $replacement, $attributes);
// Multiple classes in tag case (class="classname anotherclass..."): remove class name from class attribute.
// classes are injected inline and removed by order of appearance in <head> stylesheet
// exact same behavior as where last declared class attributes in <style> take over (IE6 tested only)
$pattern = "!(.* class\=['\"][^\"]*)(".$styleclass." | ".$styleclass.")([^\"]*['\"].*)!mi";
$replacement = "\$1\$3";
$attributes = preg_replace ( $pattern, $replacement, $attributes);
}
return "<".$matches[1].$attributes.$matches[3].">";
}
?>

12
facteur_ieconfig_metas.php

@ -0,0 +1,12 @@
<?php
if (!defined("_ECRIRE_INC_VERSION")) return;
function facteur_ieconfig_metas($table){
$table['facteur']['titre'] = _T('facteur:configuration_facteur');
$table['facteur']['icone'] = 'prive/images/facteur-24.png';
$table['facteur']['metas_brutes'] = 'facteur_adresse_envoi,facteur_adresse_envoi_nom,facteur_adresse_envoi_email,facteur_smtp,facteur_smtp_host,facteur_smtp_port,facteur_smtp_auth,facteur_smtp_username,facteur_smtp_password,facteur_smtp_secure,facteur_smtp_sender,facteur_filtre_images,facteur_filtre_css,facteur_filtre_iso_8859';
return $table;
}
?>

207
formulaires/configurer_facteur.html

@ -0,0 +1,207 @@
<div class="formulaire_spip formulaire_configurer formulaire_#FORM">
<h3 class="titrem"><:facteur:configuration_facteur:></h3>
[<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>]
[<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]
[(#ENV{tester,''}|oui)
<iframe style='width:95%;height:500px;margin:10px;' src='#URL_PAGE{emails/test_email_html,var_mode=calcul}'></iframe>
]
<form method="post" action="#ENV{action}"><div>
#ACTION_FORMULAIRE{#ENV{action}}
<ul>
<li class="fieldset">
<fieldset>
<legend><:facteur:configuration_adresse_envoi:></legend>
<ul>
<li class="editer_facteur_adresse_envoi [ (#ENV**{erreurs}|table_valeur{facteur_adresse_envoi}|oui)erreur]">
[<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{facteur_adresse_envoi})</span>]
<div class="choix">
<input type="radio" name="facteur_adresse_envoi" class="radio" value="non" id="facteur_adresse_envoi_non"[(#ENV{facteur_adresse_envoi,'non'}|=={non}|oui)checked="checked"]/>
<label for="facteur_adresse_envoi_non"><:facteur:utiliser_reglages_site:></label>
</div>
<div class="choix">
<input type="radio" name="facteur_adresse_envoi" class="radio" value="oui" id="facteur_adresse_envoi_oui"[(#ENV{facteur_adresse_envoi,'non'}|=={oui}|oui)checked="checked"]/>
<label for="facteur_adresse_envoi_oui"><:facteur:personnaliser:></label>
</div>
</li>
<li class="editer_facteur_adresse_envoi_perso editer_facteur_adresse_envoi_nom [ (#ENV**{erreurs}|table_valeur{facteur_adresse_envoi_nom}|oui)erreur]"[(#ENV{facteur_adresse_envoi,'non'}|=={non}|oui)style='display:none;']>
<label for="facteur_adresse_envoi_nom"><:facteur:facteur_adresse_envoi_nom:></label>[
<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{facteur_adresse_envoi_nom})</span>]
<input type="text" name="facteur_adresse_envoi_nom" class="text" value="#ENV**{facteur_adresse_envoi_nom}" id="facteur_adresse_envoi_nom" />
</li>
<li class="editer_facteur_adresse_envoi_perso editer_facteur_adresse_envoi_email [ (#ENV**{erreurs}|table_valeur{facteur_adresse_envoi_email}|oui)erreur]"[(#ENV{facteur_adresse_envoi,'non'}|=={non}|oui)style='display:none;']>
<label for="facteur_adresse_envoi_email"><:facteur:facteur_adresse_envoi_email:></label>[
<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{facteur_adresse_envoi_email})</span>]
<input type="text" name="facteur_adresse_envoi_email" class="text" value="#ENV**{facteur_adresse_envoi_email}" id="facteur_adresse_envoi_email" />
</li>
</ul>
</fieldset>
</li>
<li class="fieldset">
<fieldset>
<legend><:facteur:configuration_mailer:></legend>
<ul>
<li class="editer_facteur_smtp [ (#ENV**{erreurs}|table_valeur{facteur_smtp}|oui)erreur]">
<label><:facteur:configuration_smtp:></label>
<p class="explication"><:facteur:configuration_smtp_descriptif:></p>
[<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{facteur_smtp})</span>]
<div class="choix">
<input type="radio" name="facteur_smtp" class="radio" value="non" id="facteur_smtp_non"[(#ENV{facteur_smtp,'non'}|=={non}|oui)checked="checked"]/>
<label for="facteur_smtp_non"><:facteur:utiliser_mail:></label>
</div>
<div class="choix">
<input type="radio" name="facteur_smtp" class="radio" value="oui" id="facteur_smtp_oui"[(#ENV{facteur_smtp,'non'}|=={oui}|oui)checked="checked"]/>
<label for="facteur_smtp_oui"><:facteur:utiliser_smtp:></label>
</div>
</li>
<li class="editer_facteur_smtp_param editer_facteur_smtp_host [ (#ENV**{erreurs}|table_valeur{facteur_smtp_host}|oui)erreur]"[(#ENV{facteur_smtp,'non'}|=={non}|oui)style='display:none;']>
<label for="facteur_smtp_host"><:facteur:facteur_smtp_host:></label>[
<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{facteur_smtp_host})</span>]
<input type="text" name="facteur_smtp_host" class="text" value="#ENV**{facteur_smtp_host}" id="facteur_smtp_host" />
</li>
<li class="editer_facteur_smtp_param editer_facteur_smtp_port [ (#ENV**{erreurs}|table_valeur{facteur_smtp_port}|oui)erreur]"[(#ENV{facteur_smtp,'non'}|=={non}|oui)style='display:none;']>
<label for="facteur_smtp_port"><:facteur:facteur_smtp_port:></label>[
<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{facteur_smtp_port})</span>]
<input type="text" name="facteur_smtp_port" class="text" value="#ENV**{facteur_smtp_port}" id="facteur_smtp_port" />
</li>
<li class="editer_facteur_smtp_param editer_facteur_smtp_auth [ (#ENV**{erreurs}|table_valeur{facteur_smtp_auth}|oui)erreur]"[(#ENV{facteur_smtp,'non'}|=={non}|oui)style='display:none;']>
<label><:facteur:facteur_smtp_auth:></label>
[<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{facteur_smtp_auth})</span>]
<div class="choix">
<input type="radio" name="facteur_smtp_auth" class="radio" value="non" id="facteur_smtp_auth_non"[(#ENV{facteur_smtp_auth,'non'}|=={non}|oui)checked="checked"]/>
<label for="facteur_smtp_auth_non"><:facteur:facteur_smtp_auth_non:></label>
</div>
<div class="choix">
<input type="radio" name="facteur_smtp_auth" class="radio" value="oui" id="facteur_smtp_auth_oui"[(#ENV{facteur_smtp_auth,'non'}|=={oui}|oui)checked="checked"]/>
<label for="facteur_smtp_auth_oui"><:facteur:facteur_smtp_auth_oui:></label>
</div>
<ul id="smtp-auth"[(#ENV{facteur_smtp_auth,'non'}|=={non}|oui)style='display:none;']>
<li class="editer_facteur_smtp_username [ (#ENV**{erreurs}|table_valeur{facteur_smtp_username}|oui)erreur]">
<label for="facteur_smtp_username"><:facteur:facteur_smtp_username:></label>[
<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{facteur_smtp_username})</span>]
<input type="text" name="facteur_smtp_username" class="text" value="#ENV**{facteur_smtp_username}" id="facteur_smtp_username" />
</li>
<li class="editer_facteur_smtp_password [ (#ENV**{erreurs}|table_valeur{facteur_smtp_password}|oui)erreur]">
<label for="facteur_smtp_password"><:facteur:facteur_smtp_password:></label>[
<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{facteur_smtp_password})</span>]
<input type="password" name="facteur_smtp_password" class="text" value="#ENV**{facteur_smtp_password}" id="facteur_smtp_password" />
</li>
</ul>
</li>
[(#ENV{_enable_smtp_secure}|oui)
<li class="editer_facteur_smtp_param editer_facteur_smtp_secure [ (#ENV**{erreurs}|table_valeur{facteur_smtp_secure}|oui)erreur]"[(#ENV{facteur_smtp,'non'}|=={non}|oui)style='display:none;']>
<label><:facteur:facteur_smtp_secure:></label>
[<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{facteur_smtp_secure})</span>]
<div class="choix">
<input type="radio" name="facteur_smtp_secure" class="radio" value="non" id="facteur_smtp_secure_non"[(#ENV{facteur_smtp_secure,'non'}|=={non}|oui)checked="checked"]/>
<label for="facteur_smtp_secure_non"><:facteur:facteur_smtp_secure_non:></label>
</div>
<div class="choix">
<input type="radio" name="facteur_smtp_secure" class="radio" value="ssl" id="facteur_smtp_secure_ssl"[(#ENV{facteur_smtp_secure,'non'}|=={ssl}|oui)checked="checked"]/>
<label for="facteur_smtp_secure_ssl"><:facteur:facteur_smtp_secure_ssl:></label>
</div>
<div class="choix">
<input type="radio" name="facteur_smtp_secure" class="radio" value="tls" id="facteur_smtp_secure_tls"[(#ENV{facteur_smtp_secure,'non'}|=={tls}|oui)checked="checked"]/>
<label for="facteur_smtp_secure_tls"><:facteur:facteur_smtp_secure_tls:></label>
</div>
</li>]
<li class="editer_facteur_smtp_sender [ (#ENV**{erreurs}|table_valeur{facteur_smtp_sender}|oui)erreur]">
<label for="facteur_smtp_sender"><:facteur:facteur_smtp_sender:></label>[
<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{facteur_smtp_sender})</span>]
<p class="explication"><:facteur:facteur_smtp_sender_descriptif:></p>
<input type="text" name="facteur_smtp_sender" class="text" value="#ENV**{facteur_smtp_sender}" id="facteur_smtp_sender" />
</li>
</ul>
</fieldset>
</li>
<li class="fieldset">
<fieldset>
<legend><:facteur:facteur_filtres:></legend>
<ul>
<li class="editer_facteur_filtres[ (#ENV**{erreurs}|table_valeur{facteur_filtres}|oui)erreur]">
<label><:facteur:facteur_smtp_secure:></label>
[<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{facteur_smtp_secure})</span>]
<p class="explication"><:facteur:facteur_filtres_descriptif:></p>
<div class="choix">
<input type="checkbox" name="facteur_filtre_images" class="checkbox" value="1" id="facteur_filtre_images"[(#ENV{facteur_filtre_images,''}|=={1}|oui)checked="checked"]/>
<label for="facteur_filtre_images"><:facteur:facteur_filtre_images:></label>
</div>
<div class="choix">
<input type="checkbox" name="facteur_filtre_css" class="checkbox" value="1" id="facteur_filtre_css"[(#ENV{facteur_filtre_css,''}|=={1}|oui)checked="checked"]/>
<label for="facteur_filtre_css"><:facteur:facteur_filtre_css:></label>
</div>
<div class="choix">
<input type="checkbox" name="facteur_filtre_iso_8859" class="checkbox" value="1" id="facteur_filtre_iso_8859"[(#ENV{facteur_filtre_iso_8859,''}|=={1}|oui)checked="checked"]/>
<label for="facteur_filtre_iso_8859"><:facteur:facteur_filtre_iso_8859:></label>
</div>
</li>
</ul>
</fieldset>
</li>
<li class="fieldset">
<fieldset>
<legend><:facteur:facteur_copies:></legend>
<ul>
<li class="editer_facteur_copies editer_facteur_desc">
<label for="facteur_cc">&nbsp;</label>
<p class="explication"><:facteur:facteur_copies_descriptif:></p>
</li>
<li class="editer_facteur_copies editer_facteur_cc [ (#ENV**{erreurs}|table_valeur{facteur_cc}|oui)erreur]">
<label for="facteur_cc"><:facteur:facteur_cc:></label>
[<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{facteur_cc})</span>]
<input type="text" name="facteur_cc" class="text" value="#ENV**{facteur_cc}" id="facteur_cc" />
</li>
<li class="editer_facteur_copies editer_facteur_bcc [ (#ENV**{erreurs}|table_valeur{facteur_bcc}|oui)erreur]">
<label for="facteur_bcc"><:facteur:facteur_bcc:></label>
[<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{facteur_bcc})</span>]
<input type="text" name="facteur_bcc" class="text" value="#ENV**{facteur_bcc}" id="facteur_bcc" />
</li>
</ul>
</fieldset>
</li>
</ul>
<p class="boutons">
<input type="submit" name="valider" class="submit" value="<:bouton_valider:>" />
</p>
<ul>
<li class="fieldset">
<fieldset>
<h3 class="legend"><:facteur:tester_la_configuration:></h3>
<ul>
<li>
<p class="explication"><:facteur:note_test_configuration:></p>
</li>
</ul>
</fieldset>
</li>
</ul>
<p class="boutons">
<input type="submit" name="tester" class="submit" value="<:facteur:tester:>" />
</p>
</div></form>
</div>
<script type="text/javascript">
jQuery(function(){
jQuery('input[name=facteur_adresse_envoi]').change(function(){
if (jQuery(this).attr('value')=='oui')
jQuery('.editer_facteur_adresse_envoi_perso').show('fast');
else
jQuery('.editer_facteur_adresse_envoi_perso').hide('fast');
});
jQuery('input[name=facteur_smtp]').change(function(){
if (jQuery(this).attr('value')=='oui')
jQuery('.editer_facteur_smtp_param').show('fast');
else
jQuery('.editer_facteur_smtp_param').hide('fast');
});
jQuery('input[name=facteur_smtp_auth]').change(function(){
if (jQuery(this).attr('value')=='oui')
jQuery('#smtp-auth').show('fast');
else
jQuery('#smtp-auth').hide('fast');
});
})
</script>

173
formulaires/configurer_facteur.php

@ -0,0 +1,173 @@
<?php
/*
* Plugin Facteur
* (c) 2009-2010 Collectif SPIP
* Distribue sous licence GPL
*
*/
if (!defined("_ECRIRE_INC_VERSION")) return;
function formulaires_configurer_facteur_charger_dist(){
$valeurs = array(
'facteur_adresse_envoi' => $GLOBALS['meta']['facteur_adresse_envoi'],
'facteur_adresse_envoi_nom' => $GLOBALS['meta']['facteur_adresse_envoi_nom'],
'facteur_adresse_envoi_email' => $GLOBALS['meta']['facteur_adresse_envoi_email'],
'facteur_smtp' => $GLOBALS['meta']['facteur_smtp'],
'facteur_smtp_host' => $GLOBALS['meta']['facteur_smtp_host'],
'facteur_smtp_port' => $GLOBALS['meta']['facteur_smtp_port']?$GLOBALS['meta']['facteur_smtp_port']:'25',
'facteur_smtp_auth' => $GLOBALS['meta']['facteur_smtp_auth'],
'facteur_smtp_username' => $GLOBALS['meta']['facteur_smtp_username'],
'facteur_smtp_password' => $GLOBALS['meta']['facteur_smtp_password'],
'facteur_smtp_secure' => $GLOBALS['meta']['facteur_smtp_secure'],
'facteur_smtp_sender' => $GLOBALS['meta']['facteur_smtp_sender'],
'facteur_filtre_images' => $GLOBALS['meta']['facteur_filtre_images'],
'facteur_filtre_css' => $GLOBALS['meta']['facteur_filtre_css'],
'facteur_filtre_iso_8859' => $GLOBALS['meta']['facteur_filtre_iso_8859'],
'_enable_smtp_secure' => (intval(phpversion()) == 5)?' ':'',
'facteur_cc' => $GLOBALS['meta']['facteur_cc'],
'facteur_bcc' => $GLOBALS['meta']['facteur_bcc'],
'tester' => '',
);
return $valeurs;
}
function formulaires_configurer_facteur_verifier_dist(){
$erreurs = array();
if ($email = _request('facteur_adresse_envoi_email')
AND !email_valide($email)) {
$erreurs['facteur_adresse_envoi_email'] = _T('form_email_non_valide');
set_request('facteur_adresse_envoi','oui');
}
if (_request('facteur_smtp')=='oui'){
if (!($h=_request('facteur_smtp_host')))
$erreurs['facteur_smtp_host'] = _T('info_obligatoire');
else {
$regexp_ip_valide = '#^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))|((([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){4}:([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){3}:([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){2}:([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(([0-9A-Fa-f]{1,4}:){0,5}:((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(::([0-9A-Fa-f]{1,4}:){0,5}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|([0-9A-Fa-f]{1,4}::([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(::([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:))$#';
// Source : http://www.d-sites.com/2008/10/09/regex-ipv4-et-ipv6/
if (!preg_match($regexp_ip_valide,$h)){ // ce n'est pas une IP
if(!preg_match(';^([^.\s/?:]+[.]){0,2}[^.\s/?:]+$;',$h)
OR gethostbyname($h)==$h)
$erreurs['facteur_smtp_host'] = _T('facteur:erreur_invalid_host');
}
else {
if (gethostbyaddr($h)==$h)
$erreurs['facteur_smtp_host'] = _T('facteur:erreur_invalid_host');
}
}
if (!($p=_request('facteur_smtp_port')))
$erreurs['facteur_smtp_port'] = _T('info_obligatoire');
elseif(!preg_match(';^[0-9]+$;',$p) OR !intval($p))
$erreurs['facteur_smtp_port'] = _T('facteur:erreur_invalid_port');
if (!_request('facteur_smtp_auth'))
$erreurs['facteur_smtp_auth'] = _T('info_obligatoire');
if (_request('facteur_smtp_auth')=='oui'){
if (!_request('facteur_smtp_username'))
$erreurs['facteur_smtp_username'] = _T('info_obligatoire');
if (!_request('facteur_smtp_password'))
$erreurs['facteur_smtp_password'] = _T('info_obligatoire');
}
}
if ($emailcc = _request('facteur_cc')
AND !email_valide($emailcc)) {
$erreurs['facteur_cc'] = _T('form_email_non_valide');
}
if ($emailbcc = _request('facteur_bcc')
AND !email_valide($emailbcc)) {
$erreurs['facteur_bcc'] = _T('form_email_non_valide');
}
if(count($erreurs)>0){
$erreurs['message_erreur'] = _T('facteur:erreur_generale');
}
return $erreurs;
}
function formulaires_configurer_facteur_traiter_dist(){
include_spip('inc/meta');
$facteur_adresse_envoi = _request('facteur_adresse_envoi');
ecrire_meta('facteur_adresse_envoi', ($facteur_adresse_envoi=='oui')?'oui':'non');
$facteur_adresse_envoi_nom = _request('facteur_adresse_envoi_nom');
ecrire_meta('facteur_adresse_envoi_nom', $facteur_adresse_envoi_nom?$facteur_adresse_envoi_nom:'');
$facteur_adresse_envoi_email = _request('facteur_adresse_envoi_email');
ecrire_meta('facteur_adresse_envoi_email', $facteur_adresse_envoi_email?$facteur_adresse_envoi_email:'');
$facteur_smtp = _request('facteur_smtp');
ecrire_meta('facteur_smtp', ($facteur_smtp=='oui')?'oui':'non');
$facteur_smtp_host = _request('facteur_smtp_host');
ecrire_meta('facteur_smtp_host', $facteur_smtp_host?$facteur_smtp_host:'');
$facteur_smtp_port = _request('facteur_smtp_port');
ecrire_meta('facteur_smtp_port', strlen($facteur_smtp_port)?intval($facteur_smtp_port):'');
$facteur_smtp_auth = _request('facteur_smtp_auth');
ecrire_meta('facteur_smtp_auth', ($facteur_smtp_auth=='oui')?'oui':'non');
$facteur_smtp_username = _request('facteur_smtp_username');
ecrire_meta('facteur_smtp_username', $facteur_smtp_username);
$facteur_smtp_password = _request('facteur_smtp_password');
ecrire_meta('facteur_smtp_password', $facteur_smtp_password);
if (intval(phpversion()) == 5) {
$facteur_smtp_secure = _request('facteur_smtp_secure');
ecrire_meta('facteur_smtp_secure', in_array($facteur_smtp_secure,array('non','ssl','tls'))?$facteur_smtp_secure:'non');
}
$facteur_smtp_sender = _request('facteur_smtp_sender');
ecrire_meta('facteur_smtp_sender', $facteur_smtp_sender);
ecrire_meta('facteur_filtre_images', intval(_request('facteur_filtre_images')));
ecrire_meta('facteur_filtre_css', intval(_request('facteur_filtre_css')));
ecrire_meta('facteur_filtre_iso_8859', intval(_request('facteur_filtre_iso_8859')));
$facteur_cc = _request('facteur_cc');
ecrire_meta('facteur_cc', $facteur_cc?$facteur_cc:'');
$facteur_bcc = _request('facteur_bcc');
ecrire_meta('facteur_bcc', $facteur_bcc?$facteur_bcc:'');
$res = array('message_ok'=>_T('facteur:config_info_enregistree'));
// faut-il envoyer un message de test ?
if (_request('tester')){
if ($GLOBALS['meta']['facteur_adresse_envoi'] == 'oui'
AND $GLOBALS['meta']['facteur_adresse_envoi_email'])
$destinataire = $GLOBALS['meta']['facteur_adresse_envoi_email'];
else
$destinataire = $GLOBALS['meta']['email_webmaster'];
if (($e=facteur_envoyer_mail_test($destinataire,_T('facteur:corps_email_de_test')))===true){
// OK
$res = array('message_ok'=>_T('facteur:email_test_envoye'));
}
else {
// erreur
$res = array('message_erreur'=>_T('facteur:erreur')." $e");
}
}
return $res;
}
function facteur_envoyer_mail_test($destinataire,$titre){
include_spip('classes/facteur');
$message_html = recuperer_fond('emails/test_email_html', array());
$message_texte = recuperer_fond('emails/test_email_texte', array());
$facteur = new Facteur($destinataire, $titre, $message_html, $message_texte);
if (!$facteur->Send())
return $test->ErrorInfo;
else
return true;
}
?>

176
inc/envoyer_mail.php

@ -0,0 +1,176 @@
<?php
/*
* Plugin Facteur
* (c) 2009-2010 Collectif SPIP
* Distribue sous licence GPL
*
*/
if (!defined("_ECRIRE_INC_VERSION")) return;
include_spip('classes/facteur');
// inclure le fichier natif de SPIP, pour les fonctions annexes
include_once _DIR_RESTREINT."inc/envoyer_mail.php";
/**
* @param string $destinataire
* @param string $sujet
* @param string|array $corps
* au format string, c'est un corps d'email au format texte, comme supporte nativement par le core
* au format array, c'est un corps etendu qui peut contenir
* string texte : le corps d'email au format texte
* string html : le corps d'email au format html
* string from : email de l'envoyeur (prioritaire sur argument $from de premier niveau, deprecie)
* string nom_envoyeur : un nom d'envoyeur pour completer l'email from
* string cc : destinataires en copie conforme
* string bcc : destinataires en copie conforme cachee
* string|array repondre_a : une ou plusieurs adresses à qui répondre
* string adresse_erreur : addresse de retour en cas d'erreur d'envoi
* array pieces_jointes : listes de pieces a embarquer dans l'email, chacune au format array :
* string chemin : chemin file system pour trouver le fichier a embarquer
* string nom : nom du document tel qu'apparaissant dans l'email
* string encodage : encodage a utiliser, parmi 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
* string mime : mime type du document
* array headers : tableau d'en-tetes personalises, une entree par ligne d'en-tete
* @param string $from (deprecie, utiliser l'entree from de $corps)
* @param string $headers (deprecie, utiliser l'entree headers de $corps)
* @return bool
*/
function inc_envoyer_mail($destinataire, $sujet, $corps, $from = "", $headers = "") {
$message_html = '';
$message_texte = '';
// si $corps est un tableau -> fonctionnalites etendues
// avec entrees possible : html, texte, pieces_jointes, nom_envoyeur, ...
if (is_array($corps)) {
$message_html = $corps['html'];
$message_texte = nettoyer_caracteres_mail($corps['texte']);
$pieces_jointes = $corps['pieces_jointes'];
$nom_envoyeur = $corps['nom_envoyeur'];
$from = (isset($corps['from'])?$corps['from']:$from);
$cc = $corps['cc'];
$bcc = $corps['bcc'];
$repondre_a = $corps['repondre_a'];
$adresse_erreur = $corps['adresse_erreur'];
$headers = (isset($corps['headers'])?$corps['headers']:$headers);
if (is_string($headers))
$headers = array_map('trim',explode("\n",$headers));
}
// si $corps est une chaine -> compat avec la fonction native SPIP
// gerer le cas ou le corps est du html avec un Content-Type: text/html dans les headers
else {
if (preg_match(',Content-Type:\s*text/html,ims',$headers)){
$message_html = $corps;
}
else {
$message_texte = nettoyer_caracteres_mail($corps);
}
$headers = array_map('trim',explode("\n",$headers));
}
$sujet = nettoyer_titre_email($sujet);
// mode TEST : forcer l'email
if (defined('_TEST_EMAIL_DEST')) {
if (!_TEST_EMAIL_DEST)
return false;
else
$destinataire = _TEST_EMAIL_DEST;
}
// plusieurs destinataires peuvent etre fournis separes par des virgules
// c'est un format standard dans l'envoi de mail
// les passer au format array pour phpMailer
// mais ne pas casser si on a deja un array en entree
if (is_array($destinataire))
$destinataire = implode(", ",$destinataire);
$destinataire = array_map('trim',explode(",",$destinataire));
// On crée l'objet Facteur (PHPMailer) pour le manipuler ensuite
$facteur = new Facteur($destinataire, $sujet, $message_html, $message_texte);
// On ajoute le courriel de l'envoyeur s'il est fournit par la fonction
if (empty($from) AND empty($facteur->From)) {
$from = $GLOBALS['meta']["email_envoi"];
if (empty($from) OR !email_valide($from)) {
spip_log("Meta email_envoi invalide. Le mail sera probablement vu comme spam.");
$from = $destinataire;
}
}
if (!empty($from)){
$facteur->From = $from;
// la valeur par défaut de la config n'est probablement pas valable pour ce mail,
// on l'écrase pour cet envoi
$facteur->FromName = $from;
}
// On ajoute le nom de l'envoyeur s'il fait partie des options
if ($nom_envoyeur)
$facteur->FromName = $nom_envoyeur;
// S'il y a des copies à envoyer
if ($cc){
if (is_array($cc))
foreach ($cc as $courriel)
$facteur->AddCC($courriel);
else
$facteur->AddCC($cc);
}
// S'il y a des copies cachées à envoyer
if ($bcc){
if (is_array($bcc))
foreach ($bcc as $courriel)
$facteur->AddBCC($courriel);
else
$facteur->AddBCC($bcc);
}
// S'il y a des copies cachées à envoyer
if ($repondre_a){
if (is_array($repondre_a))
foreach ($repondre_a as $courriel)
$facteur->AddReplyTo($courriel);