Buy Now

Magento 2- Send mail using your smtp server

Here we learn how to send mail  using our smtp detail in magento2

For this we need to override mageto \Magento\Framework\Mail\Transport class by your custom model class

We have a complete module for smtp setup. You can check here SMTP Configurator for Magento2 here.

We can do it in two step

1# For override we need to write code in module di.xml file at location app/code/NameSpace/ModuleName/etc

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <!-- for override magento default Transport class with our custom module model-->
    <preference for="\Magento\Framework\Mail\Transport" type="NameSpace\ModuleName\Model\Transport"/>
</config>

2# Now we’ll define our  Transport model in our custom module

<?php
/**
 * Mail Transport
 */
namespace NameSpace\ModuleName\Model;

class Transport extends \Zend_Mail_Transport_Smtp implements \Magento\Framework\Mail\TransportInterface
{
    /**
     * @var \Magento\Framework\Mail\MessageInterface
     */
    protected $_message;

    /**
     * @param MessageInterface $message
     * @param null $parameters
     * @throws \InvalidArgumentException
     */
    public function __construct(\Magento\Framework\Mail\MessageInterface $message)
    {
        if (!$message instanceof \Zend_Mail) {
            throw new \InvalidArgumentException('The message should be an instance of \Zend_Mail');
        }
         $smtpHost= 'xxx.xxxx.xxx';//your smtp host  ';
         $smtpConf = [
            'auth' => 'login',//auth type
            'tsl' => 'tsl', 
            'port' => '587',
            'username' => 'xxxx@xxxxx.xxx',//smtm user name
            'password' => 'xxxxxxxxxxxxxx'//smtppassword 
         ];

        parent::__construct($smtpHost, $smtpConf);
        $this->_message = $message;
    }

    /**
     * Send a mail using this transport
     * @return void
     * @throws \Magento\Framework\Exception\MailException
     */
    public function sendMessage()
    {
        try {
            parent::send($this->_message);
        } catch (\Exception $e) {
            throw new \Magento\Framework\Exception\MailException(new \Magento\Framework\Phrase($e->getMessage()), $e);
        }
    }
}

Now all mail goes from your magento 2 instance using your smtp server 🙂

. . .

Comments (35)

Add Your Comment

  • Muhammad Usman
    helpful..
  • DB
    I’m having trouble after upgrading to 2.1.9. I cant go to 2.2 yet. Should i try this code change?
    • Webkul Support
      yes you can use it with following update
      For magento2 version 2.2.Xyou need to do following updateSetp 1add following method in NameSpaceModuleNameModelTransport.php (Model file)/** * @inheritdoc */public function getMessage() { return $this->message;}Step 2=>update file app/code/NameSpace/ModuleName/etc/di.xml

      Thanks Abhishek

  • css.php
    Hire Us!
    Brief us about your requirements and we'll get back to you.
    Woo! Hooy!
    We have just recieved your project brief and our expert will contact you shortly.
    Send Again
    Close