php Laravel 默认邮件不起作用

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/22192133/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-25 04:43:38  来源:igfitidea点击:

Laravel default mail not working

phpemaillaravelsmtp

提问by Sainath Krishnan

Im attempting to send a user activation email upon registration. I have a simple laravel site with registration and authentication. Upon registration, there are no errors, and the data is stored correctly, however the email never actually gets sent. Tried a few different examples, but I have the same problem.

我试图在注册时发送用户激活电子邮件。我有一个带有注册和身份验证的简单 Laravel 站点。注册后,没有错误,数据存储正确,但电子邮件从未真正发送过。尝试了几个不同的例子,但我有同样的问题。

This is my mail.php config file -

这是我的 mail.php 配置文件 -

<?php

return array(

    /*
    |--------------------------------------------------------------------------
    | Mail Driver
    |--------------------------------------------------------------------------
    |
    | Laravel supports both SMTP and PHP's "mail" function as drivers for the
    | sending of e-mail. You may specify which one you're using throughout
    | your application here. By default, Laravel is setup for SMTP mail.
    |
    | Supported: "smtp", "mail", "sendmail"
    |
    */

    'driver' => 'smtp',

    /*
    |--------------------------------------------------------------------------
    | SMTP Host Address
    |--------------------------------------------------------------------------
    |
    | Here you may provide the host address of the SMTP server used by your
    | applications. A default option is provided that is compatible with
    | the Postmark mail service, which will provide reliable delivery.
    |
    */

    'host' => 'smtp.mailgun.org',

    /*
    |--------------------------------------------------------------------------
    | SMTP Host Port
    |--------------------------------------------------------------------------
    |
    | This is the SMTP port used by your application to delivery e-mails to
    | users of your application. Like the host we have set this value to
    | stay compatible with the Postmark e-mail application by default.
    |
    */

    'port' => 587,

    /*
    |--------------------------------------------------------------------------
    | Global "From" Address
    |--------------------------------------------------------------------------
    |
    | You may wish for all e-mails sent by your application to be sent from
    | the same address. Here, you may specify a name and address that is
    | used globally for all e-mails that are sent by your application.
    |
    */

    'from' => array('address' => '[email protected]', 'name' => 'God'),

    /*
    |--------------------------------------------------------------------------
    | E-Mail Encryption Protocol
    |--------------------------------------------------------------------------
    |
    | Here you may specify the encryption protocol that should be used when
    | the application send e-mail messages. A sensible default using the
    | transport layer security protocol should provide great security.
    |
    */

    'encryption' => 'tls',

    /*
    |--------------------------------------------------------------------------
    | SMTP Server Username
    |--------------------------------------------------------------------------
    |
    | If your SMTP server requires a username for authentication, you should
    | set it here. This will get used to authenticate with your server on
    | connection. You may also set the "password" value below this one.
    |
    */

    'username' => null,

    /*
    |--------------------------------------------------------------------------
    | SMTP Server Password
    |--------------------------------------------------------------------------
    |
    | Here you may set the password required by your SMTP server to send out
    | messages from your application. This will be given to the server on
    | connection so that the application will be able to send messages.
    |
    */

    'password' => null,

    /*
    |--------------------------------------------------------------------------
    | Sendmail System Path
    |--------------------------------------------------------------------------
    |
    | When using the "sendmail" driver to send e-mails, we will need to know
    | the path to where Sendmail lives on this server. A default path has
    | been provided here, which will work well on most of your systems.
    |
    */

    'sendmail' => '/usr/sbin/sendmail -bs',

    /*
    |--------------------------------------------------------------------------
    | Mail "Pretend"
    |--------------------------------------------------------------------------
    |
    | When this option is enabled, e-mail will not actually be sent over the
    | web and will instead be written to your application's logs files so
    | you may inspect the message. This is great for local development.
    |
    */

    'pretend' => false,

);

And this is the logic for handling the mailer - (This is in UsersController)

这是处理邮件程序的逻辑 - (这是在 UsersController 中)

