Magento 2: отправка электронной почты программно

24

Имеет ли Magento 2 встроенную интеграцию со сторонними системами доставки электронной почты транзакций, такими как Amazon SES, Mandrill и т. Д., Или же встроенная функциональность электронной почты по-прежнему основана на mailфункции PHP ? Или письма отправлены с какой-то третьей вещью?

Если ответ mailтаков, есть ли сторонние расширения, такие как SMTPPro для Magento 2, которые позволят разработчику заменить стандартную систему электронной почты?

Алан Сторм
источник

Ответы:

13

Я начал искать в базе кода Magento 2 строки, такие как «электронная почта», «сообщение» и т. Д., Пока не нашел что-то, что отправляет электронное письмо. Я наткнулся на sendPaymentFailedEmail () в vendor/magento/module-checkout/Helper/Data.php. Это устанавливает множество переменных, но в конечном итоге связывает их с транспортным объектом, который создается через «transportBuilder». Этот transportBuilder является экземпляром \Magento\Framework\Mail\Template\TransportBuilder.

В этом файле существует $transportпеременная, которая является экземпляром \Magento\Framework\Mail\TransportInterface. Поскольку существует интерфейс, существует также обычный класс с именем \Magento\Framework\Mail\Transport. Когда мы открываем файл vendor/magento/framework/Mail/Transport.php, мы видим, что это расширяет Zend_Mail_Transport_Sendmail;

Транспортный класс extends \ Zend_Mail_Transport_Sendmail внедряет \ Magento \ Framework \ Mail \ TransportInterface

Это то, что вы ищете. Используя DI, вы сможете заменить этот транспорт другой структурой электронной почты вместо Zend_Mail, такой как Mandrill или Amazon SES.

Просто обязательно включите send()метод, так как это метод, вызываемый в sendMessage();

public function sendMessage()
{
    try {
        parent::send($this->_message);
    } catch (\Exception $e) {
        throw new \Magento\Framework\Exception\MailException(new \Magento\Framework\Phrase($e->getMessage()), $e);
    }
}
Питер Яап Блакмер
источник
12

Magento 2 TransportBuilderиспользует шаблоны электронной почты для составления тела электронной почты. Самый простой способ, который я нашел для отправки простого текста - использование Zend_Mail(которое используется самим Magento 2):

$email = new \Zend_Mail();
$email->setSubject("Feedback email");
$email->setBodyText($body);
$email->setFrom($from, $nameFrom);
$email->addTo($to, $nameTo);
$email->send();
Алекс Гусев
источник
3
Если вы хотите отправить тело в виде HTML, вы можете использовать$email->setBodyHtml($body)
Аниш Карим
это здорово, однако, если вы используете SMTP через что-то вроде Google, то следуйте этой теме stackoverflow.com/questions/3455674/…
Ahdee
Я пробовал это на Magento, но получаю сообщение об ошибке. Неустранимая ошибка: Неустранимая ошибка: Uncaught Ошибка: Класс 'Zend_Mail' не найден в /srv/public_html/pub/test.php
K
@NagarajuK, ты включил автозагрузчик композитора в свой /srv/public_html/pub/test.php?
Алексей Гусев
Нет @AlexGusev, можете ли вы рассказать мне, как добавить автозагрузчик композитора в мой файл test.php?
Нагараджу К
8

часто делается предположение о том, что PHP mail()устарел и не поддерживает 3-й. партийные услуги.
Это на самом деле неправильно, как и каждый хороший 3-й. Служба party поддерживает SMTP-интерфейс, и так же mail().

Amazon SES поддерживает SMTP.

и отправка через SMTP с mail()описана в этом ответе: /programming//a/14457410/716029

Flyingmana
источник
1
+1 за полезную информацию - но я все еще интересуюсь тем, что есть, если есть, абстракции Magento для поддержки различных электронных писем через HTTP-сервисы.
Алан Шторм
К сожалению, никаких конкретных реализаций кроме Zend_Mail нет.
Питер Яап Блаакмир
-1

Magento 2 Использует класс \ Magento \ Framework \ Mail \ Template \ TransportBuilder для отправки пользовательских писем.

Вам нужно создать простой модуль и установить файл email_tempaltes.xml для определения шаблонов почтовых транзакций.

Вы можете отправлять почту из области Adminhtml или Frontend Scope.

Я поделился ссылкой для пошагового руководства по отправке пользовательских писем из Magento 2 с помощью модуля.

Отправить пользовательскую почту из модуля Magento 2

Ракеш Джесадия
источник