繁体   English   中英

电子邮件验证似乎不再发送

[英]Email verification does not seem to be sending anymore

当用户使用新的电子邮件地址注册时,我想发送电子邮件验证。 所以在注册控制器我添加了这个:

public function register(Request $request)
{   
    if(Session::has('email')){
        return Redirect::back()->withErrors(['msg' => 'Email was already sent to you, please check the spam folder too.']);
    }else{
        $validatedEmail = $request->validate([
            'user_input' => 'required|unique:users,usr_email|regex:/(.+)@(.+)\.(.+)/i|max:125|min:3',
        ],[
            'user_input.required' => 'You must enter this field',
            'user_input.unique' => 'This email is already registered',
            'user_input.regex' => 'This email is not correct',
            'user_input.max' => 'Maximum length must be 125 characters',
            'user_input.min' => 'Minimum length must be 3 characters',
        ]);
        $register = new NewRegisterMemberWithEmail();
        return $register->register();
    }
}

因此,如果电子邮件有效,它将调用一个帮助类NewRegisterMemberWithEmail ,如下所示:

class NewRegisterMemberWithEmail
{
    public function register()
    {
        try{
            $details = [
                'title' => 'Verify email'
            ];
            Mail::to(request()->all()['user_input'])->send(new AuthMail($details));
            Session::put('email',request()->all()['user_input']);
            return redirect()->route('login.form');
        }catch(\PDOException $e){
            dd($e);
        }
    }
}

所以它曾经工作正常并正确发送电子邮件进行验证,但我不知道为什么它现在不发送电子邮件。

事实上,我已经用不同的邮件服务提供商对此进行了测试,对于YahooGmail ,电子邮件都没有以某种方式收到!

但是对于我所在国家/地区的本地邮件服务提供商,电子邮件已正确发送!

我真的不知道这里发生了什么,因为逻辑似乎很好......

所以如果你知道,请告诉我......我真的很感谢你们的任何想法或建议。

如果您想看一下,这也是我的AuthMail类:

class AuthMail 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('Sitename')->view('emails.AuthMail');
    }
}

当我将Gmail用作smtp时,我曾经遇到过同样的问题。

原因:

当我们直接在 smtp 设置中使用我们的Gmail密码时,由于某些 Gmail policies ,它会在某个时间(几个月)后被阻止并停止发送电子邮件。

解决方案:

我们需要从我们的 Gmail 安全性中创建一个app-password ,并在smtp设置中使用该密码。 下面的谷歌文章将指导:

如何在gmail上创建应用程序密码

laravel 的laravel smtp 设置:
MAIL_MAILER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=<your-email>
MAIL_PASSWORD=<app-password>
MAIL_ENCRYPTION=tls

我希望这会对你有所帮助。

如果您使用谷歌邮件发送电子邮件,那么我们有同样的问题。

2022 年 5 月 30 日,Google 将停止支持安全性较低的应用程序或第三方应用程序。

这就是我认为您的发送邮件不起作用的原因(如果您使用谷歌邮件作为邮件发件人,请考虑这个答案)

我在发送电子邮件时遇到问题,尤其是发送到 gmail 帐户。 所以我改变了我的方法并克服了这个问题。

请在下面查看我的答案

Laravel 电子邮件

示例邮件类

<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Symfony\Component\Mime\Email;

class OrderInfoMail extends Mailable
{
    use Queueable, SerializesModels;

    /**
     * Create a new message instance.
     *
     * @return void
     */
    public $data;

    public function __construct($data)
    {
        $this->data = $data;
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        $this
            ->subject('Order Confirmation')
            ->from('noreply@app.xxx.co.uk', 'XXX Portal')
            ->view('orders.templates.order-form')
            ->with([
                'name' => $this->data->name,
                'sales_representative_name' => $this->data->sales_representative_name,
                'sales_representative_phone' => $this->data->sales_representative_phone,
                "items" => $this->data->items,
                "address" => $this->data->address,
                "net" => $this->data->net,
                "payment" => $this->data->payment,
                "balance" => $this->data->balance,
            ]);

        $this->withSymfonyMessage(function (Email $message) {
            $message->getHeaders()->addTextHeader(
                'X-Mailer', 'PHP/' . phpversion()
            );
        });

        return $this;
    }
}

用法

$email = 'a@b.com'; // pls change
$name = 'ab';// pls change

$data = new \stdClass();
$data->name = $name;
$data->sales_representative_name = \App\User::find(Auth::user()->id)->name;
$data->sales_representative_phone = \App\User::find(Auth::user()->id)->phones->first()->number;
$data->items = $order_items;
$data->address = $address;
$data->net = $net;
$data->payment = $payment;
$data->balance = $balance;

Mail::to($email)->send(new \App\Mail\OrderInfoMail($data));

我认为问题不在于您的代码。 我认为这与您发送的做法有关。 一种解决方案是使用旨在发送电子邮件的服务,例如 SparkPost(完全披露我为 SparkPost 工作)。 还有很多其他的。 这些服务可以帮助您确保遵循电子邮件最佳做法。

您可以在没有电子邮件服务的情况下完成这项工作,但至少您应该验证您是否遵循 MAAWG 提出的最佳实践: https ://www.m3aawg.org/published-documents

暂无
暂无

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

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