diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..fb3fed3 Binary files /dev/null and b/.DS_Store differ diff --git a/Mail/Template/TransportBuilder.php b/Mail/Template/TransportBuilder.php index a303a5e..6e66317 100644 --- a/Mail/Template/TransportBuilder.php +++ b/Mail/Template/TransportBuilder.php @@ -1,36 +1,390 @@ templateFactory = $templateFactory; + $this->objectManager = $objectManager; + $this->_senderResolver = $senderResolver; + $this->mailTransportFactory = $mailTransportFactory; + $this->emailMessageInterfaceFactory = $emailMessageInterfaceFactory ?: $this->objectManager + ->get(EmailMessageInterfaceFactory::class); + $this->mimeMessageInterfaceFactory = $mimeMessageInterfaceFactory ?: $this->objectManager + ->get(MimeMessageInterfaceFactory::class); + $this->mimePartInterfaceFactory = $mimePartInterfaceFactory ?: $this->objectManager + ->get(MimePartInterfaceFactory::class); + $this->addressConverter = $addressConverter ?: $this->objectManager + ->get(AddressConverter::class); + $this->partFactory = $objectManager->get(PartFactory::class); + } + + /** + * Add cc address + * + * @param array|string $address + * @param string $name * * @return $this */ - public function addAttachment( - $body, - $mimeType = Zend_Mime::TYPE_OCTETSTREAM, - $disposition = Zend_Mime::DISPOSITION_ATTACHMENT, - $encoding = Zend_Mime::ENCODING_BASE64, - $filename = null - ) { - $this->message->createAttachment($body, $mimeType, $disposition, $encoding, $filename); + public function addCc($address, $name = '') + { + $this->addAddressByType('cc', $address, $name); + + return $this; + } + + /** + * Add to address + * + * @param array|string $address + * @param string $name + * + * @return $this + * @throws InvalidArgumentException + */ + public function addTo($address, $name = '') + { + $this->addAddressByType('to', $address, $name); + + return $this; + } + + /** + * Add bcc address + * + * @param array|string $address + * + * @return $this + * @throws InvalidArgumentException + */ + public function addBcc($address) + { + $this->addAddressByType('bcc', $address); + + return $this; + } + + /** + * Set Reply-To Header + * + * @param string $email + * @param string|null $name + * + * @return $this + * @throws InvalidArgumentException + */ + public function setReplyTo($email, $name = null) + { + $this->addAddressByType('replyTo', $email, $name); + + return $this; + } + + /** + * Set mail from address + * + * @param string|array $from + * + * @return $this + * @throws InvalidArgumentException + * @see setFromByScope() + * + * @deprecated 102.0.1 This function sets the from address but does not provide + * a way of setting the correct from addresses based on the scope. + */ + public function setFrom($from) + { + return $this->setFromByScope($from); + } + + /** + * Set mail from address by scopeId + * + * @param string|array $from + * @param string|int $scopeId + * + * @return $this + * @throws InvalidArgumentException + * @throws MailException + * @since 102.0.1 + */ + public function setFromByScope($from, $scopeId = null) + { + $result = $this->_senderResolver->resolve($from, $scopeId); + $this->addAddressByType('from', $result['email'], $result['name']); return $this; } -} \ No newline at end of file + /** + * Set template identifier + * + * @param string $templateIdentifier + * + * @return $this + */ + public function setTemplateIdentifier($templateIdentifier) + { + $this->templateIdentifier = $templateIdentifier; + + return $this; + } + + /** + * Set template model + * + * @param string $templateModel + * + * @return $this + */ + public function setTemplateModel($templateModel) + { + $this->templateModel = $templateModel; + return $this; + } + + /** + * Set template vars + * + * @param array $templateVars + * + * @return $this + */ + public function setTemplateVars($templateVars) + { + $this->templateVars = $templateVars; + + return $this; + } + + /** + * Set template options + * + * @param array $templateOptions + * @return $this + */ + public function setTemplateOptions($templateOptions) + { + $this->templateOptions = $templateOptions; + + return $this; + } + + /** + * Get mail transport + * + * @return TransportInterface + * @throws LocalizedException + */ + public function getTransport() + { + try { + $this->prepareMessage(); + $mailTransport = $this->mailTransportFactory->create(['message' => clone $this->message]); + } finally { + $this->reset(); + } + + return $mailTransport; + } + + /** + * Reset object state + * + * @return $this + */ + protected function reset() + { + $this->messageData = []; + $this->templateIdentifier = null; + $this->templateVars = null; + $this->templateOptions = null; + return $this; + } + + /** + * Get template + * + * @return TemplateInterface + */ + protected function getTemplate() + { + return $this->templateFactory->get($this->templateIdentifier, $this->templateModel) + ->setVars($this->templateVars) + ->setOptions($this->templateOptions); + } + + /** + * Prepare message. + * + * @return $this + * @throws LocalizedException if template type is unknown + */ + protected function prepareMessage() + { + $template = $this->getTemplate(); + $content = $template->processTemplate(); + switch ($template->getType()) { + case TemplateTypesInterface::TYPE_TEXT: + $part['type'] = MimeInterface::TYPE_TEXT; + break; + + case TemplateTypesInterface::TYPE_HTML: + $part['type'] = MimeInterface::TYPE_HTML; + break; + + default: + throw new LocalizedException( + new Phrase('Unknown template type') + ); + } + $mimePart = $this->mimePartInterfaceFactory->create(['content' => $content]); + $parts = count($this->attachments) ? array_merge([$mimePart], $this->attachments) : [$mimePart]; + $this->messageData['body'] = $this->mimeMessageInterfaceFactory->create( + ['parts' => $parts] + ); + + $this->messageData['subject'] = html_entity_decode( + (string)$template->getSubject(), + ENT_QUOTES + ); + $this->message = $this->emailMessageInterfaceFactory->create($this->messageData); + + return $this; + } + + /** + * Handles possible incoming types of email (string or array) + * + * @param string $addressType + * @param string|array $email + * @param string|null $name + * + * @return void + * @throws InvalidArgumentException + */ + private function addAddressByType(string $addressType, $email, ?string $name = null): void + { + if (is_string($email)) { + $this->messageData[$addressType][] = $this->addressConverter->convert($email, $name); + return; + } + $convertedAddressArray = $this->addressConverter->convertMany($email); + if (isset($this->messageData[$addressType])) { + $this->messageData[$addressType] = array_merge( + $this->messageData[$addressType], + $convertedAddressArray + ); + } + } + + /** + * @param string|null $content + * @param string|null $fileName + * @param string|null $fileType + * @return TransportBuilder + */ + public function addAttachment(?string $content, ?string $fileName, ?string $fileType) + { + $attachmentPart = $this->partFactory->create(); + $attachmentPart->setContent($content) + ->setType($fileType) + ->setFileName($fileName) + ->setDisposition(Mime::DISPOSITION_ATTACHMENT) + ->setEncoding(Mime::ENCODING_BASE64); + $this->attachments[] = $attachmentPart; + + return $this; + } +} diff --git a/README.md b/README.md index bd19cdb..a204f06 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ class Index extends Action public function execute() { // Any buffer - $body = ''; + $content = ''; $transport = $this->transportBuilder->setTemplateIdentifier('example_identifier') ->setTemplateOptions([ @@ -52,12 +52,7 @@ class Index extends Action 'email' => 'info@example.com', ]) ->addTo('example@example.com') - ->addAttachment($body, - Zend_Mime::TYPE_OCTETSTREAM, - Zend_Mime::DISPOSITION_ATTACHMENT, - Zend_Mime::ENCODING_BASE64, - 'document.pdf' - ); + ->addAttachment($content, 'document.pdf', 'application/pdf'); $transport = $transport->getTransport(); $transport->sendMessage(); @@ -70,11 +65,9 @@ class Index extends Action ## Api `public function addAttachment( - $body, - $mimeType = Zend_Mime::TYPE_OCTETSTREAM, - $disposition = Zend_Mime::DISPOSITION_ATTACHMENT, - $encoding = Zend_Mime::ENCODING_BASE64, - $filename = null + $content, + $fileName = '', + $fileType = '' )` For reference also check [the code](Mail/Template/TransportBuilder.php) diff --git a/composer.json b/composer.json index 3a3cbfa..4dd6486 100644 --- a/composer.json +++ b/composer.json @@ -4,12 +4,16 @@ "type": "magento2-module", "authors": [ { - "email": "dwayne@weprovide.com", - "name": "Dwayne Hanekamp" + "email": "sander@weprovide.com", + "name": "Sander Hartman" } ], "license": "MIT", "minimum-stability": "stable", + "require": { + "php": "~7.1.3|~7.2.0", + "magento/framework": "~102.0.3" + }, "autoload": { "psr-4": { "WeProvide\\MailAttachment\\": "" diff --git a/etc/di.xml b/etc/di.xml new file mode 100644 index 0000000..92d41c8 --- /dev/null +++ b/etc/di.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/etc/module.xml b/etc/module.xml index 59c5687..0cd87be 100644 --- a/etc/module.xml +++ b/etc/module.xml @@ -1,4 +1,4 @@ - - \ No newline at end of file + +