在 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 帐户中允许新应用程序。转到此链接:

  1. https://myaccount.google.com/lesssecureapps?pli=1
  2. 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');

所有这些工作都很完美,现在我将插入请求的数据,我就完成了。谢谢大家的帮助!