Dépôt officiel du core SPIP * Anciennement présent sur svn://trac.rezo.net/spip * Les plugins-dist faisant partie de la distribution SPIP sont présents dans https://git.spip.net/SPIP/[nom du plugin dist] https://www.spip.net
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

247 lines
7.8 KiB

5 years ago
5 years ago
5 years ago
Mise en conformité du PHPDoc et du comportement de la fonction envoyer_mail avec son extension proposée par le plugin Facteur : la fonction reste compatible avec les appels existants, mais le format a préférer devient : $envoyer_mail($destinataire, $sujet, $corps) ou $corps est un tableau d'entrées. En l'etat, la fonction supporte nativement les entrées suivantes pour $corps : texte, from et headers comme historiquement De plus, si une fonction 'mail_embarquer_pieces_jointes' est fournies, elle est appelee avec le contenu de l'entree 'pieces_jointes', charge à elle de convertir les dites pieces en une variable texte $parts qui représente les pieces jointes encodées, et qui sera ajoutée dans le corps du mail avec les boundary. Cela permet de merger l'évolution proposée par r18188 reportee en r18190 en restant dans la ligne de ce que propose Facteur. Par ce commit, on assure aussi le fonctionnement a minima des appels étendus destinés à Facteur, ce qui n'était pas le cas jusqu'ici (un $corps au format tableau provoquant un mail vide) /** * Envoi d'un mail * http://doc.spip.org/@inc_envoyer_mail_dist * * @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 from : email de l'envoyeur (prioritaire sur argument $from de premier niveau, deprecie) * array headers : tableau d'en-tetes personalises, une entree par ligne d'en-tete * --- Support partiel par une fonction mail_embarquer_pieces_jointes a fournir, --- * --- chargee de convertir en texte encodee les pieces jointes --- * 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 * --- Non implemente ici --- * string html : le corps d'email au format html * 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 adresse_erreur : addresse de retour en cas d'erreur d'envoi * @param string $from (deprecie, utiliser l'entree from de $corps) * @param string $headers (deprecie, utiliser l'entree headers de $corps) * @return bool */
10 years ago
Mise en conformité du PHPDoc et du comportement de la fonction envoyer_mail avec son extension proposée par le plugin Facteur : la fonction reste compatible avec les appels existants, mais le format a préférer devient : $envoyer_mail($destinataire, $sujet, $corps) ou $corps est un tableau d'entrées. En l'etat, la fonction supporte nativement les entrées suivantes pour $corps : texte, from et headers comme historiquement De plus, si une fonction 'mail_embarquer_pieces_jointes' est fournies, elle est appelee avec le contenu de l'entree 'pieces_jointes', charge à elle de convertir les dites pieces en une variable texte $parts qui représente les pieces jointes encodées, et qui sera ajoutée dans le corps du mail avec les boundary. Cela permet de merger l'évolution proposée par r18188 reportee en r18190 en restant dans la ligne de ce que propose Facteur. Par ce commit, on assure aussi le fonctionnement a minima des appels étendus destinés à Facteur, ce qui n'était pas le cas jusqu'ici (un $corps au format tableau provoquant un mail vide) /** * Envoi d'un mail * http://doc.spip.org/@inc_envoyer_mail_dist * * @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 from : email de l'envoyeur (prioritaire sur argument $from de premier niveau, deprecie) * array headers : tableau d'en-tetes personalises, une entree par ligne d'en-tete * --- Support partiel par une fonction mail_embarquer_pieces_jointes a fournir, --- * --- chargee de convertir en texte encodee les pieces jointes --- * 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 * --- Non implemente ici --- * string html : le corps d'email au format html * 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 adresse_erreur : addresse de retour en cas d'erreur d'envoi * @param string $from (deprecie, utiliser l'entree from de $corps) * @param string $headers (deprecie, utiliser l'entree headers de $corps) * @return bool */
10 years ago
5 years ago
Mise en conformité du PHPDoc et du comportement de la fonction envoyer_mail avec son extension proposée par le plugin Facteur : la fonction reste compatible avec les appels existants, mais le format a préférer devient : $envoyer_mail($destinataire, $sujet, $corps) ou $corps est un tableau d'entrées. En l'etat, la fonction supporte nativement les entrées suivantes pour $corps : texte, from et headers comme historiquement De plus, si une fonction 'mail_embarquer_pieces_jointes' est fournies, elle est appelee avec le contenu de l'entree 'pieces_jointes', charge à elle de convertir les dites pieces en une variable texte $parts qui représente les pieces jointes encodées, et qui sera ajoutée dans le corps du mail avec les boundary. Cela permet de merger l'évolution proposée par r18188 reportee en r18190 en restant dans la ligne de ce que propose Facteur. Par ce commit, on assure aussi le fonctionnement a minima des appels étendus destinés à Facteur, ce qui n'était pas le cas jusqu'ici (un $corps au format tableau provoquant un mail vide) /** * Envoi d'un mail * http://doc.spip.org/@inc_envoyer_mail_dist * * @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 from : email de l'envoyeur (prioritaire sur argument $from de premier niveau, deprecie) * array headers : tableau d'en-tetes personalises, une entree par ligne d'en-tete * --- Support partiel par une fonction mail_embarquer_pieces_jointes a fournir, --- * --- chargee de convertir en texte encodee les pieces jointes --- * 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 * --- Non implemente ici --- * string html : le corps d'email au format html * 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 adresse_erreur : addresse de retour en cas d'erreur d'envoi * @param string $from (deprecie, utiliser l'entree from de $corps) * @param string $headers (deprecie, utiliser l'entree headers de $corps) * @return bool */
10 years ago
5 years ago
5 years ago
Mise en conformité du PHPDoc et du comportement de la fonction envoyer_mail avec son extension proposée par le plugin Facteur : la fonction reste compatible avec les appels existants, mais le format a préférer devient : $envoyer_mail($destinataire, $sujet, $corps) ou $corps est un tableau d'entrées. En l'etat, la fonction supporte nativement les entrées suivantes pour $corps : texte, from et headers comme historiquement De plus, si une fonction 'mail_embarquer_pieces_jointes' est fournies, elle est appelee avec le contenu de l'entree 'pieces_jointes', charge à elle de convertir les dites pieces en une variable texte $parts qui représente les pieces jointes encodées, et qui sera ajoutée dans le corps du mail avec les boundary. Cela permet de merger l'évolution proposée par r18188 reportee en r18190 en restant dans la ligne de ce que propose Facteur. Par ce commit, on assure aussi le fonctionnement a minima des appels étendus destinés à Facteur, ce qui n'était pas le cas jusqu'ici (un $corps au format tableau provoquant un mail vide) /** * Envoi d'un mail * http://doc.spip.org/@inc_envoyer_mail_dist * * @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 from : email de l'envoyeur (prioritaire sur argument $from de premier niveau, deprecie) * array headers : tableau d'en-tetes personalises, une entree par ligne d'en-tete * --- Support partiel par une fonction mail_embarquer_pieces_jointes a fournir, --- * --- chargee de convertir en texte encodee les pieces jointes --- * 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 * --- Non implemente ici --- * string html : le corps d'email au format html * 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 adresse_erreur : addresse de retour en cas d'erreur d'envoi * @param string $from (deprecie, utiliser l'entree from de $corps) * @param string $headers (deprecie, utiliser l'entree headers de $corps) * @return bool */
10 years ago
5 years ago
Mise en conformité du PHPDoc et du comportement de la fonction envoyer_mail avec son extension proposée par le plugin Facteur : la fonction reste compatible avec les appels existants, mais le format a préférer devient : $envoyer_mail($destinataire, $sujet, $corps) ou $corps est un tableau d'entrées. En l'etat, la fonction supporte nativement les entrées suivantes pour $corps : texte, from et headers comme historiquement De plus, si une fonction 'mail_embarquer_pieces_jointes' est fournies, elle est appelee avec le contenu de l'entree 'pieces_jointes', charge à elle de convertir les dites pieces en une variable texte $parts qui représente les pieces jointes encodées, et qui sera ajoutée dans le corps du mail avec les boundary. Cela permet de merger l'évolution proposée par r18188 reportee en r18190 en restant dans la ligne de ce que propose Facteur. Par ce commit, on assure aussi le fonctionnement a minima des appels étendus destinés à Facteur, ce qui n'était pas le cas jusqu'ici (un $corps au format tableau provoquant un mail vide) /** * Envoi d'un mail * http://doc.spip.org/@inc_envoyer_mail_dist * * @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 from : email de l'envoyeur (prioritaire sur argument $from de premier niveau, deprecie) * array headers : tableau d'en-tetes personalises, une entree par ligne d'en-tete * --- Support partiel par une fonction mail_embarquer_pieces_jointes a fournir, --- * --- chargee de convertir en texte encodee les pieces jointes --- * 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 * --- Non implemente ici --- * string html : le corps d'email au format html * 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 adresse_erreur : addresse de retour en cas d'erreur d'envoi * @param string $from (deprecie, utiliser l'entree from de $corps) * @param string $headers (deprecie, utiliser l'entree headers de $corps) * @return bool */
10 years ago
Mise en conformité du PHPDoc et du comportement de la fonction envoyer_mail avec son extension proposée par le plugin Facteur : la fonction reste compatible avec les appels existants, mais le format a préférer devient : $envoyer_mail($destinataire, $sujet, $corps) ou $corps est un tableau d'entrées. En l'etat, la fonction supporte nativement les entrées suivantes pour $corps : texte, from et headers comme historiquement De plus, si une fonction 'mail_embarquer_pieces_jointes' est fournies, elle est appelee avec le contenu de l'entree 'pieces_jointes', charge à elle de convertir les dites pieces en une variable texte $parts qui représente les pieces jointes encodées, et qui sera ajoutée dans le corps du mail avec les boundary. Cela permet de merger l'évolution proposée par r18188 reportee en r18190 en restant dans la ligne de ce que propose Facteur. Par ce commit, on assure aussi le fonctionnement a minima des appels étendus destinés à Facteur, ce qui n'était pas le cas jusqu'ici (un $corps au format tableau provoquant un mail vide) /** * Envoi d'un mail * http://doc.spip.org/@inc_envoyer_mail_dist * * @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 from : email de l'envoyeur (prioritaire sur argument $from de premier niveau, deprecie) * array headers : tableau d'en-tetes personalises, une entree par ligne d'en-tete * --- Support partiel par une fonction mail_embarquer_pieces_jointes a fournir, --- * --- chargee de convertir en texte encodee les pieces jointes --- * 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 * --- Non implemente ici --- * string html : le corps d'email au format html * 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 adresse_erreur : addresse de retour en cas d'erreur d'envoi * @param string $from (deprecie, utiliser l'entree from de $corps) * @param string $headers (deprecie, utiliser l'entree headers de $corps) * @return bool */
10 years ago
10 years ago
Mise en conformité du PHPDoc et du comportement de la fonction envoyer_mail avec son extension proposée par le plugin Facteur : la fonction reste compatible avec les appels existants, mais le format a préférer devient : $envoyer_mail($destinataire, $sujet, $corps) ou $corps est un tableau d'entrées. En l'etat, la fonction supporte nativement les entrées suivantes pour $corps : texte, from et headers comme historiquement De plus, si une fonction 'mail_embarquer_pieces_jointes' est fournies, elle est appelee avec le contenu de l'entree 'pieces_jointes', charge à elle de convertir les dites pieces en une variable texte $parts qui représente les pieces jointes encodées, et qui sera ajoutée dans le corps du mail avec les boundary. Cela permet de merger l'évolution proposée par r18188 reportee en r18190 en restant dans la ligne de ce que propose Facteur. Par ce commit, on assure aussi le fonctionnement a minima des appels étendus destinés à Facteur, ce qui n'était pas le cas jusqu'ici (un $corps au format tableau provoquant un mail vide) /** * Envoi d'un mail * http://doc.spip.org/@inc_envoyer_mail_dist * * @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 from : email de l'envoyeur (prioritaire sur argument $from de premier niveau, deprecie) * array headers : tableau d'en-tetes personalises, une entree par ligne d'en-tete * --- Support partiel par une fonction mail_embarquer_pieces_jointes a fournir, --- * --- chargee de convertir en texte encodee les pieces jointes --- * 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 * --- Non implemente ici --- * string html : le corps d'email au format html * 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 adresse_erreur : addresse de retour en cas d'erreur d'envoi * @param string $from (deprecie, utiliser l'entree from de $corps) * @param string $headers (deprecie, utiliser l'entree headers de $corps) * @return bool */
10 years ago
Mise en conformité du PHPDoc et du comportement de la fonction envoyer_mail avec son extension proposée par le plugin Facteur : la fonction reste compatible avec les appels existants, mais le format a préférer devient : $envoyer_mail($destinataire, $sujet, $corps) ou $corps est un tableau d'entrées. En l'etat, la fonction supporte nativement les entrées suivantes pour $corps : texte, from et headers comme historiquement De plus, si une fonction 'mail_embarquer_pieces_jointes' est fournies, elle est appelee avec le contenu de l'entree 'pieces_jointes', charge à elle de convertir les dites pieces en une variable texte $parts qui représente les pieces jointes encodées, et qui sera ajoutée dans le corps du mail avec les boundary. Cela permet de merger l'évolution proposée par r18188 reportee en r18190 en restant dans la ligne de ce que propose Facteur. Par ce commit, on assure aussi le fonctionnement a minima des appels étendus destinés à Facteur, ce qui n'était pas le cas jusqu'ici (un $corps au format tableau provoquant un mail vide) /** * Envoi d'un mail * http://doc.spip.org/@inc_envoyer_mail_dist * * @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 from : email de l'envoyeur (prioritaire sur argument $from de premier niveau, deprecie) * array headers : tableau d'en-tetes personalises, une entree par ligne d'en-tete * --- Support partiel par une fonction mail_embarquer_pieces_jointes a fournir, --- * --- chargee de convertir en texte encodee les pieces jointes --- * 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 * --- Non implemente ici --- * string html : le corps d'email au format html * 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 adresse_erreur : addresse de retour en cas d'erreur d'envoi * @param string $from (deprecie, utiliser l'entree from de $corps) * @param string $headers (deprecie, utiliser l'entree headers de $corps) * @return bool */
10 years ago
Mise en conformité du PHPDoc et du comportement de la fonction envoyer_mail avec son extension proposée par le plugin Facteur : la fonction reste compatible avec les appels existants, mais le format a préférer devient : $envoyer_mail($destinataire, $sujet, $corps) ou $corps est un tableau d'entrées. En l'etat, la fonction supporte nativement les entrées suivantes pour $corps : texte, from et headers comme historiquement De plus, si une fonction 'mail_embarquer_pieces_jointes' est fournies, elle est appelee avec le contenu de l'entree 'pieces_jointes', charge à elle de convertir les dites pieces en une variable texte $parts qui représente les pieces jointes encodées, et qui sera ajoutée dans le corps du mail avec les boundary. Cela permet de merger l'évolution proposée par r18188 reportee en r18190 en restant dans la ligne de ce que propose Facteur. Par ce commit, on assure aussi le fonctionnement a minima des appels étendus destinés à Facteur, ce qui n'était pas le cas jusqu'ici (un $corps au format tableau provoquant un mail vide) /** * Envoi d'un mail * http://doc.spip.org/@inc_envoyer_mail_dist * * @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 from : email de l'envoyeur (prioritaire sur argument $from de premier niveau, deprecie) * array headers : tableau d'en-tetes personalises, une entree par ligne d'en-tete * --- Support partiel par une fonction mail_embarquer_pieces_jointes a fournir, --- * --- chargee de convertir en texte encodee les pieces jointes --- * 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 * --- Non implemente ici --- * string html : le corps d'email au format html * 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 adresse_erreur : addresse de retour en cas d'erreur d'envoi * @param string $from (deprecie, utiliser l'entree from de $corps) * @param string $headers (deprecie, utiliser l'entree headers de $corps) * @return bool */
10 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
  1. <?php
  2. /***************************************************************************\
  3. * SPIP, Système de publication pour l'internet *
  4. * *
  5. * Copyright © avec tendresse depuis 2001 *
  6. * Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James *
  7. * *
  8. * Ce programme est un logiciel libre distribué sous licence GNU/GPL. *
  9. * Pour plus de détails voir le fichier COPYING.txt ou l'aide en ligne. *
  10. \***************************************************************************/
  11. /**
  12. * Gestion des emails et de leur envoi
  13. *
  14. * @package SPIP\Core\Mail
  15. **/
  16. if (!defined('_ECRIRE_INC_VERSION')) {
  17. return;
  18. }
  19. include_spip('inc/charsets');
  20. include_spip('inc/texte');
  21. /**
  22. * Nettoyer le titre d'un email
  23. *
  24. * @uses textebrut()
  25. * @uses corriger_typo()
  26. *
  27. * @param string $titre
  28. * @return string
  29. */
  30. function nettoyer_titre_email($titre) {
  31. return str_replace("\n", ' ', nettoyer_caracteres_mail(textebrut(corriger_typo($titre))));
  32. }
  33. /**
  34. * Utiliser le bon encodage de caractères selon le charset
  35. *
  36. * Caractères pris en compte : apostrophe, double guillemet,
  37. * le tiret cadratin, le tiret demi-cadratin
  38. *
  39. * @uses filtrer_entites()
  40. *
  41. * @param string $t
  42. * @return string
  43. */
  44. function nettoyer_caracteres_mail($t) {
  45. $t = filtrer_entites($t);
  46. if ($GLOBALS['meta']['charset'] <> 'utf-8') {
  47. $t = str_replace(
  48. array('&#8217;', '&#8220;', '&#8221;'),
  49. array("'", '"', '"'),
  50. $t
  51. );
  52. }
  53. $t = str_replace(
  54. array('&mdash;', '&endash;'),
  55. array('--', '-'),
  56. $t
  57. );
  58. return $t;
  59. }
  60. /**
  61. * Envoi d'un mail
  62. *
  63. * @param string $destinataire
  64. * @param string $sujet
  65. * @param string|array $corps
  66. * - au format string, c'est un corps d'email au format texte, comme supporte nativement par le core
  67. * - au format array, c'est un corps etendu qui peut contenir
  68. * - string texte : le corps d'email au format texte
  69. * - string from : email de l'envoyeur (prioritaire sur argument $from de premier niveau, deprecie)
  70. * - array headers : tableau d'en-tetes personalises, une entree par ligne d'en-tete
  71. * --- Support partiel par une fonction mail_embarquer_pieces_jointes a fournir, ---
  72. * --- chargee de convertir en texte encodee les pieces jointes ---
  73. * - array pieces_jointes : listes de pieces a embarquer dans l'email, chacune au format array :
  74. * - string chemin : chemin file system pour trouver le fichier a embarquer
  75. * - string nom : nom du document tel qu'apparaissant dans l'email
  76. * - string encodage : encodage a utiliser, parmi 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
  77. * - string mime : mime type du document
  78. * --- Non implemente ici ---
  79. * - string html : le corps d'email au format html
  80. * - string nom_envoyeur : un nom d'envoyeur pour completer l'email from
  81. * - string cc : destinataires en copie conforme
  82. * - string bcc : destinataires en copie conforme cachee
  83. * - string adresse_erreur : addresse de retour en cas d'erreur d'envoi
  84. * @param string $from (deprecie, utiliser l'entree from de $corps)
  85. * @param string $headers (deprecie, utiliser l'entree headers de $corps)
  86. * @return bool
  87. */
  88. function inc_envoyer_mail_dist($destinataire, $sujet, $corps, $from = '', $headers = '') {
  89. if (!email_valide($destinataire)) {
  90. return false;
  91. }
  92. if ($destinataire == _T('info_mail_fournisseur')) {
  93. return false;
  94. } // tres fort
  95. // Fournir si possible un Message-Id: conforme au RFC1036,
  96. // sinon SpamAssassin denoncera un MSGID_FROM_MTA_HEADER
  97. $email_envoi = $GLOBALS['meta']['email_envoi'];
  98. if (!email_valide($email_envoi)) {
  99. spip_log('Meta email_envoi invalide. Le mail sera probablement vu comme spam.');
  100. $email_envoi = $destinataire;
  101. }
  102. $parts = '';
  103. if (is_array($corps)) {
  104. $texte = $corps['texte'];
  105. $from = (isset($corps['from']) ? $corps['from'] : $from);
  106. $headers = (isset($corps['headers']) ? $corps['headers'] : $headers);
  107. if (is_array($headers)) {
  108. $headers = implode("\n", $headers);
  109. }
  110. if ($corps['pieces_jointes'] and function_exists('mail_embarquer_pieces_jointes')) {
  111. $parts = mail_embarquer_pieces_jointes($corps['pieces_jointes']);
  112. }
  113. } else {
  114. $texte = $corps;
  115. }
  116. if (!$from) {
  117. $from = $email_envoi;
  118. }
  119. // ceci est la RegExp NO_REAL_NAME faisant hurler SpamAssassin
  120. if (preg_match('/^["\s]*\<?\S+\@\S+\>?\s*$/', $from)) {
  121. $from .= ' (' . str_replace(')', '', translitteration(str_replace('@', ' at ', $from))) . ')';
  122. }
  123. // nettoyer les &eacute; &#8217, &emdash; etc...
  124. // les 'cliquer ici' etc sont a eviter; voir:
  125. // http://mta.org.ua/spamassassin-2.55/stuff/wiki.CustomRulesets/20050914/rules/french_rules.cf
  126. $texte = nettoyer_caracteres_mail($texte);
  127. $sujet = nettoyer_caracteres_mail($sujet);
  128. // encoder le sujet si possible selon la RFC
  129. if (init_mb_string()) {
  130. # un bug de mb_string casse mb_encode_mimeheader si l'encoding interne
  131. # est UTF-8 et le charset iso-8859-1 (constate php5-mac ; php4.3-debian)
  132. $charset = $GLOBALS['meta']['charset'];
  133. mb_internal_encoding($charset);
  134. $sujet = mb_encode_mimeheader($sujet, $charset, 'Q', "\n");
  135. mb_internal_encoding('utf-8');
  136. }
  137. if (function_exists('wordwrap') && (preg_match(',multipart/mixed,', $headers) == 0)) {
  138. $texte = wordwrap($texte);
  139. }
  140. list($headers, $texte) = mail_normaliser_headers($headers, $from, $destinataire, $texte, $parts);
  141. if (_OS_SERVEUR == 'windows') {
  142. $texte = preg_replace("@\r*\n@", "\r\n", $texte);
  143. $headers = preg_replace("@\r*\n@", "\r\n", $headers);
  144. $sujet = preg_replace("@\r*\n@", "\r\n", $sujet);
  145. }
  146. spip_log("mail $destinataire\n$sujet\n$headers", 'mails');
  147. // mode TEST : forcer l'email
  148. if (defined('_TEST_EMAIL_DEST')) {
  149. if (!_TEST_EMAIL_DEST) {
  150. return false;
  151. } else {
  152. $texte = "Dest : $destinataire\r\n" . $texte;
  153. $destinataire = _TEST_EMAIL_DEST;
  154. }
  155. }
  156. return @mail($destinataire, $sujet, $texte, $headers);
  157. }
  158. /**
  159. * Formater correctement l'entête d'un email
  160. *
  161. * @param string $headers
  162. * @param string $from
  163. * @param string $to
  164. * @param string $texte
  165. * @param string $parts
  166. * @return array
  167. */
  168. function mail_normaliser_headers($headers, $from, $to, $texte, $parts = '') {
  169. $charset = $GLOBALS['meta']['charset'];
  170. // Ajouter le Content-Type et consort s'il n'y est pas deja
  171. if (strpos($headers, 'Content-Type: ') === false) {
  172. $type =
  173. "Content-Type: text/plain;charset=\"$charset\";\n" .
  174. "Content-Transfer-Encoding: 8bit\n";
  175. } else {
  176. $type = '';
  177. }
  178. // calculer un identifiant unique
  179. // Marie Toto <Marie@toto.com> => @toto.com
  180. if (preg_match('/@[^\s>]+/', $from, $domain)) {
  181. $domain = $domain[0];
  182. }
  183. else {
  184. $domain = "@unknown-".md5($from).'.org';
  185. }
  186. $uniq = rand() . '_' . md5($to . $texte) . $domain;
  187. // Si multi-part, s'en servir comme borne ...
  188. if ($parts) {
  189. $texte = "--$uniq\n$type\n" . $texte . "\n";
  190. foreach ($parts as $part) {
  191. $n = strlen($part[1]) . ($part[0] ? "\n" : '');
  192. $e = join("\n", $part[0]);
  193. $texte .= "\n--$uniq\nContent-Length: $n$e\n\n" . $part[1];
  194. }
  195. $texte .= "\n\n--$uniq--\n";
  196. // Si boundary n'est pas entre guillemets,
  197. // elle est comprise mais le charset est ignoree !
  198. $type = "Content-Type: multipart/mixed; boundary=\"$uniq\"\n";
  199. }
  200. // .. et s'en servir pour plaire a SpamAssassin
  201. $mid = 'Message-Id: <' . $uniq . '>';
  202. // indispensable pour les sites qui collent d'office From: serveur-http
  203. // sauf si deja mis par l'envoyeur
  204. $rep = (strpos($headers, 'Reply-To:') !== false) ? '' : "Reply-To: $from\n";
  205. // Nettoyer les en-tetes envoyees
  206. // Ajouter le \n final
  207. if (strlen($headers = trim($headers))) {
  208. $headers .= "\n";
  209. }
  210. // Et mentionner l'indeboulonable nomenclature ratee
  211. $headers .= "From: $from\n$type$rep$mid\nMIME-Version: 1.0\n";
  212. return array($headers, $texte);
  213. }