Bonjour,

Je crée une classe d'envoi mail basée sur le tuto Envoyer un e-mail en PHP de Weaponsb.

Mon code comprend une méthode sending(), laquelle est scindée en deux parties avec une condition qui distingue si j'ai ou non des pièces jointes.

En l'absence de pièces jointes, tout fonctionne parfaitement.

Avec des pièces jointes, le message arrive dans les spams et a vraiment une sale tête.

Voici le code de la méthode d'envoi:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
<?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 = [];
			foreach ($this->files as $key=>$value) {
				$attachements[$key] = $this->attachement($value['tmp_name']);
			}
		}
 
		// 'Boundary' fixing
		$boundary = "-----=".md5(rand()); // Sert à séparer les différentes parties du courriel
		$boundaryAlt= "-----=".md5(rand()); // Sert à séparer les différentes parties de la partie texte
 
		// 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[] = 'MIME-Version: 1.0';
		$headers[] = $attached ? 'Content-Type: multipart/mixed;' : 'Content-Type: multipart/alternative;';
		$headers[] = " boundary=\"$boundary\"";
		$header = implode(self::CRLF, $headers) . self::CRLF;
 
		// Message body
		if (! $attached) {
			// opening
			$message = [];
			$message[] = self::CRLF . "--" . $boundary;
			// adding plain text
			$message[] = "Content-Type: text/plain; charset=\"ISO-8859-1\"";
			$message[] = "Content-Transfer-Encoding: 8bit";
			$message[] = self::CRLF . $this->plainText;
			// boundary
			$message[] = self::CRLF . "--" . $boundary;
			// adding html text
			$message[] = "Content-Type: text/html; charset=\"ISO-8859-1\"";
			$message[] = "Content-Transfer-Encoding: 8bit";
			$message[] = self::CRLF . $this->htmlText;
			// Boundaries double closing (one for each message format)
			$message[] = self::CRLF . "--" . $boundary;
			$message[] = self::CRLF . "--" . $boundary;
			$message = implode(self::CRLF, $message);
		}
		else {
			// opening
			$message = [];
			$message[] = self::CRLF . "--" . $boundary;
			$message[] = 'Content-Type: multipart/alternative;';
			$message[] = "boundary=\"$boundaryAlt\"";
			$message[] = self::CRLF . "--" . $boundaryAlt;
			// adding plain text
			$message[] = "Content-Type: text/plain; charset=\"ISO-8859-1\"";
			$message[] = "Content-Transfer-Encoding: 8bit";
			$message[] = self::CRLF . $this->plainText;
			// boundary
			$message[] = self::CRLF . "--" . $boundaryAlt;
			// adding html text
			$message[] = "Content-Type: text/html; charset=\"ISO-8859-1\"";
			$message[] = "Content-Transfer-Encoding: 8bit";
			$message[] = self::CRLF . $this->htmlText;
			// closing alternative boundary
			$message[] = self::CRLF . "--" . $boundaryAlt;
			// adding attachements
			foreach ($this->files as $name=>$file) {
				// opening main boundary
				$message[] = self::CRLF . "--" . $boundary;
				// declaring each attachement
				$message[] = "Content-type: " . $file['type'] . "; name=\"$name\"";
				$message[] = "Content-Transfer-Encoding: base64";
				$message[] = "Content-Disposition: attachement; filename=\"$name\"";
				$message[] = self::CRLF . $attachements[$name] . self::CRLF;
			}
			// closing main boundary
			$message[] = self::CRLF . "--" . $boundary . "--";
 
			$message = implode(self::CRLF, $message);
		}
 
		// Debugging
		//var_dump(__method__, $message);
		//$test = $toLine."\n\n".$this->strSubject."\n\n".$message."\n\n".$header;
		//file_put_contents('_test.txt', $test);
 
		// Sending
		$check = false;
		if ($this->fromAddress) {
			//var_dump($toLine, $this->strSubject, $message, $header);
			$check = mail($toLine, $this->strSubject, $message, $header);
		}
		return $check;
	}
?>
Et le codes des méthodes annexes:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
	private function attachement($tmpName) {
		$file = fopen($tmpName, "r");   //on ouvre le fichier en lecture seule.
		$attachement = fread($file, filesize($tmpName)); //on lit l'ensemble du fichier avec la fonction fread.
		fclose($file); //on ferme le fichier.
		return chunk_split(base64_encode($attachement));
	}
 
	public function add_file(array $file) {
		if ($file['error'] != UPLOAD_ERR_OK) throw new InvalidArgumentException(sprintf("Méthod %s&nbsp;: The input file has an error", __METHOD__));
		$name = $file['name'];
		$this->files[$name]['tmp_name'] = $file['tmp_name'];
		$this->files[$name]['type'] = $file['type'];
	}
?>
Et le texte du message reçu:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
-------=e624d754286d0aac962f185f1a21809e
Content-Type: text/plain; charset="ISO-8859-1"
Content-Transfer-Encoding: 8bit
 
 
 
-------=e624d754286d0aac962f185f1a21809e
Content-Type: text/html; charset="ISO-8859-1"
Content-Transfer-Encoding: 8bit
 
<html><head></head><body></body></html>
 
-------=e624d754286d0aac962f185f1a21809e
 
-------=15ef9d499850bb871944e0b52083173a
Content-type: image/jpeg; name="DSCN0796.JPG"
Content-Transfer-Encoding: base64
Content-Disposition: attachement; filename="DSCN0796.JPG"
 
/9j/4ZpFRXhpZgAASUkqAAgAAAALAA4BAgAgAAAAkgAAAA8BAgAGAAAAsgAAABABAgAOAAAAuAAA
ABIBAwABAAAAAQAAABoBBQABAAAAxgAAABsBBQABAAAAzgAAACgBAwABAAAAAgAAADEBAgAgAAAA
1gAAADIBAgAUAAAA9gAAABMCAwABAAAAAgAAAGmHBAABAAAACgEAAJIDAAAgICAgICAgICAgICAg
 
...
 
Uf/xOv8AAOPgAwDovf8e4S9DAOktIADhoBAC4aCJQOWfMrTh2P//////////////////////////
//////f/////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
//////f/////////////////////////////////////////////////////////////////////
 
...
 
IHQCo8pFcbmfGfyrWLJ0uf/Z
 
 
 
-------=15ef9d499850bb871944e0b52083173a--
Dans le cas de pièce(s) jointe(s), j'aimerais comprendre pourquoi le fonctionnement n'est pas correct(classement dans les spams, affichage incorrect)
Merci pour votre aide