Stevan Tosic
Stevan Tosic

Reputation: 7229

Send mail from localhost via Symfony2 Command using Swiftmailer

Command function

$message = \Swift_Message::newInstance('test')
            ->setContentType("text/html")
            ->setFrom('[email protected]')
            ->setTo('[email protected]');

        $message->setBody('test');

        if ($this->getApplication()->getKernel()->getContainer()->get('mailer')->send($message))
        {
            return true;
        }
        return false;

When I execute command in Command Line I get true like mail is sent.

Paramters.yml

mailer_transport: gmail
mailer_host: smtp.gmail.com
mailer_user: [email protected]
mailer_password: xxxxxxxxxxxxx

Config.yml

swiftmailer:
    spool:
        type: file
        path: "%kernel.root_dir%/../swiftmailer"
    transport: %mailer_transport%
    host:      %mailer_host%
    username:  %mailer_user%
    password:  %mailer_password%

I had read somewhere that Symfony Profiler can be used to see if mail has sent but I just want to physically send mail to my address in testing purpose. I just need info where I do wrong things.

I must notice that I using allowed device security tool in gmail account.

Can that be reason why mail is not sent?

Upvotes: 3

Views: 4501

Answers (1)

Stevan Tosic
Stevan Tosic

Reputation: 7229

Yes! I found a solution.

I had removed spool in Config.yml and add port and encryption.

# Swiftmailer Configuration
swiftmailer:
    transport: %mailer_transport%
    host:      %mailer_host%
    port:      %mailer_port%
    encryption: %mailer_encryption%
    username:  %mailer_user%
    password:  %mailer_password%

and in Parameters.yml

mailer_transport: gmail
mailer_host: smtp.gmail.com
mailer_port: 465
mailer_encryption: ssl
mailer_user: [email protected]
mailer_password: yourNewGeneratedAppPassword

after that I was available to see errors using

 $mailer = $this->getContainer()->get('mailer');

 $logger = new \Swift_Plugins_Loggers_ArrayLogger();
 $mailer->registerPlugin(new \Swift_Plugins_LoggerPlugin($logger));

Then after message is sent I had used:

 echo $logger->dump();

To print error in terminal.

Below is whole function.

public function sendMail($email, $data)
    {
        $mailer = $this->getContainer()->get('mailer');

        $logger = new \Swift_Plugins_Loggers_ArrayLogger();
        $mailer->registerPlugin(new \Swift_Plugins_LoggerPlugin($logger));

        $message = \Swift_Message::newInstance('test')
            ->setContentType("text/html")
            ->setFrom('[email protected]')
            ->setTo($email);

        $message->setBody($data);

        if ($mailer->send($message))
        {
            echo $logger->dump();
            return true;
        }
        return false;
    }

Tips:

Also you must authenticate your app, ofcourse if you using gmail. via this link https://myaccount.google.com/security

There is link

app password

Here is description https://support.google.com/accounts/answer/185833?hl=en

After click there you will need to give custom name to your app and generate new password which you will using in

Parameters.yml >> mailer_password:

to connect app with gmail account.

Upvotes: 7

Related Questions