Valider 1d703075 rédigé par cerdic's avatar cerdic
Parcourir les fichiers

Mise en conformité du PHPDoc et du comportement de la fonction envoyer_mail...

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
 */
parent caad1719
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+50 −15
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -40,15 +40,39 @@ function nettoyer_caracteres_mail($t) {
	return $t;
}

// Envoi d'un mail avec d'eventuelles pieces jointes
// specifiees en dernier argument sous forme d'un tableau de sous-tableaux
// de longueur 2 (headers / body)

// http://doc.spip.org/@inc_envoyer_mail_dist
function inc_envoyer_mail_dist($email, $sujet, $texte, $from = "", $headers = "", $parts=array()) {

	if (!email_valide($email)) return false;
	if ($email == _T('info_mail_fournisseur')) return false; // tres fort
/**
 * 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
 */
function inc_envoyer_mail_dist($destinataire, $sujet, $corps, $from = "", $headers = "") {

	if (!email_valide($destinataire)) return false;
	if ($destinataire == _T('info_mail_fournisseur')) return false; // tres fort

	// Fournir si possible un Message-Id: conforme au RFC1036,
	// sinon SpamAssassin denoncera un MSGID_FROM_MTA_HEADER
@@ -56,7 +80,18 @@ function inc_envoyer_mail_dist($email, $sujet, $texte, $from = "", $headers = ""
	$email_envoi = $GLOBALS['meta']["email_envoi"];
	if (!email_valide($email_envoi)) {
		spip_log("Meta email_envoi invalide. Le mail sera probablement vu comme spam.");
		$email_envoi = $email;
		$email_envoi = $destinataire;
	}

	if (is_array($corps)){
		$texte = $corps['texte'];
		$from = (isset($corps['from'])?$corps['from']:$from);
		$headers = (isset($corps['headers'])?$corps['headers']:$headers);
		if (is_array($headers))
			$headers = implode("\n",$headers);
		$parts = "";
		if ($corps['pieces_jointes'] AND function_exists('mail_embarquer_pieces_jointes'))
			$parts = mail_embarquer_pieces_jointes($corps['pieces_jointes']);
	}

	if (!$from) $from = $email_envoi;
@@ -84,7 +119,7 @@ function inc_envoyer_mail_dist($email, $sujet, $texte, $from = "", $headers = ""
	if (function_exists('wordwrap') && (preg_match(',multipart/mixed,',$headers) == 0))
		$texte = wordwrap($texte);

	list($headers, $texte) = mail_normaliser_headers($headers, $from, $email, $texte, $parts);
	list($headers, $texte) = mail_normaliser_headers($headers, $from, $destinataire, $texte, $parts);

	if (_OS_SERVEUR == 'windows') {
		$texte = preg_replace ("@\r*\n@","\r\n", $texte);
@@ -92,19 +127,19 @@ function inc_envoyer_mail_dist($email, $sujet, $texte, $from = "", $headers = ""
		$sujet = preg_replace ("@\r*\n@","\r\n", $sujet);
	}

	spip_log("mail $email\n$sujet\n$headers",'mails');
	spip_log("mail $destinataire\n$sujet\n$headers",'mails');
	// mode TEST : forcer l'email
	if (defined('_TEST_EMAIL_DEST')) {
		if (!_TEST_EMAIL_DEST)
			return false;
		else
			$email = _TEST_EMAIL_DEST;
			$destinataire = _TEST_EMAIL_DEST;
	}

	return @mail($email, $sujet, $texte, $headers);
	return @mail($destinataire, $sujet, $texte, $headers);
}

function mail_normaliser_headers($headers, $from, $to, $texte, $parts)
function mail_normaliser_headers($headers, $from, $to, $texte, $parts="")
{
	$charset = $GLOBALS['meta']['charset'];