Magento 2: Enviando Email Programaticamente

24

O Magento 2 tem alguma integração embutida com sistemas de entrega de email de transação de terceiros, como Amazon SES, Mandrill, etc., ou a funcionalidade de email embutida ainda se baseia na mailfunção do PHP ? Ou os emails são enviados com alguma terceira coisa?

Se a resposta for mail: existem extensões de terceiros como o SMTPPro for Magento 2 que permitiriam que um desenvolvedor substituísse o sistema de email padrão?

Alan Storm
fonte

Respostas:

13

Comecei a pesquisar na base de código do Magento 2 por strings como 'email', 'message', etc. até encontrar algo que envia um email. Eu tropecei em sendPaymentFailedEmail () em vendor/magento/module-checkout/Helper/Data.php. Isso define muitas variáveis, mas eventualmente as vincula a um objeto de transporte, criado por meio de um 'transportBuilder'. Este transportBuilder é uma instância de \Magento\Framework\Mail\Template\TransportBuilder.

Nesse arquivo, $transportexiste uma variável, que é uma instância de \Magento\Framework\Mail\TransportInterface. Como existe uma interface, também há uma classe regular chamada \Magento\Framework\Mail\Transport. Quando abrimos o arquivo vendor/magento/framework/Mail/Transport.php, vemos que isso estende o Zend_Mail_Transport_Sendmail;

classe Transport estende \ Zend_Mail_Transport_Sendmail implementa \ Magento \ Framework \ Mail \ TransportInterface

Isto é o que você está procurando. Usando o DI, você poderá substituir esse transporte por outra estrutura de email em vez do Zend_Mail, como Mandrill ou Amazon SES.

Apenas certifique-se de incluir o send()método, pois esse é o método chamado 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);
    }
}
Peter Jaap Blaakmeer
fonte
12

O Magento 2 TransportBuilderusa modelos de email para compor o corpo do email. A maneira mais simples que encontrei para enviar texto simples - use Zend_Mail(que é usado pelo próprio Magento 2):

$email = new \Zend_Mail();
$email->setSubject("Feedback email");
$email->setBodyText($body);
$email->setFrom($from, $nameFrom);
$email->addTo($to, $nameTo);
$email->send();
Alex Gusev
fonte
3
Se você quiser enviar o corpo em forma de html, você pode usar$email->setBodyHtml($body)
Anish Karim
isso é ótimo, no entanto, no caso de você estiver usando SMTP via algo como o Google, em seguida, siga esta discussão stackoverflow.com/questions/3455674/...
Ahdee
Eu tentei isso no Magento, mas obtendo um erro Erro fatal: Erro fatal: Erro não capturado: A classe 'Zend_Mail' não foi encontrada em /srv/public_html/pub/test.php
Nagaraju K
@ NagarajuK, você incluiu o carregador automático do compositor no seu /srv/public_html/pub/test.php?
Alex Gusev
Não, o @AlexGusev pode me orientar sobre como adicionar o carregador automático do compositor no meu arquivo test.php?
Nagaraju K 03/12
8

existe uma suposição frequente de que os PHPs estão mail()desatualizados e não suportam nenhum terceiro. serviços de festas.
Isso está realmente errado, como todo bom terceiro. O serviço de terceiros suporta uma interface SMTP, e o mesmo acontece mail().

O Amazon SES suporta SMTP.

e envio via SMTP com mail()está descrito nesta resposta: /programming//a/14457410/716029

Flyingmana
fonte
11
+1 para obter informações úteis - mas ainda estou interessado em quais abstrações, se houver, o Magento tem para oferecer suporte a vários emails por meio de serviços HTTP.
Alan Storm
Infelizmente, nenhuma implementação específica além do Zend_Mail.
Peter Jaap Blaakmeer
-1

Magento 2 Usa a classe \ Magento \ Framework \ Mail \ Template \ TransportBuilder para enviar email personalizado.

Você precisa criar um módulo simples e configurar o arquivo email_tempaltes.xml para definir seus modelos de correio de transação.

Você pode enviar emails da área Adminhtml ou do escopo do front-end.

Compartilhei um link para o guia passo a passo para enviar um e-mail personalizado do Magento 2 usando um módulo.

Enviar correio personalizado do módulo Magento 2

Rakesh Jesadiya
fonte