Laravel App \ Mail - неверный аргумент для foreach () - Mail - PullRequest
0 голосов
/ 26 февраля 2020

У меня проблема с App\Mail::.

Mail::to(['...@gmail.com'])->send(new NewOrdersRegistered('', ''));

Как, черт возьми, это дает исключение ошибки> Недопустимый аргумент для foreach ()?

Я также пытался:

Mail::to('...@gmail.com')->send(new NewOrdersRegistered('', ''));

Код Laravel, выдающий исключение:

protected function buildRecipients($message){
    foreach (['to', 'cc', 'bcc', 'replyTo'] as $type) {
        foreach ($this->{$type} as $recipient) {
            $message->{$type}($recipient['address'], $recipient['name']);
        }
    }
    return $this;
}

Но получил ту же ошибку! У меня есть тот же код в другом проекте, который работает как шарм.

Спасибо за любую помощь.

Контроллер:

<?php

namespace App\Http\Controllers;

use App\Lamimail;
use App\LamimailOrders;
use App\LamimailLines;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\Mail;
use App\Mail\NewOrdersRegistered;
use PDO;
use DB;
use Auth;


class LamimailController extends Controller
{
    /**
     * Instantiate a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        // calls the middleware: SetDatabaseConnection
        $this->middleware('SetDatabaseConnection:lamimail');
    }

    /**
     * Obtem todas as encomendas (+linhas) em aberto no AS400 e insere na db caso não existam
     */
    public function cronjob1_execute ()
    {
        // Obtem os Utilizadores do Grupo Expedição
        $utilizadores_expedic = DB::connection('lamiapps')->table('tbl_users')->select('email')->where('group_id', '=', 3)->get();

        //dd($utilizadores_expedic);

        //dd($utilizadores_expedic[0]->name);
        Mail::to($utilizadores_expedic->email)->send(new NewOrdersRegistered('', ''));

        dd('end');

    }

    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        return view('lamimail.index');
    }
}

Ответы [ 2 ]

2 голосов
/ 27 февраля 2020

Вы не передаете электронное письмо функции, вы пытаетесь передать свойство коллекции (email), которая не существует. Это не удается (и, вероятно, выдает ошибки в вашем журнале), поэтому функция отправляется null в качестве параметра.

    $utilizadores_expedic = DB::connection('lamiapps')
        ->table('tbl_users')
        ->select('email')
        ->where('group_id', '=', 3)
        ->get();
    // $utilizadores_expedic is now a collection of stdClass objects
    // but you are trying to get its email property which does not exist
    Mail::to($utilizadores_expedic->email)
        ->send(new NewOrdersRegistered('', ''));

Согласно документации ,

Метод to принимает адрес электронной почты, экземпляр пользователя или коллекцию пользователей. Если вы передадите объект или коллекцию объектов, почтовая программа автоматически использует их свойства email и name при настройке получателей электронной почты, поэтому убедитесь, что эти атрибуты доступны для ваших объектов.

Вот, вероятно, то, что вы хотите:

    $utilizadores_expedic = DB::connection('lamiapps')
        ->table('tbl_users')
        ->select(['email', 'name'])
        ->where('group_id', '=', 3)
        ->get();
    Mail::to($utilizadores_expedic)
        ->send(new NewOrdersRegistered('', ''));

Хотя я всегда обеспокоен, когда вижу, что кто-то использует фасад DB. Обычно это означает, что модели не настроены должным образом. Это было бы больше похоже на Laravel способ получить это:

    $utilizadores_expedic = Group::find(3)->users;
    Mail::to($utilizadores_expedic)
        ->send(new NewOrdersRegistered('', ''));
0 голосов
/ 27 февраля 2020

Наконец-то обнаружена проблема.

Мы не можем определить protected $replyTo; в App \ Mail \ NewOrderRegistered, в противном случае среда будет перехватывать эту переменную.

Я определил это потому, что у меня может быть replyTo на основе некоторых случаев.

Теперь я понял, что правильный подход:

public function __construct($replyTo, $email_data)
{
    // If $replyTo has data, attach to email
    if (!empty($replyTo)) {
        $this->replyto($this->replyTo['email'], $this->replyTo['name']);
    }

    // set email data
    $this->email_data = $email_data;

    // set email subject
    $this->subject('...');
}

Спасибо всем, кто пытался мне помочь. С наилучшими пожеланиями, Хелдер

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...