代码之家  ›  专栏  ›  技术社区  ›  Major Productions

Symfony 3.3和Swiftmailer-由控制器创建和发送的邮件由服务器延迟

  •  22
  • Major Productions  · 技术社区  · 8 年前

    我正在尝试使用Swiftmailer从网站发送电子邮件。由于Swiftmailer试图使用我服务器的IP地址而不是本地主机作为中继,电子邮件一直被推迟:

    Aug  2 14:18:28 picus sm-mta[21171]: v72IIS0I021171: from=<Test@test.com>, size=347, class=0, nrcpts=1, msgid=<91d4a1a70de9fed0a2c04e682e435405@swift.generated>, proto=ESMTP, daemon=MTA-v4, relay=localhost [127.0.0.1]
    Aug  2 14:18:28 picus sm-mta[21173]: v72IIS0I021171: to=<person@gmail.com>, 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.
    

    相关控制器代码:

    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('person@gmail.com')
            ->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
    

    真正令人沮丧的是,如果我使用 bin/console swiftmailer:email:send bin/console swiftmailer:spool:send )发送正确。它是 只有 当我创建并通过控制器发送消息时,表明存在问题。

    3 回复  |  直到 8 年前
        1
  •  10
  •   Major Productions    8 年前

    Ooof

    是我这边的DNS错误导致了这个问题。也就是说,我忘了将我的MX记录指向谷歌的邮件服务器,所以sendmail采用了 example.com 并尝试将其用作smtp中继,即使我没有设置邮件服务器。

    为所有的惊愕道歉。希望我的回答能对其他人有用。

        2
  •  5
  •   JGrinon    8 年前

    为什么使用Sendmail传输而不是SMTP传输?

    https://swiftmailer.symfony.com/docs/sending.html

    试试这个:

    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:
        mailer_transport: smtp
        mailer_host: smtp.office365.com
        mailer_user: user@example.com
        mailer_password: my_password
        mailer_port: 587
        mailer_encryption: tls
    

    控制器

    $message = \Swift_Message::newInstance()
                ->setSubject('Subject')
                ->setFrom(array('user@example.com' => 'My name'))
                ->setTo(array($user->getMail()))
                ->setBcc(array('copy1@example.com', 'copy2@example.com'))
                ->setBody(
                    $this->renderView(
                        'template.html.twig',
                        array('vars' => $vars)
                    ),
                    'text/html'
                );
    
    $this->get('mailer')->send($message);
    
        3
  •  2
  •   staskrak    8 年前

        $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);
    

    您可以将其包装到简单YouMailService的发送消息中。