Hoa central
Content.php
Go to the documentation of this file.
1 <?php
2 
37 namespace Hoa\Mail\Content;
38 
39 use Hoa\Core;
40 use Hoa\Mail;
41 
50 abstract class Content implements \ArrayAccess
51 {
57  protected $_headers = [];
58 
59 
60 
66  public function __construct()
67  {
68  $this['content-transfer-encoding'] = 'base64';
69  $this['content-disposition'] = 'inline';
70 
71  return;
72  }
73 
80  public function offsetExists($header)
81  {
82  $header = mb_strtolower($header);
83 
84  return true === array_key_exists($header, $this->_headers);
85  }
86 
93  public function offsetGet($header)
94  {
95  $header = mb_strtolower($header);
96 
97  if (false === $this->offsetExists($header)) {
98  return null;
99  }
100 
101  return $this->_headers[$header];
102  }
103 
111  public function offsetSet($header, $value)
112  {
113  $header = mb_strtolower($header);
114 
115  if (true === $this->offsetExists($header)) {
116  $old = $this->_headers[$header];
117  } else {
118  $old = null;
119  }
120 
121  if (0 !== preg_match('#[' . CRLF . ']#', $value)) {
122  throw new Mail\Exception\Security(
123  'Header ā€œ%sā€ contains illegal character.',
124  0,
125  $header
126  );
127  }
128 
129  $this->_headers[$header] = $value;
130 
131  return $old;
132  }
133 
140  public function offsetUnset($header)
141  {
142  $header = mb_strtolower($header);
143  unset($this->_headers[$header]);
144 
145  return;
146  }
147 
153  public function getHeaders()
154  {
155  return $this->_headers;
156  }
157 
163  abstract protected function _getContent();
164 
171  public function getFormattedContent($headers = true)
172  {
173  $out = null;
174 
175  if (true === $headers) {
176  $out .= static::formatHeaders($this->getHeaders()) . CRLF;
177  }
178 
179  $out .= $this->_getContent();
180 
181  return $out;
182  }
183 
192  public function getId()
193  {
194  if (!isset($this['content-id'])) {
195  $this['content-id'] = '<' . md5(uniqid()) . '*mail@hoa-project.net>';
196  }
197 
198  return trim($this['content-id'], '<>');
199  }
200 
207  public function getIdUrl()
208  {
209  return 'cid:' . $this->getId();
210  }
211 
218  public static function formatHeaders(Array $headers)
219  {
220  $out = null;
221 
222  foreach ($headers as $header => $value) {
223  $value = preg_replace_callback(
224  '#(?<value>[^<]+)(?<tail><[^>]+>)#',
225  function (Array $matches) {
226  return
227  Encoder\QuotedPrintable::encode($matches['value'], true) .
228  $matches['tail'];
229  },
230  $value
231  );
232 
233  $out .= $header . ': ' . $value . CRLF;
234  }
235 
236  return $out;
237  }
238 
248  public static function getAddress($contact)
249  {
250  if (0 !== preg_match('#[^<]*<(?<address>[^>]+)#', $contact, $match)) {
251  return $match['address'];
252  }
253 
254  return trim($contact);
255  }
256 
263  public static function getDomain($contact)
264  {
265  $address = static::getAddress($contact);
266 
267  if (false !== $pos = strpos($address, '@')) {
268  return substr($address, $pos + 1);
269  }
270 
271  return $address;
272  }
273 
280  public function __toString()
281  {
282  return $this->getFormattedContent();
283  }
284 }
285 
289 Core\Consistency::flexEntity('Hoa\Mail\Content\Content');
static getDomain($contact)
Definition: Content.php:263
static encode($string, $isHeaderValue=false)
static formatHeaders(Array $headers)
Definition: Content.php:218
getFormattedContent($headers=true)
Definition: Content.php:171
static getAddress($contact)
Definition: Content.php:248
offsetSet($header, $value)
Definition: Content.php:111