在 Laravel 8 上发送自动电子邮件
Posted
技术标签:
【中文标题】在 Laravel 8 上发送自动电子邮件【英文标题】:Send an automatic email on Laravel 8 【发布时间】:2021-11-18 00:39:24 【问题描述】:我正在使用 Laravel 8 做一个项目,每次用户单击按钮时我都需要发送一封自动邮件。我已经创建了所有结构,甚至遵循了一些教程,因为我不知道该怎么做,但是即使我看到“已发送电子邮件”页面,电子邮件也不会显示在 gmail 上。 我真的需要一些帮助(即使我确定问题很愚蠢,但我找不到错误)。 于是就有了代码。 这是我的 .env:
MAIL_MAILER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=myemail@gmail.com
MAIL_PASSWORD=mypassword
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=myemail@gmail.com
MAIL_FROM_NAME="$APP_NAME"
这是我的路线:
Route::get('send', 'App\Http\Controllers\mailController@sendEmail');
邮件控制器:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Mail;
use DB;
use PDF;
use App\Mail\TestMail;
class mailController extends Controller
public function sendEmail()
$details = [
'title' => 'Mail from veronica',
'body' => 'This is for testing'
];
Mail::to("receivermail@gmail.com")->send(new TestMail($details));
return "Email sent";
TestMail(在 App\Mail 中):
<?php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
class TestMail extends Mailable
use Queueable, SerializesModels;
public $details;
/**
* Create a new message instance.
*
* @return void
*/
public function __construct($details)
$this->details = $details;
/**
* Build the message.
*
* @return $this
*/
public function build()
return $this->subject('Test Mail from Veronica')->view('mail');
最后是mail.blade.php:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Test Mail</title>
</head>
<body>
<h1>$details['title']</h1>
<p>$details['body']</p>
<p>Thank you</p>
</body>
</html>
这就是我修改的所有内容,正如我所说,如果我转到 http://localhost:8000/send 我可以看到“已发送电子邮件”,但我没有收到邮件。
如果可以我想问另一件事,下一步是在邮件中附加一个带有一些信息的 .pdf,我知道我必须使用 ->attachData("document.pdf", $pdf) ,但我必须把它放在哪里?
非常感谢您的帮助!
【问题讨论】:
配置您的详细信息后,您是否使用php artisan config:clear
清除了配置缓存? .从控制器中删除重复的类 use App\Http\Requests;
和 use App\Http\Controllers\Controller;
。您已经在控制器顶部定义了这些。
是的,我已经在配置后完成了,但它不起作用。哦,对不起,我要删除重复的课程,没有看到他们!谢谢!
您应该在构建方法中附加在可邮寄类 (TestMail) 中的文件。你的代码看起来不错。问题可能与 Gmail 相关,因为您是从本地机器调用 SMTP,而没有 https。有可能,Gmail 会将您的邮件标记为危险邮件。发送邮件尝试dump return,说不定会有什么问题(dd(Mail::to("receivermail@gmail.com")->send(new TestMail($details));)
)
它返回'null',也就是说它没有发送任何东西?
代码看起来不错,我的建议是首先尝试在 MailTrap 等服务中捕获这些电子邮件或使用 Laravel Log,因为我认为该问题可能与您的 Google SMTP 配置有关。
【参考方案1】:
您的 laravel 应用可能会被 google 服务阻止为不安全,因此您需要在您的 gmail 帐户中允许新应用。去这个链接:
-
https://myaccount.google.com/lesssecureapps?pli=1
https://accounts.google.com/b/0/DisplayUnlockCaptcha
并检查安全选项。
授权应用后,需要稍等片刻。 有时更改需要 20-30 分钟才能在 GMAIL 帐户中生效。所以请耐心等待
【讨论】:
【参考方案2】:尝试将MAIL_HOST=smtp.gmail.com
更改为MAIL_HOST=smtp.googlemail.com
【讨论】:
【参考方案3】:我能够让它工作!我遵循了 Sanam Patel 的想法并使用 MailTrap 发送电子邮件,它成功了!按照我的解决方案,也许它对有同样问题的人有用。
这是.env文件(和原来的差不多):
MAIL_MAILER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=mymail@gmail.com
MAIL_PASSWORD=mypassword
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=null
MAIL_FROM_NAME="$APP_NAME"
在 config/mail.php 我已将默认设置更改为 mailgun:
'default' => env('MAIL_MAILER', 'mailgun'),
和 smtp:
'mailers' => [
'smtp' => [
'transport' => 'smtp',
'host' => env('MAIL_HOST', 'smtp.mailgun.org'),
'port' => env('MAIL_PORT', 587),
'encryption' => env('MAIL_ENCRYPTION', 'tls'),
'username' => env('MAIL_USERNAME'),
'password' => env('MAIL_PASSWORD'),
'timeout' => null,
'auth_mode' => null,
],
使用 php artisan make:mail Mail 我已经创建了我的 Mail.php,我是这样制作的:
<?php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
class Mail extends Mailable
use Queueable, SerializesModels;
/**
* Create a new message instance.
*
* @return void
*/
public function __construct()
//
/**
* Build the message.
*
* @return $this
*/
public function build()
return $this->from('mymail@gmail.com', 'Veronica')
->view('email');
查看电子邮件是一个简单的刀片。 那么mailController.php就是:
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use App\Mail\Uscita;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;
class mailController extends Controller
/**
* Ship the given order.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function send(Request $request)
Mail::to('receivermail@gmail.com')->send(new Uscita());
路线和之前一样:
Route::get('/send', 'App\Http\Controllers\mailController@send');
所有这一切都完美无缺,现在我将插入请求的数据并完成。谢谢大家的帮助!
【讨论】:
以上是关于在 Laravel 8 上发送自动电子邮件的主要内容,如果未能解决你的问题,请参考以下文章
使用 Mailgun API 在 Laravel 8 中未发送电子邮件