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
101
102
103
104
105
106
107
108
109
110
111
112
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Magento\Email\Model;
use Magento\Framework\App\Config\ScopeConfigInterface;
use Magento\Framework\Exception\MailException;
use Magento\Framework\Mail\MessageInterface;
use Magento\Framework\Mail\TransportInterface;
use Magento\Framework\Phrase;
use Magento\Store\Model\ScopeInterface;
use Zend\Mail\Message;
use Zend\Mail\Transport\Sendmail;
/**
* Class that responsible for filling some message data before transporting it.
* @see \Zend\Mail\Transport\Sendmail is used for transport
*/
class Transport implements TransportInterface
{
/**
* Configuration path to source of Return-Path and whether it should be set at all
* @see \Magento\Config\Model\Config\Source\Yesnocustom to possible values
*/
const XML_PATH_SENDING_SET_RETURN_PATH = 'system/smtp/set_return_path';
/**
* Configuration path for custom Return-Path email
*/
const XML_PATH_SENDING_RETURN_PATH_EMAIL = 'system/smtp/return_path_email';
/**
* Whether return path should be set or no.
*
* Possible values are:
* 0 - no
* 1 - yes (set value as FROM address)
* 2 - use custom value
*
* @var int
*/
private $isSetReturnPath;
/**
* @var string|null
*/
private $returnPathValue;
/**
* @var Sendmail
*/
private $zendTransport;
/**
* @var MessageInterface
*/
private $message;
/**
* @param MessageInterface $message Email message object
* @param ScopeConfigInterface $scopeConfig Core store config
* @param null|string|array|\Traversable $parameters Config options for sendmail parameters
*/
public function __construct(
MessageInterface $message,
ScopeConfigInterface $scopeConfig,
$parameters = null
) {
$this->isSetReturnPath = (int) $scopeConfig->getValue(
self::XML_PATH_SENDING_SET_RETURN_PATH,
ScopeInterface::SCOPE_STORE
);
$this->returnPathValue = $scopeConfig->getValue(
self::XML_PATH_SENDING_RETURN_PATH_EMAIL,
ScopeInterface::SCOPE_STORE
);
$this->zendTransport = new Sendmail($parameters);
$this->message = $message;
}
/**
* @inheritdoc
*/
public function sendMessage()
{
try {
$zendMessage = Message::fromString($this->message->getRawMessage())->setEncoding('utf-8');
if (2 === $this->isSetReturnPath && $this->returnPathValue) {
$zendMessage->setSender($this->returnPathValue);
} elseif (1 === $this->isSetReturnPath && $zendMessage->getFrom()->count()) {
$fromAddressList = $zendMessage->getFrom();
$fromAddressList->rewind();
$zendMessage->setSender($fromAddressList->current()->getEmail());
}
$this->zendTransport->send($zendMessage);
} catch (\Exception $e) {
throw new MailException(new Phrase($e->getMessage()), $e);
}
}
/**
* @inheritdoc
*/
public function getMessage()
{
return $this->message;
}
}