Documentation

Integration guide

Send your first email in a few minutes, from any language or framework.

There is no API to learn: point your app's existing SMTP settings at smtp.email4vibecoder.com. Below are copy-paste examples for the stacks people use most.

Quick start

We are a plain SMTP server, so there is no SDK to install and no vendor lock-in. Anything that can send email already works. You need four settings:

Hostsmtp.email4vibecoder.com
Port587 with STARTTLS, or 465 with implicit TLS
Usernamefrom SMTP credentials in your dashboard
Passwordshown once when you create the credential

Put them in your environment rather than your source code, and never commit the password:

.env
SMTP_HOST=smtp.email4vibecoder.com
SMTP_PORT=587
SMTP_USER=your-username
SMTP_PASS=your-password
MAIL_FROM="Your App <[email protected]>"

Two rules worth knowing before your first send. The From address must be on a domain you have verified in Domains — that is what lets us DKIM-sign your mail. And create a separate credential per app or environment, so you can revoke one without touching the rest.

Let your AI assistant wire it up

Paste this into Cursor, Claude Code, Lovable, Bolt or Replit and it will add email to your app using whatever library your stack already uses:

prompt
Add transactional email to this app using SMTP.

Read these from environment variables (never hard-code them):
  SMTP_HOST=smtp.email4vibecoder.com
  SMTP_PORT=587        # STARTTLS (or 465 for implicit TLS)
  SMTP_USER=<username from the dashboard>
  SMTP_PASS=<password from the dashboard>
  MAIL_FROM=hello@<my verified domain>

Create one sendEmail(to, subject, html) helper using this stack's
standard SMTP library, then use it for sign-up confirmation and
password-reset emails. Log and surface errors instead of failing
silently.

Node.js

Install nodemailer, then reuse a single transporter — creating one per message opens a new connection every time.

email.js
import nodemailer from 'nodemailer';

const transporter = nodemailer.createTransport({
  host: process.env.SMTP_HOST,
  port: 587,
  auth: { user: process.env.SMTP_USER, pass: process.env.SMTP_PASS },
});

await transporter.sendMail({
  from: process.env.MAIL_FROM,
  to: '[email protected]',
  subject: 'Welcome aboard!',
  html: '<p>Thanks for signing up.</p>',
});

Next.js

Send from a route handler or a server action, never from the browser. Add export const runtime = 'nodejs': the Edge runtime has no TCP sockets, so SMTP cannot work there.

app/api/send/route.ts
import nodemailer from 'nodemailer';

export const runtime = 'nodejs';

const transporter = nodemailer.createTransport({
  host: process.env.SMTP_HOST,
  port: 587,
  auth: { user: process.env.SMTP_USER!, pass: process.env.SMTP_PASS! },
});

export async function POST(req: Request) {
  const { to, subject, html } = await req.json();
  await transporter.sendMail({ from: process.env.MAIL_FROM, to, subject, html });
  return Response.json({ sent: true });
}

Python

No dependencies needed — the standard library speaks SMTP.

send_email.py
import os, smtplib
from email.message import EmailMessage

msg = EmailMessage()
msg["From"] = os.environ["MAIL_FROM"]
msg["To"] = "[email protected]"
msg["Subject"] = "Welcome aboard!"
msg.set_content("Thanks for signing up.")

with smtplib.SMTP(os.environ["SMTP_HOST"], 587) as smtp:
    smtp.starttls()
    smtp.login(os.environ["SMTP_USER"], os.environ["SMTP_PASS"])
    smtp.send_message(msg)

Django

Configure the SMTP backend and every send_mail() call, plus the built-in password-reset flow, goes through us.

settings.py
import os

EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
EMAIL_HOST = "smtp.email4vibecoder.com"
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = os.environ["SMTP_USER"]
EMAIL_HOST_PASSWORD = os.environ["SMTP_PASS"]
DEFAULT_FROM_EMAIL = "Your App <[email protected]>"

PHP and Laravel

Laravel needs no code change — only environment variables.

