2017-02-19 3 views
1

Я обновляюсь от Laravel 4.1 до 5.4. Миграция в очередь сложна.Confused about Laravel 5 Очередь для отправки почты (Laravel 5.4)

Во-первых, я закомментирована iron маршрут из маршрутов:

Route::post('queue/receive', function() 
{ 
    return Queue::marshal(); 
}); 

Затем я установил драйвер базы данных и мигрировали jobs таблицу:

php artisan queue:table 
php artisan migrate 

Я изменил Mail::queue коды к Mailables, как это:

Mail::to('[email protected]')->send(new ForgotPassword($user->first_name)); 

I su перешел на отправку писем синхронно (без очереди). Затем я перешел в очередь:

Mail::to('[email protected]')->queue(new ForgotPassword($user->first_name)); 

И, наконец, я запускаю эту команду из консоли:

php artisan queue:listen 

Когда Mail::to линии выполняются, строка вставляется в Jobs таблицы, но почта ISN» t отправлено. Как я могу решить эту проблему? (Job класс?

+0

Когда вы заводите свои журналы 'tail -f storage/logs/laravel.log', вы видите какие-либо ошибки в журнале? –

+0

'Mail :: to' строка не дает ошибок. Но команда 'php artisan queue: listen' приводит к' SQLSTATE [22003]: числовое значение вне диапазона: 1264 Значение вне диапазона для «попыток столбца». – horse

+0

Каков тип данных для столбца 'попытки'? Вы можете захотеть перейти на нечто большее, например 'BIGINT' –

ответ

2

Основное различие между синхронным send() и асинхронным queue(), что касается вашего объекта ForgotPassword, заключается в том, что при очереди объект для отправки, он должен быть сериализован для отправки в очередь и неэтериализован, когда работник очереди обрабатывает его.

С send() работает отлично, но ошибка происходит с queue(), и мы можем видеть, что в очереди задания обжигают и предпринимается попытка быть обработаны, то, скорее всего, ошибка в сериализации/unserialization.

Ваш класс ForgotPassword, вероятно, использует признак SerializesModels, так как команда artisan создает новый объект, способный к пересылке. Этот признак определяет методы __sleep() и __wakeup(), которые изменяют работу сериализации и несериализации.

Когда реализован метод __sleep, PHP будет сериализовать переменные, возвращаемые методом __sleep. В этом случае реализация, обеспечиваемая признаком SerializesModels, использует Reflection для прохождения свойств, определенных в классе, чтобы обеспечить особый способ сериализации моделей и коллекций Eloquent.

Из-за этого это означает, что любые переменные в вашем классе ForgotPassword, которые конкретно не определены как свойство класса, не будут сериализованы и не будут доступны при обработке задания в очереди, а класс неэтериализован , Это наиболее вероятная причина для вашей проблемы. Когда ваша задача предпринимается попытка, ваш несертифицированный экземпляр с электронной почтой не имеет необходимых данных и не работает.

Существует два способа решить эту проблему. Во-первых, если вашему ForgotPassword на самом деле не нужно сериализовать какие-либо модели, вы можете удалить признак SerializedModels. Это приведет к удалению определения __sleep() из класса, а затем все переменные, назначенные классу, а не только те, которые определены на самом деле, будут сериализованы и также будут доступны, если класс неэтериализован.

Второй вариант, который является более подходящим и более явным, заключается в том, чтобы фактически определить необходимые свойства для вашего класса ForgotPassword.

Если вы определяете свойства своего класса, вы можете оставить свой признак SerializesModels в своем классе. Однако, если вы на самом деле не сериализуете модели, я бы пошел и убрал его. Если вам это не нужно, нет необходимости в дополнительных расходах на сериализацию.

0

Возможно, вам придется отредактировать существующий файл .env в папке проекта на вашем компьютере. Ищите файл .env, откройте его через возвышенный текст и отредактируйте его.

Редактировать с помощью идентификатора и пароля электронной почты, с которого вы собираетесь отправлять письма.

0

Вы можете отправить почту с помощью очереди Laravel смотрите пример,

Определение Job

public function handle() 
{ 
     $mail_meta_data = $this->send_data; 
     $require_data = $this->require_data; 
     Mail::queue($mail_meta_data['view_name'], ['data'=>$require_data], function($message) use ($mail_meta_data, $require_data) { 
      //$message->from($mail_meta_data['to'], $mail_meta_data['name']); 

      $message->to($mail_meta_data['to'])->subject($mail_meta_data['subject']); 
     }); 
} 

Вызвать работу

dispatch(new SendEmailNotification($mail_meta_data, $require_data)); 

.env

MAIL_DRIVER=smtp 
MAIL_HOST=smtp.sendgrid.net 
MAIL_PORT=587 
MAIL_USERNAME=smtp_username 
MAIL_PASSWORD=smptp_password 
MAIL_ENCRYPTION=tls 

APP_EMAIL=email sent from 
APP_NAME=Name of Email sender 

Примечание

  1. Убедитесь, что вы установили выше конфигурации почты в файле .env или в конфигурации/mail.php
  2. Также PHP очереди ремесленник: послушай работает
+0

Mail :: queue or Mail :: отправить в hande? Не работает ли ручка очереди? Поэтому я думаю, что это должно быть Mail :: send. – horse

+0

yes Mail :: queu, вы можете найти больше здесь https://laravel.com/docs/5.1/mail#quue-mail – Chintan7027

Смежные вопросы