Point Laravel's Mail facade at sendvia's SMTP relay, send one email, and find it in your send log. Requires the paid SMTP add-on.
Create a sendvia account and a key is issued immediately, sitting on the Account page, prefixed sv_live_. Every example below writes it as a placeholder:
sv_live_xxxxxxxxxxxxxxxxxxxxxxxx
You also need a domain verified in your account, since the mail below is sent from an address on it. Add one under Domains if you have not already, and give its DNS records time to propagate.
Laravel already has a place for this: the mail configuration. Point it at sendvia's relay and every existing Mail:: call in the app starts leaving through sendvia with no other code changes.
MAIL_MAILER=smtp
MAIL_HOST=smtp.sendvia.io
MAIL_PORT=587
MAIL_USERNAME=sendvia
MAIL_PASSWORD=sv_live_xxxxxxxxxxxxxxxxxxxxxxxx
MAIL_ENCRYPTION=tls
[email protected]
MAIL_FROM_NAME="${APP_NAME}"
The username field accepts anything; sendvia authenticates on the password alone, which is the API key above. If a host blocks 587, switch MAIL_PORT to 2525 and nothing else changes.
Mail::raw('This is a test email sent through sendvia.', function ($message) {
$message->to('[email protected]')
->subject('Hello from sendvia');
});
There is no response body to read here the way a REST call has one. Laravel's mailer throws on a connection or authentication problem, but a clean run through does not by itself prove the email went anywhere: sendvia can still refuse the message after accepting it. The next step is where you find out what actually happened.
SMTP sends land in the same send log as API sends, tagged with an SMTP badge so the two are easy to tell apart. Check the History page, or query the API directly with the same key:
curl "https://api.sendvia.io/v1/[email protected]" \
-H "Authorization: Bearer sv_live_xxxxxxxxxxxxxxxxxxxxxxxx"
{
"total": 1,
"limit": 25,
"offset": 0,
"logs": [
{
"id": 42,
"to_address": "[email protected]",
"from_address": "[email protected]",
"subject": "Hello from sendvia",
"status": "delivered",
"error_message": null,
"sent_at": "2026-08-20 10:03:01",
"delivered_at": "2026-08-20 10:05:01"
}
]
}
The row moves from queued to sent within moments of the relay accepting it. What comes after is the part worth reading carefully: sendvia never receives a delivery confirmation from the recipient's mail server, over SMTP or the API. Two minutes after a clean send it marks the message delivered on its own, an inference from the absence of a bounce rather than a receipt. A real bounce or failure overwrites that status the moment one arrives; nothing plays the same role for an honest delivery. Logs like this stick around for 7 to 90 days, depending on your plan.
Neither failure below throws an exception Laravel's own mailer will show you: the relay accepts the SMTP session either way, and sendvia's own checks decide what happens to the message behind it. The log is where you actually see which one you hit.
A new SES account starts inside Amazon's sandbox: 200 emails a day, sent only to recipient addresses you have verified yourself in the SES console, pending an AWS review that usually takes 12 to 24 hours. Send to any other address while sandboxed and the log shows status: "failed" with AWS's own rejection reason sitting in error_message, the same as it would for a send through the REST API.
Verify the test recipient in the SES console while you wait, or request production access, which lifts the restriction for every recipient at once.
sendvia checks the domain on MAIL_FROM_ADDRESS against the domains verified on your account, the same rule the REST API enforces as a 422 before it ever calls AWS. Get that wrong, typically by pointing Laravel at a domain you have not added yet, and the message never leaves. There is no response body to read the way a REST call gives you one, so confirm the domain's status directly on the Domains page rather than guessing from Laravel's side.
Add the domain if it is missing, publish the DNS records sendvia gives you, and resend once the check passes.
| Symptom | Cause | Fix |
|---|---|---|
Log status failed, AWS rejection in error_message | SES sandbox: the recipient is not verified | Verify the recipient in SES, or request production access |
| No mail arrives, nothing in Laravel throws | The from domain is not verified on your account | Add and verify the domain under Domains |