在 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")-&gt;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 中未发送电子邮件

Laravel 8:将异常呈现为电子邮件的 html

laravel 4 中的每周电子邮件通讯

如何在 laravel 5.8 中使用 mailchimp 发送简单邮件

在 Laravel 5 上检查邮件是不是发送成功

Laravel 密码重置电子邮件未在 Heroku 上使用 gmail 发送