Reduces job processing time by avoiding repeated TCP connect, TLS
handshake, and SMTP AUTH on every email sent.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The Mails worker span logs were missing project.id, project.sequence,
project.region, and project.database because setProject was never
called on queueForMails. This adds setProject in the shared API
controller and in workers (Webhooks, Migrations) that trigger mails.
Also injects project into the Mails worker action.
\Exception doesn't work as a catch-all because not everything extends
\Exception. For example, there was a problem where the messaging worker
didn't catch an exception here:
} catch (\Exception $e) {
$deliveryErrors[] = 'Failed sending to targets ' . $batchIndex + 1 . '-' . \count($batch) . ' with error: ' . $e->getMessage();
} finally {
As such, $deliveryErrors stayed as an empty array. In this case, the
$adapter->send() threw a TypeError which extends Error which implements
Throwable. Updating the catch to catch \Throwable ensures the error is
caught and $deliveryErrors gets updated.
Update the mails worker to only be responsible for building the final
email using the base (layout) template and the user, team, project, and
redirect variables.
It is the responsibility of the controller to perform localization and
determine whether a custom or default email template should be used.
If the default one is used, it has to be rendered using the hello,
footer, thanks, and signature variables so that it matches the custom
template. Then, it can be sent to the worker.