.env
MAIL_MAILER=smtp
MAIL_HOST=smtp.email4vibecoder.com
MAIL_PORT=587
MAIL_USERNAME=your-username
MAIL_PASSWORD=your-password
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS[email protected]
MAIL_FROM_NAME="Your App"

On plain PHP, use PHPMailer with SMTPAuth = true, SMTPSecure = 'tls' and Port = 587.

Ruby on Rails

config/environments/production.rb
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
  address:              "smtp.email4vibecoder.com",
  port:                 587,
  user_name:            ENV["SMTP_USER"],
  password:             ENV["SMTP_PASS"],
  authentication:       :plain,
  enable_starttls_auto: true
}

Go

main.go
package main

import (
	"net/smtp"
	"os"
)

func main() {
	host := os.Getenv("SMTP_HOST")
	auth := smtp.PlainAuth("", os.Getenv("SMTP_USER"), os.Getenv("SMTP_PASS"), host)

	msg := []byte("From: [email protected]\r\n" +
		"To: [email protected]\r\n" +
		"Subject: Welcome aboard!\r\n\r\n" +
		"Thanks for signing up.\r\n")

	if err := smtp.SendMail(host+":587", auth, "[email protected]",
		[]string{"[email protected]"}, msg); err != nil {
		panic(err)
	}
}

Java and Spring Boot

application.properties
spring.mail.host=smtp.email4vibecoder.com
spring.mail.port=587
spring.mail.username=${SMTP_USER}
spring.mail.password=${SMTP_PASS}
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true

.NET and C#

MailKit is the recommended client; SmtpClient in System.Net.Mail is obsolete.

Program.cs
using MailKit.Net.Smtp;
using MailKit.Security;
using MimeKit;

var message = new MimeMessage();
message.From.Add(MailboxAddress.Parse("[email protected]"));
message.To.Add(MailboxAddress.Parse("[email protected]"));
message.Subject = "Welcome aboard!";
message.Body = new TextPart("html") { Text = "<p>Thanks for signing up.</p>" };

using var client = new SmtpClient();
await client.ConnectAsync("smtp.email4vibecoder.com", 587, SecureSocketOptions.StartTls);
await client.AuthenticateAsync(
    Environment.GetEnvironmentVariable("SMTP_USER"),
    Environment.GetEnvironmentVariable("SMTP_PASS"));
await client.SendAsync(message);
await client.DisconnectAsync(true);

Supabase Auth

Supabase's built-in email is rate-limited and not meant for production. In Project Settings → Authentication → SMTP Settings, enable a custom SMTP provider and enter:

Supabase SMTP settings
Host:            smtp.email4vibecoder.com
Port:            587
Username:        your-username
Password:        your-password
Sender email:    [email protected]
Sender name:     Your App

The sender email must be on a domain you have verified here, or Supabase's confirmation and magic-link emails will be rejected.

n8n, Zapier and other no-code tools

Any tool with a generic “SMTP” or “Send Email” action works. Choose SMTP (not Gmail), then enter host smtp.email4vibecoder.com, port 587, TLS/STARTTLS enabled, and your username and password. In n8n this is the SMTP credential used by the Send Email node.

Common errors

Our server replies with a standard SMTP code and a plain-English reason.

ReplyWhat it means
535 Invalid username or passwordWrong credential, or it was revoked. Create a new one in SMTP credentials.
550 …is not a verified sending domainYour From address uses a domain that is not verified on this account. Add and verify it in Domains.
550 Exactly one From header is allowedThe message has several From headers or several addresses in one. Send one sender address.
452 Monthly send quota reachedYou have used this month's allowance. It resets on the 1st, or you can move to a bigger plan.
451 Sending rate limit reachedToo many messages per minute. Retry shortly — this one is temporary.
421 Too many failed login attemptsRepeated bad passwords from one IP. Wait 15 minutes and fix the credentials.
552 Message exceeds maximum sizeYour plan's per-message limit, attachments included.

Every accepted message, and what the recipient's server said about it, is listed in Activity.

Stuck, or using something not listed here? Email our support address and we'll help.