Open Monograph Press  3.3.0
MessageConverter.php
1 <?php
2 
3 /*
4  * This file is part of the Symfony package.
5  *
6  * (c) Fabien Potencier <fabien@symfony.com>
7  *
8  * For the full copyright and license information, please view the LICENSE
9  * file that was distributed with this source code.
10  */
11 
12 namespace Symfony\Component\Mime;
13 
20 
24 final class MessageConverter
25 {
29  public static function toEmail(Message $message): Email
30  {
31  if ($message instanceof Email) {
32  return $message;
33  }
34 
35  // try to convert to a "simple" Email instance
36  $body = $message->getBody();
37  if ($body instanceof TextPart) {
38  return self::createEmailFromTextPart($message, $body);
39  }
40 
41  if ($body instanceof AlternativePart) {
42  return self::createEmailFromAlternativePart($message, $body);
43  }
44 
45  if ($body instanceof RelatedPart) {
46  return self::createEmailFromRelatedPart($message, $body);
47  }
48 
49  if ($body instanceof MixedPart) {
50  $parts = $body->getParts();
51  if ($parts[0] instanceof RelatedPart) {
52  $email = self::createEmailFromRelatedPart($message, $parts[0]);
53  } elseif ($parts[0] instanceof AlternativePart) {
54  $email = self::createEmailFromAlternativePart($message, $parts[0]);
55  } elseif ($parts[0] instanceof TextPart) {
56  $email = self::createEmailFromTextPart($message, $parts[0]);
57  } else {
58  throw new RuntimeException(sprintf('Unable to create an Email from an instance of "%s" as the body is too complex.', \get_class($message)));
59  }
60 
61  return self::attachParts($email, \array_slice($parts, 1));
62  }
63 
64  throw new RuntimeException(sprintf('Unable to create an Email from an instance of "%s" as the body is too complex.', \get_class($message)));
65  }
66 
67  private static function createEmailFromTextPart(Message $message, TextPart $part): Email
68  {
69  if ('text' === $part->getMediaType() && 'plain' === $part->getMediaSubtype()) {
70  return (new Email(clone $message->getHeaders()))->text($part->getBody(), $part->getPreparedHeaders()->getHeaderParameter('Content-Type', 'charset') ?: 'utf-8');
71  }
72  if ('text' === $part->getMediaType() && 'html' === $part->getMediaSubtype()) {
73  return (new Email(clone $message->getHeaders()))->html($part->getBody(), $part->getPreparedHeaders()->getHeaderParameter('Content-Type', 'charset') ?: 'utf-8');
74  }
75 
76  throw new RuntimeException(sprintf('Unable to create an Email from an instance of "%s" as the body is too complex.', \get_class($message)));
77  }
78 
79  private static function createEmailFromAlternativePart(Message $message, AlternativePart $part): Email
80  {
81  $parts = $part->getParts();
82  if (
83  2 === \count($parts) &&
84  $parts[0] instanceof TextPart && 'text' === $parts[0]->getMediaType() && 'plain' === $parts[0]->getMediaSubtype() &&
85  $parts[1] instanceof TextPart && 'text' === $parts[1]->getMediaType() && 'html' === $parts[1]->getMediaSubtype()
86  ) {
87  return (new Email(clone $message->getHeaders()))
88  ->text($parts[0]->getBody(), $parts[0]->getPreparedHeaders()->getHeaderParameter('Content-Type', 'charset') ?: 'utf-8')
89  ->html($parts[1]->getBody(), $parts[1]->getPreparedHeaders()->getHeaderParameter('Content-Type', 'charset') ?: 'utf-8')
90  ;
91  }
92 
93  throw new RuntimeException(sprintf('Unable to create an Email from an instance of "%s" as the body is too complex.', \get_class($message)));
94  }
95 
96  private static function createEmailFromRelatedPart(Message $message, RelatedPart $part): Email
97  {
98  $parts = $part->getParts();
99  if ($parts[0] instanceof AlternativePart) {
100  $email = self::createEmailFromAlternativePart($message, $parts[0]);
101  } elseif ($parts[0] instanceof TextPart) {
102  $email = self::createEmailFromTextPart($message, $parts[0]);
103  } else {
104  throw new RuntimeException(sprintf('Unable to create an Email from an instance of "%s" as the body is too complex.', \get_class($message)));
105  }
106 
107  return self::attachParts($email, \array_slice($parts, 1));
108  }
109 
110  private static function attachParts(Email $email, array $parts): Email
111  {
112  foreach ($parts as $part) {
113  if (!$part instanceof DataPart) {
114  throw new RuntimeException(sprintf('Unable to create an Email from an instance of "%s" as the body is too complex.', \get_class($email)));
115  }
116 
117  $headers = $part->getPreparedHeaders();
118  $method = 'inline' === $headers->getHeaderBody('Content-Disposition') ? 'embed' : 'attach';
119  $name = $headers->getHeaderParameter('Content-Disposition', 'filename');
120  $email->$method($part->getBody(), $name, $part->getMediaType().'/'.$part->getMediaSubtype());
121  }
122 
123  return $email;
124  }
125 }
Symfony\Component\Mime\Part\Multipart\MixedPart
Definition: MixedPart.php:19
Symfony\Component\Mime\Part\TextPart\getPreparedHeaders
getPreparedHeaders()
Definition: TextPart.php:124
Symfony\Component\Mime\Email
Definition: Email.php:25
Symfony\Component\Mime\Exception\RuntimeException
Definition: vendor/symfony/mime/Exception/RuntimeException.php:17
Symfony\Component\Mime
Definition: Address.php:12
Symfony\Component\Mime\Part\TextPart\getMediaType
getMediaType()
Definition: TextPart.php:60
Symfony\Component\Mime\Part\DataPart
Definition: DataPart.php:21
Symfony\Component\Mime\Message
Definition: Message.php:22
Symfony\Component\Mime\Part\TextPart
Definition: TextPart.php:24
Symfony\Component\Mime\Email\text
text($body, string $charset='utf-8')
Definition: Email.php:279
Symfony\Component\Mime\Message\getBody
getBody()
Definition: Message.php:52
Symfony\Component\Mime\Part\Multipart\RelatedPart
Definition: RelatedPart.php:20
Symfony\Component\Mime\MessageConverter
Definition: MessageConverter.php:24
Symfony\Component\Mime\MessageConverter\toEmail
static toEmail(Message $message)
Definition: MessageConverter.php:29
Symfony\Component\Mime\Part\TextPart\getMediaSubtype
getMediaSubtype()
Definition: TextPart.php:65
Symfony\Component\Mime\Part\TextPart\getBody
getBody()
Definition: TextPart.php:94
Symfony\Component\Mime\Message\getHeaders
getHeaders()
Definition: Message.php:67
Symfony\Component\Mime\Part\Multipart\AlternativePart
Definition: AlternativePart.php:19