简体   繁体   English

Laravel 不发送 email 并且不给出错误

[英]Laravel not sending email and not giving errors

I've been on a project for the past four months now and I am really pissed at what am facing with Laravel right now.过去四个月我一直在做一个项目,我对 Laravel 现在所面临的事情感到非常生气。 It's not sending emails;它不是在发送电子邮件; I set it up to use the mail driver and put in the right code, but it seems not to work at all.我将它设置为使用邮件驱动程序并输入正确的代码,但它似乎根本不起作用。 Besides not working, it doesn't even give me an error!除了不工作,它甚至不给我一个错误!

Here is my configuration:这是我的配置:

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' => 'mail',

/*
|--------------------------------------------------------------------------
| 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' => null, 'name' => null),

/*
|--------------------------------------------------------------------------
| 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,

);

Here is my PHP code for sending email:这是我发送 email 的 PHP 代码:

$data["mail_message"] = "Hello!";

    Mail::send('emails.welcome', $data, function($message)
    {
        $message
            ->to('me@mydomain.com')
            ->from('info@otherdomain.com')
            ->subject('TEST');
    });

First and foremost, go to the app/config/mail.php and change the driver to “mail”.首先,转到 app/config/mail.php 并将驱动程序更改为“mail”。 Also put the host as blank.也把主机设为空白。

In my scenario email was being queued so that is why I got no output.在我的场景中,电子邮件正在排队,这就是为什么我没有输出的原因。 I had forgotten I set email to queue by default .我忘记了我默认将电子邮件设置为队列 I looked in the Jobs table I saw all my messages waiting in there.我查看了 Jobs 表,我看到我所有的消息都在那里等待。 I ran php artisan queue:work to get the queue running/sending them.我运行php artisan queue:work让队列运行/发送它们。

You can check general E-Mail delivery by typing:您可以通过键入以下内容来检查一般电子邮件传送:

php artisan tinker

Mail::getSwiftMailer()->registerPlugin (
    new Swift_Plugins_LoggerPlugin(new Swift_Plugins_Loggers_EchoLogger(false))
);
$to = 'youraddress@example.com';
Mail::raw('Testmail', function ($message) use($to) {  
    $message->to($to)->subject('Testmail'); 
});

And you will get even the output of the SMTP dialog.你甚至会得到 SMTP 对话框的输出。

Make sure to replace $to with your mail address to check if it arrives.确保将$to to 替换$to您的邮件地址以检查它是否到达。

EDIT If this works and you still have problems with email delivery, you might have a queuing issue.编辑如果这有效并且您仍然遇到电子邮件传递问题,则您可能遇到排队问题。

The Fix That Worked For Me对我有用的修复

  1. In your .env file change APP_URL=127.0.01 to APP_URL=http://localhost在您的.env文件中,将APP_URL=127.0.01更改为APP_URL=http://localhost
  2. Set your SMTP details correctly, and do config:cache , then restart server.正确设置您的 SMTP 详细信息,并执行config:cache ,然后重新启动服务器。

After that my mail started sending!之后我的邮件开始发送!

How I Arrived At That Fix我是如何解决这个问题的

I had previously set my SMTP details up correctly, but even after doing config:cache config:clear and restarting my server, the emails were not sending.我之前已经正确设置了我的 SMTP 详细信息,但是即使在执行 config:cache config:clear 并重新启动我的服务器之后,电子邮件也没有发送。 After that I compared it to my working Laravel App, and the only difference was the 127.0.0.1 -> http://localhost , so I changed that as a last ditch attempt, and it worked.之后,我将它与我的工作 Laravel 应用程序进行了比较,唯一的区别是 127.0.0.1 -> http://localhost ,所以我将其更改为最后一次尝试,并且它起作用了。

A solution for notifications not sent via 'mail'不通过“邮件”发送通知的解决方案

https://laravel.com/docs/5.7/notifications#customizing-the-recipient https://laravel.com/docs/5.7/notifications#customizing-the-recipient

<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use Notifiable;

    /**
     * Route notifications for the mail channel.
     *
     * @param  \Illuminate\Notifications\Notification  $notification
     * @return string
     */
    public function routeNotificationForMail($notification)
    {
        return $this->email_address;
    }
}

