首页 > 解决方案 > Lumen 框架使用队列和工作不工作发送电子邮件

问题描述

已经为此案例进行了所有配置,通过 Composer 使用与 Lumen 8.0 相同的版本安装了照明/邮件包。

在 .env 文件上配置邮件服务器。

创建了包含 queue.php 和 mail.php 文件的配置文件夹。

取消注释$app->withFacades();$app->withEloquent();添加:

$app->withFacades(true, [
'Illuminate\Support\Facades\Mail' => 'Mail',
]);

$app->configure('app');
$app->configure('mail');

$app->register(Illuminate\Mail\MailServiceProvider::class);
$app->alias('mail.manager', Illuminate\Mail\MailManager::class);
$app->alias('mail.manager', Illuminate\Contracts\Mail\Factory::class);
$app->alias('mailer', Illuminate\Mail\Mailer::class);
$app->alias('mailer', Illuminate\Contracts\Mail\Mailer::class);
$app->alias('mailer', Illuminate\Contracts\Mail\MailQueue::class);

也已经执行了 php artisan queue:table 和 php artisan migrate`

我的工作文件 app/Jobs/SubmitEmailJob.php:

<?php

namespace App\Jobs;

use Illuminate\Support\Facades\Mail;

use App\Mail\FormEmail;

class SubmitEmailJob extends Job
{
/**
 * Create a new job instance.
 *
 * @return void
 */
public function __construct($details)
{
    $this->details = $details;
}

/**
 * Execute the job.
 *
 * @return void
 */
public function handle()
{
    // $email = new FormEmail($this->details);
    // Mail::to($this->details['email'])->send($email);

    Mail::to($details['email'])->send(new FormEmail($details));
}

}

可邮寄文件 app/Mail/FormEmail.php:

<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;

class FormEmail extends Mailable
{
    use Queueable, SerializesModels;

// protected $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->from('my_email_address_here@gmail.com', 'Gmail')
    ->subject('Confirmation Email')
    ->view('email_text')->with(['details'=>$this->details]);
}

}

我的控制器方法:

public function create(Request $request)
{
    $user = new User;
    $user->first_name = $request->input('first_name');
    $user->last_name = $request->input('last_name');
    $user->email = $request->input('email');
    $user->birthday = $request->input('birthday');
    $user->gender = $request->input('gender');

    $file = $request->file('cv');
    $filename = base64_encode($file->getClientOriginalName());
    $destinationPath = storage_path('uploads/user_cv/');
    $userCvPathName = 'uploads/user_cv/'.base64_decode($filename);
    $request->file('cv')->move($destinationPath, base64_decode($filename));

    $user->user_cv = $userCvPathName;

    $user->save();

    //Email sending

    $details = [
        'first_name'    => $request->input('first_name'),
        'last_name'     => $request->input('last_name'),
        'email'         => $request->input('email'),
    ];

    $emailJob = (new SubmitEmailJob($details));
    dispatch($emailJob);

    //Already tried to send email without jobs and queues and its working
    // Mail::to($details['email'])->send(new FormEmail($details));

    return response()->json($user);
}

我不明白我在这里缺少什么

标签: laravelemailqueuelumen

解决方案


好的,通过使用以下命令创建 failed_jobs 数据库表解决了问题:

php artisan queue:failed-table

php artisan migrate

protected $details;我还必须在作业类中声明一个变量。

谁在流明中为这个或其他事情苦苦挣扎,最好检查错误日志:storage/logs/


推荐阅读