【问题标题】:Laravel send email to address from databaseLaravel 向数据库中的地址发送电子邮件
【发布时间】:2018-07-24 09:39:42
【问题描述】:

在我的索引视图中,我显示了所有用户,并且有一个按钮可以将用户状态更改为活动和非活动。代码如下所示:

@foreach($users as $user)
    <tr>
        <td>{{$user->name}}</td>
        <td>{{$user->surname}}</td>
        <td>{{$user->email}}</td>
        <td>
            @if($user->is_active == 0)
                {!! Form::model($user, ['method' => 'PUT', 'action'=>['AdminUserController@activateuser', $user->id]]) !!}
                    {!! Form::submit('Activate', ['class'=>'btn btn-primary']) !!}
                {!! Form::close() !!}
            @else
                {!! Form::model($user, ['method' => 'PUT', 'action'=>['AdminUserController@activateuser', $user->id]]) !!}
                    {!! Form::submit('De-Activate', ['class'=>'btn btn-danger']) !!}
                {!! Form::close() !!}
            @endif
        </td>
        <td>{{$user->cell}}</td>
        <td><button class="btn btn-primary">View Property</button></td>
        <td><button class="btn btn-danger">Delete</button></td>
    </tr>
@endforeach

因此,当我单击激活/停用按钮时,我会触发控制器的 activateuser 功能。激活后,会发送一封电子邮件。 控制器如下所示:

public function activateuser(Request $request, $id){
    $user = User::findOrFail($id);
    if($user->is_active == 0){
        $user->update([$user->is_active = 1]);
        Mail::send(new activateUser());
    }
    else{
        $user->update([$user->is_active = 0]);
    }
    return redirect()->back();
}

目前这封电子邮件是发给我自己的,我的 Mailabçe 看起来像这样:

public function build()
{
    return $this->view('emails.activateuser')->to('wosleybago@gmail.com');
}

我想要的是将电子邮件从数据库表中的用户电子邮件发送到电子邮件地址。

我该怎么做?

所以,我应该得到 $user->email

【问题讨论】:

    标签: laravel laravel-mail


    【解决方案1】:

    我通常希望我的电子邮件包含本身中的所有信息,所以我传递User 实例或任何包含撰写邮件所需数据的实例。

    所以Mailable__construct(..) 像这样:

    /**
     * @var \App\User
     */
    public $user; // since this is a public property its going to be available in view of mailable as $user
    
    __construct(App\User $user) {
        $this->user = $user;
    
        // further more I set the to(), this is what you are after
        $this->to($user->email, $user->name);
    
        // and subject
        $this->subject('You are activated!');
    }
    
    ...
    

    现在您需要在控制器中执行以下操作:

    Mail::send(new activateUser($user));
    

    如上所述,$user 在邮件视图中可用,因此您也可以在那里使用它:

    Hi, {{ $user->name }},
    ...
    

    注意:把activateUser改成ActivateUser改成follow PSR-2

    类名必须在StudlyCaps中声明。


    我也使用排队邮件,所以我在 Mailable 类上设置了 $timeout$tries 属性。

    【讨论】:

    • 我似乎更了解这个答案,因为它几乎就像他们在文档中使用的一样。我收到了带有主题的电子邮件,但我似乎没有看到名称。相反,在主题上方我看到“示例”
    • @deSousa 我认为您的$user-&gt;name 在数据库中将'Example' 设置为name,对吗? :) 你可以改用$this-&gt;to($user-&gt;email)
    • 一点也不。当我在视图中使用 $user->name 时,我得到了正确的名称。但是电子邮件收件人(希望是正确的词)名称显示为示例
    • @deSousa 嗯,您可以尝试使用dd() 调试它,在构造函数的末尾插入dd($this); 并查看+to 属性中的内容。它应该如下所示+to: array:1 [0 =&gt; array:2 ["name" =&gt; "Mr. Joe Doe", "address" =&gt; "joe@doe.com"]]
    • 只是为了澄清。你的代码是对的。如果我检查我的电子邮件,在“收件人”部分,它会给我发送电子邮件的人的电子邮件以及姓名。但在“发件人”部分我看到:发件人:示例“我的电子邮件地址”我通过 .env 文件设置发件人
    【解决方案2】:

    发送电子邮件在文档中描述:https://laravel.com/docs/5.6/mail#sending-mail

    将此代码放入 activateUser() 函数中

    Mail::to($user)->send(new YourMailableName());
    

    不要忘记使用“use”关键字导入 Mail 和 YourMailableName。

    或者您可以使用用户电子邮件代替对象

    Mail::to($user->email)->send(new YourMailableName());
    

    并从您的 Mailable/ 中删除 ->to('wosleybago@gmail.com')

    【讨论】:

    • 我试过了,效果很好。如何配置电子邮件的主题?我试过这个但它给出了一个错误:Mail::to($user->email)->subject('Account Activation')->send(new activateUser());
    • 在构建函数中使用可邮寄的主题函数。 return $this->view('emails.activateuser')->subject('Subject');
    【解决方案3】:

    你应该在创建新的 activateUser 实例时传递用户电子邮件,像这样

     Mail::send(new activateUser($user->email));
    

    以后再使用这个属性。

    【讨论】:

      【解决方案4】:

      向特定的人发送电子邮件非常简单。我的建议如下:

      • 稍后使用队列发送邮件,因为控制器需要一些时间来响应查看。
      • 在现有代码中,您可以获取当前用户的电子邮件并使用 laravel 的邮件功能附带的帮助器 to() 将其发送。 你可以这样编码。

        if($user->is_active == 0){
            $user->update([$user->is_active = 1]);
            Mail::to($user->email)->send(new MailableClassInstance);
        }
        

      【讨论】:

      • 我还认为需要使用队列。在@Kyslik 之后,我如何使用队列。我试图在控制器内部添加,但它并没有真正起作用: Mail::queue(send(new ActivateUser($user)));还尝试添加可邮寄的构造器,但也不起作用。
      • 请点击此链接以了解有关如何使用队列在后端发送电子邮件的更多信息。 laravel.com/docs/5.6/queues#creating-jobs你会找到所有相关的细节。
      猜你喜欢
      • 1970-01-01
      • 2020-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-01
      • 2022-10-18
      • 1970-01-01
      • 2014-07-20
      相关资源
      最近更新 更多