Créer classe d'envoi mail avec pièces jointes

Fermé
moimp Messages postés 3 Date d'inscription lundi 26 mars 2012 Statut Membre Dernière intervention 25 juin 2016 - 14 juin 2016 à 20:04
moimp Messages postés 3 Date d'inscription lundi 26 mars 2012 Statut Membre Dernière intervention 25 juin 2016 - 25 juin 2016 à 18:44
Bonjour,
Je crée une classe d'envoi de mails au format texte et html avec une ou plusieurs pièces jointes.
Cette classe est basée sur le tuto https://www.commentcamarche.net/faq/2761-langages-envoyer-un-mail-avec-piece-jointe
Sans pièces jointes, aucun problème.
Avec une pièce jointe, le client reçoit non pas une mais deux pièces jointes.
La première contient le texte du message au format html, la deuxième contient un fichier vide nommé comme le fichier initial.
Une petite aide serait bienvenue.
Cordialement

Voici le code de la méthode d'envoi:
<?php
	public function sending()
	{
		if (empty($this->to) and empty($this->cc) and empty($this->bcc)) throw new DomainException("No valid recipient");
		$attached = false;
		if (!empty($this->files)) {
			$attached = true;
			$attachements = [];
		}
		
		// 'Boundary' fixing
		$boundary = md5(uniqid(time()));
		
		// Assembly of addresses
		if (!empty($this->to)) $toLine = implode(', ', $this->to);
		
		// headers definition
		$headers = [];
		$headers[] = 'From: ' . $this->fromLine;
		if ($this->replyAddress) $headers[] = 'Reply-to: ' . $this->addressConcat($this->replyAddress, $this->replyName);
		if (!empty($this->cc)) $headers[] = 'Cc: ' . implode(', ', $this->cc );
		if (!empty($this->bcc)) $headers[] = 'Bcc: ' . implode(', ', $this->bcc );
		//$headers[] = "X-Priority: 1 ";
		$headers[] = 'MIME-Version: 1.0';
		$contentType = $attached ? 'mixed' : 'alternative';
		$headers[] = "Content-Type: multipart/$contentType; boundary=\"$boundary\""; // Définition du type et de la boundary
		$header = implode(self::CRLF, $headers) . self::CRLF . self::CRLF;
		
		// Message body
		if (! $attached) { // sans pièces jointes
			// opening
			$message = [];
			$message[] = "--$boundary";
			// adding plain text
			$message[] = "Content-Type: text/plain; charset=\"ISO-8859-1\"";
			$message[] = "Content-Transfer-Encoding: 8bit" . self::CRLF;
			$message[] = $this->plainText . self::CRLF;
			// boundary
			$message[] = "--$boundary";
			// adding html text
			$message[] = "Content-Type: text/html; charset=\"ISO-8859-1\"";
			$message[] = "Content-Transfer-Encoding: 8bit" . self::CRLF;
			$message[] = $this->htmlText . self::CRLF;
			// Boundaries double closing (one for each message format)
			$message[] = "--$boundary";
			$message[] = "--$boundary";
			$message = implode(self::CRLF, $message) . "--$boundary--";
			//var_dump(__line__, $message);
		}
		else { // avec pièces jointes
			// opening
			$message = [];
			$message[] = "--$boundary";
			// adding plain text
			$message[] = "Content-Type: text/plain; charset=\"ISO-8859-1\"";
			$message[] = "Content-Transfer-Encoding: 8bit" . self::CRLF;
			$message[] = $this->plainText . self::CRLF;
			// boundary
			$message[] = "--$boundary";
			// adding html text
			$message[] = "Content-Type: text/html; charset=\"ISO-8859-1\"";
			$message[] = "Content-Transfer-Encoding: 8bit" . self::CRLF;
			$message[] = $this->htmlText . self::CRLF;
			$message[] = self::CRLF;
			// adding attachements
			foreach ($this->files as $name=>$file) {
				$message[] = "--$boundary";
				// declaring each attachement
				$message[] = "Content-type: " . $file['type'] . "; name=\"$name\"";
				$message[] = "Content-Transfer-Encoding: base64";
				$message[] = "Content-Disposition: attachement; filename=\"$name\"";
				$message[] = chunk_split(base64_encode(file_get_contents($file['tmp_name'])));
				$message[] = self::CRLF; // ?????????
				//$message[] = "--$boundary";
			}
			$message = implode(self::CRLF, $message) . "--$boundary--";
		}
		
		// Sending
		$check = false;
		if ($this->fromAddress) {
			//var_dump(__line__, $toLine, $this->strSubject, $message, $header);
			$check = mail($toLine, $this->strSubject, $message, $header);
		}
		return $check;
	}
?>
A voir également:

2 réponses

nicelife90 Messages postés 615 Date d'inscription vendredi 24 septembre 2010 Statut Membre Dernière intervention 10 avril 2018 151
22 juin 2016 à 21:33
Bonjour,

Pourquoi tu veux réinventer la roue, je te conseil d'utiliser une librairie simple du genre PHPMailer.

https://github.com/PHPMailer/PHPMailer


1
moimp Messages postés 3 Date d'inscription lundi 26 mars 2012 Statut Membre Dernière intervention 25 juin 2016
23 juin 2016 à 09:01
Pourquoi réinventer la roue?
Tout d'abord parce que je ne suis pas encore un expert en php et il me paraît plus pédagogique d'apprendre à faire que de consommer.
Ensuite, dans la pléthore des outils je ne savais pas lequel choisir.
Dans les features de PHPMailer, l'envoi de pièces jointe n'est pas mentionné (par contre, on le voit dans les exemples)
Enfin, je n'ai jamais utilisé de librairies externes et je ne sais pas comment les intégrer.
0
nicelife90 Messages postés 615 Date d'inscription vendredi 24 septembre 2010 Statut Membre Dernière intervention 10 avril 2018 151
23 juin 2016 à 16:52
Bonjour,

Le meilleur moyen de gérer les librairie est d'utiliser un gestionnaire de dépendance. Personnellement j'aime bien Composer.

J'ai créé un projet d'exemple que vous pouvez trouver ici : https://github.com/nicelife90/Example-CCM

Ce projet intègre PHPMailer ainsi que Composer.
0
moimp Messages postés 3 Date d'inscription lundi 26 mars 2012 Statut Membre Dernière intervention 25 juin 2016 > nicelife90 Messages postés 615 Date d'inscription vendredi 24 septembre 2010 Statut Membre Dernière intervention 10 avril 2018
25 juin 2016 à 18:44
J'ai installé et testé une configuration minimale avec:
- phpmailer
- smtp
- pop3
- phpmailer.lang-fr
- test
J'ai configuré le test avec les données de ma messagerie et tout fonctionne en local (wampserver).
J'ai aussi essayé de ne rien configurer pour la partie smtp et tout fonctionne aussi sauf un message de retour mail delivery system avec le message "said: 501 Syntax error - line too long".
Le but de cette non-configuration est de voir comment adapter la configuration pour un hébergement mutualisé dont je ne connais pas les paramètres SMTP.
Si l'absence de configuration SMTP fonctionne en local, elle devrait aussi fonctionner sur l'hébergement mutualisé, avec l'inconvénient de cette non-distribution (mail delivery system).
0