Go to .env file and set转到 .env 文件并设置

MAIL_DRIVER=smtp

Or you can set driver from the config files.或者您可以从配置文件中设置驱动程序。 Go to file Laravel 4 : app/config/mail.php Laravel 5 : config/mail.php and set转到文件 Laravel 4 : app/config/mail.php Laravel 5 : config/mail.php 并设置

'driver' => 'smtp',

You may use SMTP.您可以使用 SMTP。 Hope It will help.希望它会有所帮助。

It could be because you have a ".env" file, in the Laravel project root, with mail server configuration like this:可能是因为您在 Laravel 项目根目录中有一个“.env”文件,邮件服务器配置如下:

...
MAIL_DRIVER=mail
MAIL_HOST=mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null

It seems the ".env" file just overrides "config/mail.php" file.似乎“.env”文件只是覆盖了“config/mail.php”文件。 You can just remove same lines from the ".env" file for use "config/mail.php" configuration options.您可以从“.env”文件中删除相同的行以使用“config/mail.php”配置选项。

Configuration file:配置文件:

MAIL_DRIVER=smtp 
MAIL_HOST=smtp.gmail.com 
MAIL_PORT=587 
MAIL_USERNAME=abc@gmail.com 
MAIL_PASSWORD=xxxxxxxxxx 
MAIL_ENCRYPTION=tls

Then run themake:mail command:然后运行make:mail命令:

