/day_20_third_party_validate_form_PDF/example_thitd_party/fuel/packages/email/classes/email/driver/mandrill.php

https://gitlab.com/cmtsheikeshadi/first_app_development_project · PHP · 352 lines · 199 code · 51 blank · 102 comment · 11 complexity · f10b53e802eced87e7d2b48919cc95fc MD5 · raw file

  1. <?php
  2. /**
  3. * Fuel
  4. *
  5. * Fuel is a fast, lightweight, community driven PHP5 framework.
  6. *
  7. * @package Fuel
  8. * @version 1.8
  9. * @author Fuel Development Team
  10. * @license MIT License
  11. * @copyright 2010 - 2016 Fuel Development Team
  12. * @link http://fuelphp.com
  13. */
  14. namespace Email;
  15. use Mandrill;
  16. use Mandrill_Messages;
  17. class Email_Driver_Mandrill extends \Email_Driver
  18. {
  19. /**
  20. * Global merge vars
  21. *
  22. * @var array
  23. */
  24. protected $merge_vars = array();
  25. /**
  26. * Recipient merge vars
  27. *
  28. * @var array
  29. */
  30. protected $rcpt_merge_vars = array();
  31. /**
  32. * Global metadata
  33. *
  34. * @var array
  35. */
  36. protected $metadata = array();
  37. /**
  38. * Recipient metadata
  39. *
  40. * @var array
  41. */
  42. protected $rcpt_metadata = array();
  43. /**
  44. * {@inheritdoc}
  45. */
  46. public function __construct(array $config)
  47. {
  48. // Mandrill wants header encoding to be switched off
  49. $config['encode_headers'] = false;
  50. parent::__construct($config);
  51. }
  52. /**
  53. * {@inheritdoc}
  54. */
  55. protected function _send()
  56. {
  57. $mandrill = new \Mandrill($this->config['mandrill']['key']);
  58. $message = new Mandrill_Messages($mandrill);
  59. $headers = $this->extra_headers;
  60. // Get recipients
  61. $to = $this->build_rcpt();
  62. $cc = $this->build_rcpt('cc');
  63. $bcc = $this->build_rcpt('bcc');
  64. $to = array_merge($bcc, $cc, $to);
  65. // Get recipient merge vars
  66. $merge_vars = array();
  67. foreach ($this->rcpt_merge_vars as $rcpt => $_merge_vars)
  68. {
  69. $merge_vars[] = array(
  70. 'rcpt' => $rcpt,
  71. 'vars' => \Arr::keyval_to_assoc($_merge_vars, 'name', 'content'),
  72. );
  73. }
  74. // Get recipient meta data
  75. $metadata = array();
  76. foreach ($this->rcpt_metadata as $rcpt => $_metadata)
  77. {
  78. $metadata[] = array(
  79. 'rcpt' => $rcpt,
  80. 'values' => $_metadata,
  81. );
  82. }
  83. // Get attachments
  84. $attachments = array();
  85. foreach ($this->attachments['attachment'] as $cid => $attachment)
  86. {
  87. $attachments[] = array(
  88. 'type' => $attachment['mime'],
  89. 'name' => $attachment['file'][1],
  90. 'content' => $attachment['contents'],
  91. );
  92. }
  93. // Get inline images
  94. $images = array();
  95. foreach ($this->attachments['inline'] as $cid => $attachment)
  96. {
  97. if (\Str::starts_with($attachment['mime'], 'image/'))
  98. {
  99. $name = substr($cid, 4); // remove cid:
  100. $images[] = array(
  101. 'type' => $attachment['mime'],
  102. 'name' => $name,
  103. 'content' => $attachment['contents'],
  104. );
  105. }
  106. }
  107. // Get reply-to addresses
  108. if ( ! empty($this->reply_to))
  109. {
  110. $headers['Reply-To'] = static::format_addresses($this->reply_to);
  111. }
  112. $important = false;
  113. if (in_array($this->config['priority'], array(\Email::P_HIGH, \Email::P_HIGHEST)))
  114. {
  115. $important = true;
  116. }
  117. $message_data = array(
  118. 'html' => $this->body,
  119. 'text' => isset($this->alt_body) ? $this->alt_body : '',
  120. 'subject' => $this->subject,
  121. 'from_email' => $this->config['from']['email'],
  122. 'from_name' => $this->config['from']['name'],
  123. 'to' => $to,
  124. 'headers' => $headers,
  125. 'global_merge_vars' => \Arr::keyval_to_assoc($this->merge_vars, 'name', 'content'),
  126. 'merge_vars' => $merge_vars,
  127. 'metadata' => $this->metadata,
  128. 'recipient_metadata' => $metadata,
  129. 'attachments' => $attachments,
  130. 'images' => $images,
  131. 'important' => $important,
  132. );
  133. $message_options = \Arr::filter_keys($this->get_config('mandrill.message_options', array()), array_keys($message_data), true);
  134. $message_data = \Arr::merge($message_data, $message_options);
  135. $send_options = extract($this->config['mandrill']['send_options'], EXTR_SKIP);
  136. $message->send($message_data, $async, $ip_pool, $send_at);
  137. return true;
  138. }
  139. /**
  140. * {@inheritdoc}
  141. */
  142. public function attach($file, $inline = false, $cid = null, $mime = null, $name = null)
  143. {
  144. parent::attach($file, $inline, $cid, $mime, $name);
  145. if ($inline === true)
  146. {
  147. // Check the last attachment
  148. $attachment = end($this->attachments['inline']);
  149. if ( ! \Str::starts_with($attachment['mime'], 'image/'))
  150. {
  151. throw new \InvalidAttachmentsException('Non-image inline attachments are not supported by this driver.');
  152. }
  153. }
  154. }
  155. /**
  156. * Add type to recipient list
  157. *
  158. * @param string $list to, cc, bcc
  159. * @return array
  160. */
  161. protected function build_rcpt($list = 'to')
  162. {
  163. return array_map(function ($item) use ($list)
  164. {
  165. $item['type'] = $list;
  166. return $item;
  167. }, $this->{$list});
  168. }
  169. /**
  170. * {@inheritdoc}
  171. */
  172. protected function clear_list($list)
  173. {
  174. is_array($list) or $list = array($list);
  175. foreach ($list as $_list)
  176. {
  177. $rcpt = array_keys($this->{$_list});
  178. \Arr::delete($this->rcpt_merge_vars, $rcpt);
  179. \Arr::delete($this->rcpt_metadata, $rcpt);
  180. }
  181. return parent::clear_list($list);
  182. }
  183. /**
  184. * Get merge vars
  185. *
  186. * @param mixed $key Null for all, string for specific
  187. * @param mixed $rcpt Null for global, string for recipient
  188. * @return array
  189. */
  190. public function get_merge_vars($key = null, $rcpt = null)
  191. {
  192. if (is_null($rcpt))
  193. {
  194. return \Arr::get($this->merge_vars, $key);
  195. }
  196. elseif (isset($this->rcpt_merge_vars[$rcpt]))
  197. {
  198. return \Arr::get($this->rcpt_merge_vars[$rcpt], $key);
  199. }
  200. }
  201. /**
  202. * Add merge vars
  203. *
  204. * @param array $merge_vars Key-value pairs
  205. * @param mixed $rcpt Null for global, string for recipient
  206. * @return array
  207. */
  208. public function add_merge_vars(array $merge_vars, $rcpt = null)
  209. {
  210. if (is_null($rcpt))
  211. {
  212. $this->merge_vars = $merge_vars;
  213. }
  214. else
  215. {
  216. $this->rcpt_merge_vars[$rcpt] = $merge_vars;
  217. }
  218. return $this;
  219. }
  220. /**
  221. * Set one or several merge vars
  222. *
  223. * @param mixed $key Array for many vars, string for one
  224. * @param mixed $value In case of many vars it is ommited
  225. * @param mixed $rcpt Null for global, string for recipient
  226. * @return object $this
  227. */
  228. public function set_merge_var($key, $value = null, $rcpt = null)
  229. {
  230. is_array($key) or $key = array($key => $value);
  231. if (is_null($rcpt))
  232. {
  233. $this->merge_vars = \Arr::merge($this->merge_vars, $key);
  234. }
  235. else
  236. {
  237. $merge_vars = \Arr::get($this->rcpt_merge_vars, $rcpt, array());
  238. $this->rcpt_merge_vars[$rcpt] = \Arr::merge($merge_vars, $key);
  239. }
  240. return $this;
  241. }
  242. /**
  243. * Get metadata
  244. *
  245. * @param mixed $key Null for all, string for specific
  246. * @param mixed $rcpt Null for global, string for recipient
  247. * @return array
  248. */
  249. public function get_metadata($key = null, $rcpt = null)
  250. {
  251. if (is_null($rcpt))
  252. {
  253. return \Arr::get($this->metadata, $key);
  254. }
  255. elseif (isset($this->rcpt_metadata[$rcpt]))
  256. {
  257. return \Arr::get($this->rcpt_metadata[$rcpt], $key);
  258. }
  259. }
  260. /**
  261. * Add metadata
  262. *
  263. * @param array $metadata Key-value pairs
  264. * @param mixed $rcpt Null for global, string for recipient
  265. * @return array
  266. */
  267. public function add_metadata(array $metadata, $rcpt = null)
  268. {
  269. if (is_null($rcpt))
  270. {
  271. $this->metadata = $metadata;
  272. }
  273. else
  274. {
  275. $this->rcpt_metadata[$rcpt] = $metadata;
  276. }
  277. return $this;
  278. }
  279. /**
  280. * Set one or several metadata
  281. *
  282. * @param mixed $key Array for many, string for one
  283. * @param mixed $value In case of many it is ommited
  284. * @param mixed $rcpt Null for global, string for recipient
  285. * @return object $this
  286. */
  287. public function set_metadata($key, $value = null, $rcpt = null)
  288. {
  289. is_array($key) or $key = array($key => $value);
  290. if (is_null($rcpt))
  291. {
  292. $this->metadata = \Arr::merge($this->metadata, $key);
  293. }
  294. else
  295. {
  296. $metadata = \Arr::get($this->rcpt_metadata, $rcpt, array());
  297. $this->rcpt_metadata[$rcpt] = \Arr::merge($metadata, $key);
  298. }
  299. return $this;
  300. }
  301. }