public function postCreate()
    {
            $validator = Validator::make(Input::all(), User::$rules);

        if ($validator->passes()) 
        {
            $act_code = str_random(60);
            $user = new User;
            $user->user_username = Input::get('user_username');
            $user->user_email = Input::get('user_email');
            $user->user_password = Hash::make(Input::get('user_password'));
            $user->user_status = "N";
            $user->user_activation_key = $act_code;
            if($user->save())
            {

              $email_data = array(
             'recipient' => $user->user_email,
             'subject' => 'Activation Email'
              );
                $view_data = array(
                'actkey' => $act_code,
            );

              Mail::send('emails.welcome', $view_data, function($message) use ($email_data) {
                  $message->to( $email_data['recipient'] )
                          ->subject( $email_data['subject'] );
              });


            return Redirect::to('login')->with('message', 'Thanks for registering!');
            }
        } 
        else 
        {
            return Redirect::to('register')->with('message', 'The following errors occurred')->withErrors($validator)->withInput();
        }
    }

回答by mdg

Okay, I'd give Yousef an ''Up One'' , but my reputation is not high enough (seems broken). I had EXACTLY the same issue with my ISP in connecting to their smtp server. The only way I could FINALLY get an email through using laravel was to set the 'encryption' value to nothing (ie just as in the post above). Every other combination of port-change, account-change, etc. resulted in a laravel exception. I tried using my gmail account and credentials with no luck.

好吧,我会给 Yousef 一个 ''Up One'' ,但我的声誉不够高(似乎坏了)。我的 ISP 在连接到他们的 smtp 服务器时遇到了完全相同的问题。我最终可以通过使用 laravel 收到电子邮件的唯一方法是将“加密”值设置为空(即就像上面的帖子一样)。端口更改、帐户更改等的所有其他组合都会导致 Laravel 异常。我尝试使用我的 gmail 帐户和凭据,但没有成功。

The only combination of settings that finally worked was to use

最终起作用的唯一设置组合是使用

'host' => 'smtp.your-domain',
'port' => 587, 
'encryption' => '',
'username' => 'Your-account@Your-domain',
'password' => 'your-password for Your-account',...

回答by LifeQuery

Expanding on the answers above as they weren't working for me.

扩展上面的答案,因为它们对我不起作用。

The port you define has to correlate with the right type of encryption. As it turns out, ssl and tls are not equivalent and correlate to different ports.
The default encryption setting in laravel is set on tls (port 587), but if you're using port 465, you need to change it to ssl.

您定义的端口必须与正确的加密类型相关联。事实证明,ssl 和 tls 并不等效,并且与不同的端口相关。
Laravel 中的默认加密设置是在 tls(端口 587)上设置的,但如果您使用的是 465 端口,则需要将其更改为 ssl。

Google's smtp.gmail.com server is a good example of this:

Google 的 smtp.gmail.com 服务器就是一个很好的例子:

'host' => 'smtp.gmail.com',
'port' => 465, 
'encryption' => 'ssl',

OR

或者

'host' => 'smtp.gmail.com',
'port' => 587, 
'encryption' => 'tls',

Furthermore, port 587 doesn't mandate the use of encryption (more on that here). If you find that setting 'encryption' => ''works for you, it should raise a red flag as it may mean the smtp server you're using is not encrypting your emails.
In this case, you should find alternative means of sending your emails.

此外,端口 587 不强制要求使用加密(更多内容请点击此处)。如果您发现该设置'encryption' => ''适合您,它应该会发出警告信号,因为这可能意味着您使用的 smtp 服务器没有加密您的电子邮件。
在这种情况下,您应该找到其他发送电子邮件的方式。

回答by UX Labs

try removing tls encryption by setting it to

尝试通过将其设置为删除 tls 加密

'encryption' => '',

i had a similar issue, and the tls was it.

我有一个类似的问题,就是 tls。

回答by grantDEV

I had this problem but I set configuration mail in .env file and I used this:

我遇到了这个问题,但我在 .env 文件中设置了配置邮件,我使用了这个:

php artisan config:cache

回答by Kaushik Kumar

