Symfony swiftmailer in production environment - php

I have a problem for sending mails with Swiftmailer in Symfony2.
Let me explain it: when I go to my website with the app_dev.php, I could send messages, there is no problem (also, when I write $kernel = new AppKernel('prod', true); in app.php).
So, I don't understand why this works in dev and not in prod.
Here is my configuration files:
parameters.yml:
mailer_transport: smtp
mailer_host: ****.ovh.net
mailer_username: postmaster#mywebsite.com
mailer_password: ****
mailer_port: ****
config.yml:
swiftmailer:
transport: "%mailer_transport%"
host: "%mailer_host%"
username: "%mailer_username%"
password: "%mailer_password%"
port: "%mailer_port%"
spool: { type: memory }
And this is the php code, but I think there is no problem with it because as I said there is no problem in dev mode.
$message = \Swift_Message::newInstance() -> setSubject('Test')
-> setFrom('postmaster#mywebsite.com')
-> setTo($user -> getMail())
-> setBody('Test');
$this -> get('mailer') -> send($message);
Thank you very much if you know where is the problem.

If something worked in dev, but not prod try manually deleting the prod cache directory and re-installing and dumping assets again. Review this checklist from the docs.

Related

Symfony 3 - Swiftmailer not sending email

I'm attempting to send an email using SwiftMailer (version = Swift-5.4.8) after a user submits a form. I cannot determine why the email is not being sent. I have only tried using gmail setup as I've heard it is easiest to use (am new to web dev).
I have tried changing config.yml, parameters.yml
parameters.yml:
parameters:
database_host: 127.0.0.1
database_port: null
database_name: symfony
database_user: root
database_password: null
mailer_transport: gmail
mailer_encryption: ssl
mailer_auth_mode: login
mailer_host: smtp.gmail.com
mailer_user: myemail#gmail.com
mailer_password: mypass
secret: mysecret
config.yml (relevant snippet, please lmk if need other portions)
swiftmailer:
transport: '%mailer_transport%'
host: '%mailer_host%'
username: '%mailer_user%'
password: '%mailer_password%'
spool: { type: memory }
DefaultController
$form = $this->createFormBuilder()
->add('from', EmailType::class)
->add('message', TextareaType::class)
->add('send',SubmitType::class)
->getForm()
;
if ($form->isSubmitted()){
$data = $form->getData();
$message = \Swift_Message::newInstance()
->setSubject('Join Our Team Request')
->setFrom($data['from'])
->setTo('myemail2#gmail.com')
->setBody(
$data['message'],'text/plain'
)
;
$this->get('mailer')->send($message);
}
return $this->render('xxx.html.twig', array("title" => "...","join_team_form" =>$form->createView()));
The view and form are rendered correctly. It appears the form submits correctly, however I never receive an email. Again new to web dev, any suggestions appreciated.
EDIT: I was able to successfully configure and send an email using the command prompt and the 'php bin\console swiftmailer:email:send' command. The issue was it was using a dev_config file, silly error. However, when I still fill out the form and click the send button, no email gets sent. Only using the above command. Any insight?
EDIT2: Solution to first EDIT was running 'composer update'.... nice...
The best practice to send mails with gmail on Symfony is described in this documentation
But for this you need to have environment variables loaded in your application, and I don't know it's your case.
The below should work. Update your config.yml to
swiftmailer:
url: 'gmail://%mailer_user%:%mailer_password%#localhost?encryption=tls&auth_mode=oauth'
spool: { type: 'memory' }
Another suggestion is to check that your form is valid before sending the mail. Otherwise the send will fail if the from is null or ""
if ($form->isSubmitted() && $form->isValid()){ ... }
Let me know if it don't work
Try to use tls encryption and smtp tranport protocol.
Your config.yml will be similar to this:
# Swiftmailer Configuration
swiftmailer:
transport: 'smtp'
host: 'smtp.gmail.com'
username: 'myemail#gmail.com'
password: 'mypass'
encryption: tls
auth_mode: login
And, you must activate access to less secure applications and disable two step authentification in your gmail account.

Cannot email via gmail

Unable to send mail via gmail in Symfony 2.8.3 in prod on freebsd host while it works on Windows 10 with same source code in both prod & dev. [Also unable to get a log of mailing on host, which might help resolve this.]
Update: Mail can be sent using PHP's mail() function. Using Swiftmailer to send mail from a controller does not work. Changed parameters to use mailer_transport: smtp mailer_host: localhost does not enable Swiftmailer to send from a controller.
parameters.yml:
mailer_transport: gmail
mailer_host: smtp.gmail.com
mailer_user: {valid address}
mailer_password: (valid password}
config.yml:
swiftmailer:
transport: "%mailer_transport%"
host: "%mailer_host%"
username: "%mailer_user%"
password: "%mailer_password%"
encryption: ssl
auth_mode: login
config_prod.yml:
monolog:
handlers:
mail:
type: fingers_crossed
action_level: critical
handler: buffered
buffered:
type: buffer
handler: swift
swift:
type: swift_mailer
from_email: "%mailer_user%"
to_email: "%mailer_user%"
subject: Error report!
level: debug
In the absence of any other solution or finding a way to log Swiftmailer behavior I added a custom exception listener to send mail locally.

symfony swiftmaile strange behavior

I got a strange behavior when sending email using Swiftmailer
here is the paramaters:
#Swiftmailer parameters # app/config/parameters.yml
parameters:
mailer_transport: smtp
mailer_host: ssl0.ovh.net
mailer_user: my_account#my_domain.com
mailer_password: my_account_password
mailer_port: 465
auth_mode: plain
encryption: ssl
the config
# Swiftmailer Configuration # app/config/config.yml
swiftmailer:
transport: "%mailer_transport%"
host: "%mailer_host%"
username: "%mailer_user%"
password: "%mailer_password%"
port: "%mailer_port%"
encryption: "%encryption%"
auth_mode: "%auth_mode%"
Now the controller and the action
class MailTestController extends Controller
{
public function SymfonyParamatersAction()
{
$message=\Swift_Message::newInstance()
->setSubject('smtp test with sm params')
->setFrom('my_account#my_domain.com')
->setTo('my_account#gmail.com')
->setBody('this is a test')
;
$result =$this->get('mailer')->send($message);
dump($this->get('mailer')->getTransport());die;
//return $this->render('...');;
}
}
So in the profiler I got one email sent but I dont receive any mail
I added this action to my controller
public function DirectParamatersAction()
{
$transport = \Swift_SmtpTransport::newInstance('ssl0.ovh.net', 465,'ssl')
->setUsername('my_account#my_domain.com')
->setPassword('my_account_password')
;
$transport->start();
$mailer = \Swift_Mailer::newInstance($transport);
$message=\Swift_Message::newInstance()
->setSubject('smtp test with direct params')
->setFrom('my_account#my_domain.com')
->setTo('my_account#gmail.com')
->setBody('this is a test')
;
$result =$mailer->send($message);
dump($transport);die;
return $this->render('.........');
}
with this action I received the message
the funny part (strange behavior) is when running these actions, I get different result:
1=> message is sent
2=> Expected response code 250 but got code "235", with message "235 ok, go ahead (#2.0.0)
3=>Connection could not be established with host ssl0.ovh.net [Connection timed out #110]
I clean the cache every time I change the config
I have to reload the page again and again to send the message
my question is what is wrong with the parameters and the first action?
secondly how to avoid this strange behavior?
the problem was in old configuration in app/conf/config_dev.yml

Disable swiftmailer spool in Symfony per environment

I having trouble send bulk emails with symfony2 via console command. I want to disable the mail spooling complete for the env the console is running in but keep it working for the default env. So I have this in config.yml:
swiftmailer:
transport: %mailer_transport%
host: %mailer_host%
port: %mailer_port%
username: %mailer_user%
password: %mailer_password%
spool: %mailer_spool_type%
and then each env has it's on parameters like parameters_prod.yml:
parameters:
mailer_transport: smtp
mailer_host: smtp.someserver.net
mailer_port: 587
mailer_user: "someuser"
mailer_password: "somepassword"
mailer_spool_type: { type:memory }
then for the console env I use parameters_cron.yml:
parameters:
mailer_spool_type: ~
The problem is using ~ or null doesn't actually turn off the spool but it uses the default values of {cache: file, path: %kernel.cache_dir%/swiftmailer/spool }
Is there a way to disable the spool just by changing the parameters or is there a better way?
Apparently the only way to disable email spooling is to completely leave out the spool entry from your configuration file. Once you include the spool entry in the main configuration file, there is no way to disable spooling for a specific environment.
That said, you can accomplish the opposite of what you propose: you can disable email spooling by default and enable it in specific environments.
Leave it out in config.yml:
swiftmailer:
transport: %mailer_transport%
host: %mailer_host%
port: %mailer_port%
username: %mailer_user%
password: %mailer_password%
And include it in config_prod.yml:
swiftmailer:
spool: %mailer_spool_type%

symfony2: emails are not sent

$mail = \Swift_Message::newInstance()
->setSubject($message->getSubject())
->setFrom($message->getEmail())
->setBody($message->getBody());
$this->get('mailer')->send($mail);
Mails are not sent when using swiftmailer. Yet, when I go step by step in the debugger, it seems to send the email and returns sent=1. However I don't receive anything in my mailbox (gmail). I use my gmail account for sending emails, as shown below:
parameters:
mailer_transport: gmail
mailer_host: ~
mailer_user: username#gmail.com
mailer_password: my-password
delivery_address: username#gmail.com
swiftmailer:
transport: %mailer_transport%
host: %mailer_host%
username: %mailer_user%
password: %mailer_password%
spool: { type: memory }
I've checked apache error log, nothing. I've run php app/console swiftmailer:spool:send just in case, but no luck.
What could prevent emails from being sent ?
You need either to:
1) Remove the spool line in your swiftmailer configuration, this one:
spool: { type: memory }
2) Trigger the spool queue to be sent:
php app/console swiftmailer:spool:send
But I think you are looking for option 1)
u can try this one...
Parameter.yml
mailer_transport: gmail
mailer_encryption: ssl
mailer_auth_mode: login
mailer_host: smtp.gmail.com
mailer_user: 'xxxxxxxxxxxx'
config.yml
swiftmailer:
transport: gmail
host: smtp.gmail.com
username: 'Yourmail-id#gmail.com'
password: 'Password'
The ->setTo part was missing ! That solved it.
$mail = \Swift_Message::newInstance()
->setSubject($message->getSubject())
->setFrom($message->getEmail())
->setTo("me#gmail.com")
->setBody($message->getBody());
First, when you set spool: { type: memory } it means that you actually want to send the emails manually by running the spool command: php app/console swiftmailer:spool:send. So removing that spool line is going to help.
Second, you need to properly configure your mailing host. For development purposes, I strongly recommend that you use a service such as SendGrid and configure it as detailed in this Symfony2 Mailing Setup Tutorial
The tutorial also contains details on how to properly setup a mailing service in Symfony2 and how to build mailing templates.
Third, if you want to stick with Gmail, then the correct data is:
mailer_transport: smtp
mailer_host: smtp.gmail.com
mailer_user: your_gmail_address#gmail.com
mailer_password: 'your_gmail_password'
mailer_port: 587

Categories