public function build(Request $request)
{
    return $this->view('mail['variable'=>$request->message])->to($request->to);
}

Routes:路线:

Route::post('send', 'mailController@send');
Route::get('email', 'mailController@email');

Controller:控制器:

public function send()
{
    Mail::send(new name());
}

public function email()
{
    return view('email');
}

View:看法:

<body><br><h1>Send Mail</h1><form method="post" action="send">to:<input type="text" name="to">message: <input type="text"  name="message" cols="30" rows="10"></input><input type="submit" name="submit" value="send"></form></body>

Mail:邮件:

<body><h1>Welcome, to this mail system, </h1>{!! $variable !!}</body>

Thing to remember: The message variable is a build-in variable and will generate error so use any other variable instead of message .要记住的事情: message变量是一个内置变量,会产生错误,因此请使用任何其他变量而不是message

More details:更多细节:

I finally got it to work.我终于让它工作了。 If you're using mailgun, add this information below to your .env file如果您使用的是 mailgun,请将以下信息添加到您的.env文件中

MAILGUN_DOMAIN=your.mailgundomain.com
MAILGUN_SECRET=key-yourmailgunkey

and then run然后运行

php artisan config:clear

Use Mail::to instead of Mail::send使用 Mail::to 而不是 Mail::send

Check my answer below在下面检查我的答案

Laravel Mail Laravel 邮箱

Change the driver in your config file to 'smtp' from 'mail'.将配置文件中的驱动程序从“mail”更改为“smtp”。 I guess that should work.我想这应该有效。

For Laravel 6, if verification email is not send anymore:对于 Laravel 6,如果不再发送验证邮件:

in user.php add在 user.php 添加

use Illuminate\Foundation\Auth\User as Authenticatable;

and

class User extends Authenticatable implements MustVerifyEmail

and in routes/web.php并在路由/ web.php

Auth::routes(['verify' => true]);

Firstle go to your project root on cmd and run this cmd -首先在 cmd 上转到您的项目根目录并运行此 cmd -

php artisan route:cache (clear your routes cache)
php artisan cache:clear (clear your application cache)
php artisan config:cache (clear your config cache)
php artisan view:clear (clear your view (blade) cache)

Go to .env file转到 .env 文件

MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=YourUserName
MAIL_PASSWORD=YourPassword
MAIL_ENCRYPTION=tls

Go to project root and use this cmd转到项目根目录并使用此 cmd

php artisan make:mail WelcomeUserVerifyMail

after that goto App\\mail\\WelcomeUserVerifyMail add these line -之后转到 App\\mail\\WelcomeUserVerifyMail 添加这些行 -

use Illuminate\Mail\Mailable;
public $mailData;
public function __construct(array $mailData)
{
  $this->mailData = $mailData;
}
public function build()
{
return $this->from(env('MAIL_FROM'))->subject('Test')->view('email-template.email'); //view load
}

In your controller where you use mail functionality -在您使用邮件功能的控制器中 -

use Illuminate\Support\Facades\Mail;
use App\Mail\WelcomeUserVerifyMail;

// Send Verify email
$mailData = ['name' => "Shubham Gupta", 'verifyButtonUrl' => $verifyButtonUrl];
Mail::to('shubham@yopmail.com')->send(new WelcomeUserVerifyMail($mailData));

I got same problem.我遇到了同样的问题。

Mail was no sending because I didn't set the recipient for email.邮件没有发送,因为我没有设置电子邮件的收件人。

Do not forget to set it.不要忘记设置它。

$mail->to('example@example.com');

i had the same issue !我遇到过同样的问题 ! and then i noticed that my boss made changes to config/mail.php.然后我注意到我的老板对 config/mail.php 进行了更改。 Here is what you need :这是你需要的:

set Mail variables in your .env file :在 .env 文件中设置邮件变量:

MAIL_DRIVER=smtp
MAIL_MAILER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=your_username
MAIL_PASSWORD=your_password
MAIL_ENCRYPTION=tls

in config/mail.php, make sure you have something => env('ENV_VARIABLE_NAME', 'default_value')在 config/mail.php 中,确保你有something => env('ENV_VARIABLE_NAME', 'default_value')

'driver' => env('MAIL_DRIVER', 'smtp'),
'host' => env('MAIL_HOST', 'smtp.mailgun.org'),
'port' => env('MAIL_PORT', 587),
'from' => [
    'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'),
    'name' => env('MAIL_FROM_NAME', 'Example'),
],
'encryption' => env('MAIL_ENCRYPTION', 'tls'),
'username' => env('MAIL_USERNAME'),
'password' => env('MAIL_PASSWORD'),
'sendmail' => '/usr/sbin/sendmail -bs',
'markdown' => [
    'theme' => 'default',

    'paths' => [
        resource_path('views/vendor/mail'),
    ],
],
'log_channel' => env('MAIL_LOG_CHANNEL'),

If you have ssl issues, add to config/mail.php :如果您有 ssl 问题,请添加到 config/mail.php :

'stream' => [
        'ssl' => [
            'allow_self_signed' => true,
            'verify_peer' => false,
            'verify_peer_name' => false,
        ],
    ]

Good luck everyone.大家好运。

Not a technical answer but it fixed my issue.不是技术答案,但它解决了我的问题。

If your using GMAIL to check the incoming mail just make sure you check your SPAM folder.如果您使用 GMAIL 检查收到的邮件,请确保检查您的垃圾邮件文件夹。

I've been on a project for the past four months now and I am really pissed at what am facing with Laravel right now.我过去四个月来一直在做一个项目,对Laravel现在面临的事情我感到非常生气。 It's not sending emails;它不发送电子邮件; I set it up to use the mail driver and put in the right code, but it seems not to work at all.我将其设置为使用邮件驱动程序,并输入了正确的代码,但似乎根本无法正常工作。 Besides not working, it doesn't even give me an error!除了不工作外,它甚至都不会给我一个错误!

Here is my configuration:这是我的配置:

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' => 'mail',

/*
|--------------------------------------------------------------------------
| 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' => null, 'name' => null),

/*
|--------------------------------------------------------------------------
| 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,

);

Here is my PHP code for sending email:这是我发送电子邮件的PHP代码:

$data["mail_message"] = "Hello!";

    Mail::send('emails.welcome', $data, function($message)
    {
        $message
            ->to('me@mydomain.com')
            ->from('info@otherdomain.com')
            ->subject('TEST');
    });

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM