php - enviar - symfony 4 swiftmailer
Symfony 3.3 y Swiftmailer-correo creado y enviado por el controlador diferido por el servidor (3)
Intento utilizar Swiftmailer para enviar correos electrónicos desde un sitio web. Los correos electrónicos siguen diferidos porque Swiftmailer está intentando usar la dirección IP de mi servidor en lugar de localhost como retransmisión:
Aug 2 14:18:28 picus sm-mta[21171]: v72IIS0I021171: from=<[email protected]>, size=347, class=0, nrcpts=1, msgid=<[email protected]>, proto=ESMTP, daemon=MTA-v4, relay=localhost [127.0.0.1]
Aug 2 14:18:28 picus sm-mta[21173]: v72IIS0I021171: to=<[email protected]>, delay=00:00:00, xdelay=00:00:00, mailer=esmtp, pri=120347, relay=example.com. [my.servers.ip.address], dsn=4.0.0, stat=Deferred: Connection refused by example.com.
El código, la configuración y los parámetros de mi controlador Symfony -
Código de controlador relevante:
if ($form->isSubmitted() && $form->isValid()) {
$data = $form->getData();
$this->addFlash(''success'', ''Message sent successfully'');
$data[''message''] = str_replace("/n.", "/n..", $data[''message'']);
$mail = (new /Swift_Message())
->setSubject("[From My Website] - {$data[''subject'']}")
->setFrom($data[''email''])
->setTo(''[email protected]'')
->setBody("{$data[''name'']} wrote the following message:/n/n{$data[''message'']}");
$this->get(''mailer'')->send($mail);
return $this->redirect($this->generateUrl(''_home''));
}
config.yml
:
# Swiftmailer Configuration
swiftmailer:
transport: ''%mailer_transport%''
host: ''%mailer_host%''
username: ''%mailer_user%''
password: ''%mailer_password%''
port: ''%mailer_port%''
spool:
type: file
path: ''%kernel.cache_dir%/swiftmailer/spool''
parameters.yml
:
parameters:
mailer_transport: sendmail
mailer_host: 127.0.0.1
mailer_user: null
mailer_password: null
mailer_port: null
Lo que es realmente frustrante es que si creo un mensaje usando bin/console swiftmailer:email:send
, y luego descargue el spool ( bin/console swiftmailer:spool:send
) se envía correctamente. Solo cuando creo y envío un mensaje a través de mi controlador, surge un problema.
¿Qué estoy haciendo mal?
¿Por qué usa Sendmail Transport en lugar de SMTP Transport?
https://swiftmailer.symfony.com/docs/sending.html
Prueba esto:
config.yml
# Swiftmailer Configuration
swiftmailer:
transport: "%mailer_transport%"
host: "%mailer_host%"
username: "%mailer_user%"
password: "%mailer_password%"
port: "%mailer_port%"
encryption: "%mailer_encryption%"
spool: { type: memory }
parameters.yml
parameters:
mailer_transport: smtp
mailer_host: smtp.office365.com
mailer_user: [email protected]
mailer_password: my_password
mailer_port: 587
mailer_encryption: tls
Controlador
$message = /Swift_Message::newInstance()
->setSubject(''Subject'')
->setFrom(array(''[email protected]'' => ''My name''))
->setTo(array($user->getMail()))
->setBcc(array(''[email protected]'', ''[email protected]''))
->setBody(
$this->renderView(
''template.html.twig'',
array(''vars'' => $vars)
),
''text/html''
);
$this->get(''mailer'')->send($message);
Ooof
Fue un error de DNS de mi parte lo que estaba causando el problema. A saber, que olvidé apuntar mis registros MX a los servidores de correo de Google, por lo que sendmail tomaba la parte example.com
de la dirección de destino e intentaba usarla como un retransmisor smtp, aunque no tenía un servidor de correo configurado. .
Disculpas por toda la consternación. Espero que mi respuesta pueda ser útil para otros golpeando sus cabezas contra la pared.
Puedo sugerirle que pruebe este enfoque:
$mailer = $container->get(''mailer'');
$spool = $mailer->getTransport()->getSpool();
$transport = $container->get(''swiftmailer.transport.real'');
$sender = ''your_sender'';
$recipient = ''your_recipient'';
$title = ''your_title'';
$body = ''your_message'';
$charset = "UTF-8";
$email = $mailer->createMessage()
->setSubject($title)
->setFrom("$sender")
->setTo("$recipient")
->setCharset($charset)
->setContentType(''text/html'')
->setBody($body)
;
$send = $mailer->send($email);
$spool->flushQueue($transport);
Puede envolver esto en un mensaje de envío del servicio YouMailService simple. O puede insertar este código en su controlador. Esto será suficiente.