在 Laravel 8 上自动发送电子邮件
Send an automatic email on Laravel 8
我正在做一个 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), 但我必须把它放在哪里?
非常感谢您的帮助!
您的 laravel 应用程序可能因不安全而被 google 服务阻止,因此您需要在您的 gmail 帐户中允许新应用程序。转到此链接:
- https://myaccount.google.com/lesssecureapps?pli=1
- https://accounts.google.com/b/0/DisplayUnlockCaptcha
并检查安全选项。
申请授权后,您需要稍等片刻。
有时更改在 GMAIL 帐户中生效需要 20-30 分钟。所以请耐心等待
尝试将 MAIL_HOST=smtp.gmail.com
更改为 MAIL_HOST=smtp.googlemail.com
我成功了!我遵循了 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 邮件
<?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');
}
}
查看电子邮件很简单blade。
那么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 的项目,我需要在用户每次单击按钮时发送一封自动邮件。我已经创建了所有结构,甚至遵循了一些教程,因为我不知道如何去做,但即使我看到“电子邮件已发送”页面,电子邮件也不会显示在 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), 但我必须把它放在哪里?
非常感谢您的帮助!
您的 laravel 应用程序可能因不安全而被 google 服务阻止,因此您需要在您的 gmail 帐户中允许新应用程序。转到此链接:
- https://myaccount.google.com/lesssecureapps?pli=1
- https://accounts.google.com/b/0/DisplayUnlockCaptcha
并检查安全选项。
申请授权后,您需要稍等片刻。 有时更改在 GMAIL 帐户中生效需要 20-30 分钟。所以请耐心等待
尝试将 MAIL_HOST=smtp.gmail.com
更改为 MAIL_HOST=smtp.googlemail.com
我成功了!我遵循了 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 邮件
<?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');
}
}
查看电子邮件很简单blade。 那么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');
所有这些工作都很完美,现在我将插入请求的数据,我就完成了。谢谢大家的帮助!