【问题标题】:Laravel: Email not sendingLaravel:电子邮件未发送
【发布时间】:2020-06-02 02:40:23
【问题描述】:

我尝试使用模板向用户发送电子邮件。因此,在发送电子邮件之前,它应该检查用户是否在当天收到了电子邮件。就像一个用户应该只在一天内收到一封邮件,所以我添加了 if 语句,即

if (EmailSave::where('user_id',$user_id)->whereDate('created_at', Carbon::today())->exists()) {

在我添加此行后,邮件未发送,任何人都可以帮助我解决这个问题。我是 laravel 的新手。

    foreach ($users as $user) {
        foreach($auto_email_templates as $mail) {

                $email_id = $mail->id;
                $user_id = $user->id;


                if( $user->created_at < Carbon::now()->subDays($mail->days)){  //check when the acc create

                    if (EmailSave::where('user_id',$user_id)->whereDate('created_at', Carbon::today())->exists()) {

                        if (EmailSave::where('email_id',$email_id)->where('user_id',$user_id)->count()< 1){  //sent email one time only

                            if (EmailSave::where('email_id',$email_id)->where('user_id',$user_id)->whereDate('created_at', '>', Carbon::now()->addDays(30))) { //mail sent again after 30 days  

                                $mails = new EmailSave;
                                $mails->user_id = $user->id;
                                $mails->email_id =$mail->id;
                                Mail::to($user->email)->send(new Automail($mail));
                                $mails->save();

                            }  
                        }
                    }
                }
            }
          }

【问题讨论】:

  • 您可以在数据库中使用 email_status 列而不是 EmailSave::where('email_id',$email_id)->where('user_id',$user_id)->count() 的所有用户
  • 所以我将在 EmailSave 表中创建列是@Sehdev
  • 是的,然后您可以从该列检查您的电子邮件发送状态。
  • 我将如何检查状态,你能告诉我更多细节吗? @Sehdev

标签: laravel email swiftmailer


【解决方案1】:

想知道您是否已经在 .env 中设置了电子邮件凭据,如果没有,您可以尝试将 mailtrap.io 用于电子邮件沙箱。

https://mailtrap.io/ 注册您的 mailtrap 帐户,然后转到 SMTP 设置选项卡以获取您的用户名和密码。

MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=25
MAIL_USERNAME=ENTER_YOUR_MAILTRAP_USERNAME_AT_SMTP_SETTING_PAGE(should be 14 characters long)
MAIL_PASSWORD=ENTER_YOUR_MAILTRAP_PASSWORD_AT_SMTP_SETTING_PAGE(should be 14 characters long)

有一个逻辑错误需要纠正,如果符合你的要求,试试这种代码。

foreach ($users as $user) {
            foreach($auto_email_templates as $mail) {

                $email_id = $mail->id;
                $user_id = $user->id;


                if( $user->created_at < Carbon::now()->subDays($mail->days)){  //check when the acc create

                    $ableToSendMail = false;
                    if (!EmailSave::where('user_id',$user_id)->whereDate('created_at', Carbon::today())->exists()) {

                        // looks like this logic need to break down into two separate checking cause the requirement is different
                        // one is email to send one time only when there is everyday checking
                        // another one will breach first checking, which see the created_at date which more than 30 days

//                        if (EmailSave::where('email_id',$email_id)->where('user_id',$user_id)->count()< 1){  //sent email one time only
//
//                            if (EmailSave::where('email_id',$email_id)->where('user_id',$user_id)->whereDate('created_at', '>', Carbon::now()->addDays(30))) { //mail sent again after 30 days  
//
//                                $mails = new EmailSave;
//                                $mails->user_id = $user->id;
//                                $mails->email_id =$mail->id;
//                                Mail::to($user->email)->send(new Automail($mail));
//                                $mails->save();
//
//                            }
//                        }

                        // Email does not sent before, proceed to email send
                        if (EmailSave::where('email_id',$email_id)->where('user_id',$user_id)->count()< 1){  //sent email one time only
                            $ableToSendMail = true;
                        }


                        if (EmailSave::where('email_id',$email_id)->where('user_id',$user_id)->whereDate('created_at', '>', Carbon::now()->addDays(30))) { //mail sent again after 30 days
                            $ableToSendMail = true;
                        }
                    }

                    if ($ableToSendMail) {
                        $mails = new EmailSave;
                        $mails->user_id = $user->id;
                        $mails->email_id =$mail->id;
                        Mail::to($user->email)->send(new Automail($mail));
                        $mails->save();
                    }
                }
            }
        }

【讨论】:

  • 这个运行良好,但问题是我在 mailtrap 中收到任何邮件
  • 我认为这是一个逻辑错误,代码总是停在if (EmailSave::where('user_id',$user_id)-&gt;whereDate('created_at', Carbon::today())-&gt;exists()) {,因为它之前从未记录过EmailSave,并且EmailSave必须存在才可以发送电子邮件,我会修改我的答案帮你解决逻辑错误
  • 非常感谢@kurt Chun,它认为逻辑错误是-&gt;exists(),因为如果我删除邮件正在接收到mailtrap,但一个用户收到很多电子邮件......应该是一个用户需要只收到一封邮件
  • 嗨@NavanithaMoorthy,在阅读线路代码时正在按照您的要求进行构建,希望这种情况适合您。
  • 我在等它@KurtChun
猜你喜欢
  • 2019-03-05
  • 2023-03-28
  • 2017-02-11
  • 2015-10-01
  • 1970-01-01
  • 2022-08-13
  • 1970-01-01
  • 2018-07-29
  • 2018-07-08
相关资源
最近更新 更多