If you are using this on local machine using Xampp. Please disable all the encryption application which are running at the back end. I had experienced the same issue and it was solved when i disabled PGP encryption software. The encryption software doesn't allow to pass token to the email.

如果您在使用 Xampp 的本地机器上使用它。请禁用所有在后端运行的加密应用程序。我遇到了同样的问题,当我禁用 PGP 加密软件时它就解决了。加密软件不允许将令牌传递给电子邮件。

回答by Deepak Kumar

Config/mail.php

配置/mail.php

<?php

return [

/*
|--------------------------------------------------------------------------
| Mail Driver
|--------------------------------------------------------------------------
|
| Laravel supports both SMTP and PHP's "mail" function as drivers for the
| sending of e-mail. You may specify which one you're using throughout
| your application here. By default, Laravel is setup for SMTP mail.
|
| Supported: "smtp", "mail", "sendmail", "mailgun", "mandrill", "log"
|
*/

'driver' => 'sendmail',

/*
|--------------------------------------------------------------------------
| SMTP Host Address
|--------------------------------------------------------------------------
|
| Here you may provide the host address of the SMTP server used by your
| applications. A default option is provided that is compatible with
| the Mailgun mail service which will provide reliable deliveries.
|
*/

'host' => 'smtp.gmail.com',

/*
|--------------------------------------------------------------------------
| SMTP Host Port
|--------------------------------------------------------------------------
|
| This is the SMTP port used by your application to deliver e-mails to
| users of the application. Like the host we have set this value to
| stay compatible with the Mailgun e-mail application by default.
|
*/

'port' => 465,

/*
|--------------------------------------------------------------------------
| Global "From" Address
|--------------------------------------------------------------------------
|
| You may wish for all e-mails sent by your application to be sent from
| the same address. Here, you may specify a name and address that is
| used globally for all e-mails that are sent by your application.
|
*/

'from' => ['address' => 'your mail', 'name' => 'Project'],

/*
|--------------------------------------------------------------------------
| E-Mail Encryption Protocol
|--------------------------------------------------------------------------
|
| Here you may specify the encryption protocol that should be used when
| the application send e-mail messages. A sensible default using the
| transport layer security protocol should provide great security.
|
*/

'encryption' => '',

/*
|--------------------------------------------------------------------------
| SMTP Server Username
|--------------------------------------------------------------------------
|
| If your SMTP server requires a username for authentication, you should
| set it here. This will get used to authenticate with your server on
| connection. You may also set the "password" value below this one.
|
*/

'username' => 'your email (gmail)',

/*
|--------------------------------------------------------------------------
| SMTP Server Password
|--------------------------------------------------------------------------
|
| Here you may set the password required by your SMTP server to send out
| messages from your application. This will be given to the server on
| connection so that the application will be able to send messages.
|
*/

'password' => 'password (email)',

/*
|--------------------------------------------------------------------------
| Sendmail System Path
|--------------------------------------------------------------------------
|
| When using the "sendmail" driver to send e-mails, we will need to know
| the path to where Sendmail lives on this server. A default path has
| been provided here, which will work well on most of your systems.
|
*/

'sendmail' => '/usr/sbin/sendmail -bs',

/*
|--------------------------------------------------------------------------
| Mail "Pretend"
|--------------------------------------------------------------------------
|
| When this option is enabled, e-mail will not actually be sent over the
| web and will instead be written to your application's logs files so
| you may inspect the message. This is great for local development.
|
*/

'pretend' => false,

];

The mail function

邮件功能

use Illuminate\Contracts\Mail\Mailer;

$message = [
            'title'     => 'Verification code',
            'intro'     => "Please verify your email address with ".$user->confirmation_code,
            'link'      => '',
            'confirmation_code' => '',
            'to_email'  => $user->email,
            'to_name'   => $user_details->first_name.' '.$user_details->last_name,
        ];

        \Mail::send('emails.auth.verify', $message, function($m) use($message) {
            $m->to($message['to_email'], $message['to_name'])
                    ->subject('Email verification');
        });