. */ declare(strict_types=1); namespace FireflyIII\Jobs; use Exception; use FireflyIII\Exceptions\FireflyException; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Mail\Message; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\SerializesModels; use Illuminate\Support\Facades\Log; use Mail; use Symfony\Component\Mailer\Exception\TransportException; /** * Class MailError. * */ class MailError extends Job implements ShouldQueue { use InteractsWithQueue; use SerializesModels; protected string $destination; protected array $exception; protected string $ipAddress; protected array $userData; /** * MailError constructor. * * @param array $userData * @param string $destination * @param string $ipAddress * @param array $exceptionData */ public function __construct(array $userData, string $destination, string $ipAddress, array $exceptionData) { $this->userData = $userData; $this->destination = $destination; $this->ipAddress = $ipAddress; $this->exception = $exceptionData; $debug = $exceptionData; unset($debug['stackTrace']); unset($debug['headers']); Log::error(sprintf('Exception is: %s', json_encode($debug))); } /** * Execute the job. * * @throws FireflyException */ public function handle() { $email = (string)config('firefly.site_owner'); $args = $this->exception; $args['loggedIn'] = $this->userData['id'] > 0; $args['user'] = $this->userData; $args['ip'] = $this->ipAddress; $args['token'] = config('firefly.ipinfo_token'); if ($this->attempts() < 3 && strlen($email) > 0) { try { Mail::send( ['emails.error-html', 'emails.error-text'], $args, function (Message $message) use ($email) { if ('mail@example.com' !== $email) { $message->to($email, $email)->subject((string)trans('email.error_subject')); } } ); } catch (Exception | TransportException $e) { // intentional generic exception $message = $e->getMessage(); if (str_contains($message, 'Bcc')) { app('log')->warning('[Bcc] Could not email or log the error. Please validate your email settings, use the .env.example file as a guide.'); return; } if (str_contains($message, 'RFC 2822')) { app('log')->warning('[RFC] Could not email or log the error. Please validate your email settings, use the .env.example file as a guide.'); return; } Log::error($e->getMessage()); Log::error($e->getTraceAsString()); } } } }