Company email you manage yourself
This guide is for domain administrators: from the first login and DNS setup to creating mailboxes, moving old email, and sending OTP codes from your application.
- Server:
mx1.trivapost.com - IMAP
993· SMTP465/587 - Example domain in this guide:
yourcompany.com
01Quick start
Once your domain is registered, Trivapost sends an onboarding summary with the domain administrator username, an initial password (sent only once), your plan (mailboxes, quota, sending limit) and the DNS records to add.
- Sign in to the domain panel. Open mx1.trivapost.com/domainadmin/ and sign in with the
tp-…username and the initial password. - Change the password. On the panel home page, open Change password. Use at least 14 characters and keep it in your company password manager.
- Turn on two-factor authentication (2FA). On the same page choose Two-factor authentication›Time-based OTP, scan the QR code with Google Authenticator, Authy or 1Password, and enter the 6-digit code.
- Add the DNS records at your domain's DNS provider (see section 2).
- Create mailboxes for staff and one
no-reply@address for OTP (see section 3). - Move existing email if you have any, then point MX to Trivapost (see section 4).
Three addresses to remember
| For | Address | Used by |
|---|---|---|
| Domain panel | mx1.trivapost.com/domainadmin/ | Domain administrators (IT team) |
| Account settings | mx1.trivapost.com | Each mailbox owner: app passwords, spam filter, personal sync jobs |
| Webmail | webmail.trivapost.com/SOGo/ | All staff: read & send email, calendar, contacts |
What you can and cannot change in the panel
| You manage | Managed by Trivapost (contact support) |
|---|---|
| Create, edit, deactivate and delete mailboxes · aliases · sync jobs (migration) · spam quarantine · spam policy & filters · app passwords · per-mailbox protocol access · BCC maps (archiving) · domain description · webmail access | Hourly sending limit · plan mailbox count & total quota · alias domains · relaying through other servers · resetting domain admin 2FA |
02Connect your domain (DNS)
Add the records below at your domain's DNS provider (Cloudflare, your registrar, or an internal DNS server). The DKIM value is unique to your domain — copy it exactly from the onboarding summary or from the panel: E-Mail›Configuration›Domains›DNS.
| Type | Name / host | Value | Purpose |
|---|---|---|---|
| MX | @ | mx1.trivapost.com · priority 10 | Incoming mail. Add it last when moving existing email. |
| TXT | @ | v=spf1 include:_spf.trivapost.com -all | SPF: servers allowed to send for the domain. |
| TXT | dkim._domainkey | v=DKIM1;k=rsa;t=s;s=email;p=MIIB… | Digital signature. Copy the full value from the panel. |
| TXT | _dmarc | v=DMARC1; p=none; rua=mailto:[email protected]; fo=1 | Policy when SPF/DKIM fail. |
| CNAME | autodiscover | mx1.trivapost.com | Outlook automatic setup. |
| CNAME | autoconfig | mx1.trivapost.com | Thunderbird automatic setup. |
| SRV | _autodiscover._tcp | 0 1 443 mx1.trivapost.com | Optional; helps email apps find the server. |
| SRV | _imaps._tcp | 0 1 993 mx1.trivapost.com | |
| SRV | _submissions._tcp | 0 1 465 mx1.trivapost.com | |
| SRV | _submission._tcp | 0 1 587 mx1.trivapost.com |
If the domain also sends through another service (a ticketing tool or CRM, for example), combine them in one record: v=spf1 include:_spf.trivapost.com include:other-service.com -all. Two separate v=spf1 records make SPF fail.
The autodiscover and autoconfig CNAME records must be DNS only (grey cloud), not Proxied.
In the Trivacloud client area open Services›your email service›Email›DNS records and use Download setup records (everything except MX; records your domain already has are left out) and Download MX record (import last). In Cloudflare: DNS›Records›Import and Export›Import, and leave Proxy imported DNS records off. An import only adds records — it never changes existing ones, so edit an existing SPF or MX by hand. The panel shows the combined SPF to use when your domain already has one.
Your current SPF and the old server's DKIM (often default._domainkey) keep today's email out of spam. Edit SPF to include Trivapost instead of removing it, and only delete the old DKIM after the old server stops sending email.
Checking your records
The easiest way: in the panel open E-Mail›Configuration›Domains and click the DNS button next to your domain. Correct records are marked green. DNS changes usually show up within 5–60 minutes.
From a terminal:
dig +short MX yourcompany.com
dig +short TXT yourcompany.com
dig +short TXT dkim._domainkey.yourcompany.com
dig +short TXT _dmarc.yourcompany.comnslookup -type=mx yourcompany.com 1.1.1.1
nslookup -type=txt dkim._domainkey.yourcompany.com 1.1.1.1Tightening DMARC step by step
- Weeks 1–4:
p=none— monitoring only. Reports go to theruaaddress; create apostmaster@mailbox or alias so they are not rejected. - Once every legitimate sender passes SPF/DKIM:
p=quarantine— forged mail lands in the recipient's spam folder. - Final stage:
p=reject— forged mail using your domain is refused. This matters for payment companies, whose names are popular with phishers.
03Mailboxes & aliases
Creating a mailbox
- Open E-Mail›Configuration›Mailboxes and click Add mailbox.
- Enter the Username (the part before @, e.g.
jane), choose the domain, and fill in Full name. - Set the Quota (up to your plan, e.g. 10240 MiB = 10 GB).
- Set a strong password or use the generator icon. Hand it to the employee over a secure channel, not by email to the same mailbox.
- Click Add. The mailbox works in webmail and email apps right away.
If you have reached your plan's mailbox count, the panel refuses new mailboxes. Remove unused ones or contact us to upgrade.
Everyday tasks
| Task | How |
|---|---|
| Reset a staff password | Mailboxes›Edit on the mailbox, enter a new password. |
| Employee leaves | Deactivate first (turn off Edit›Active) so old mail is kept. Forward new mail to a manager with an alias if needed. Delete once the data is secured. |
Extra addresses (info@, billing@) | Aliases›Add alias: enter the alias and its destination (several mailboxes allowed, comma-separated). |
| Forwarding outside | Create an alias whose destination is an external address. Careful: forwarding spam to Gmail hurts reputation. |
| Archive copies (compliance) | BCC›Add BCC map: all mail to/from an address is copied to an archive mailbox. |
| Review held messages | Quarantine: release legitimate mail or delete dangerous mail. |
An @yourcompany.com alias (catching every address) attracts heavy spam and fills quota. Create specific aliases instead.
04Move from an old server
This works for CyberPanel, cPanel, Plesk or any other IMAP server. Existing mail is copied with a sync job; nothing is deleted on the old server.
- One day before: lower the TTL. Set the TTL of the domain's MX record to 300 seconds (5 minutes) so the switch takes effect quickly.
- Create mailboxes in Trivapost with exactly the same addresses as on the old server.
- Add a temporary SPF that allows both servers during the transition:
UseTXT @ (temporary)
v=spf1 include:_spf.trivapost.com ip4:OLD_SERVER_IP ~allip6:OLD_SERVER_IPV6as well if the old server has IPv6. Also add DKIM (dkim._domainkey),autodiscoverandautoconfig. The Trivapost DKIM selector isdkim, so it does not clash with the old server's DKIM (usuallydefault) — keep both during the move. - Create a sync job for each mailbox: E-Mail›Configuration›Sync jobs›Add sync job.
The first sync can take a few hours for large mailboxes. Watch progress with the Logs button on the sync job.
Field Value Username Destination mailbox in Trivapost Host Old server name, e.g. mail.yourcompany.com, or its IPPort / Encryption 993/SSLUsername & password (source) Full email address and password on the old server Interval (min) 20during the transitionDelete from source when completed Leave unchecked Exclude objects (regex) Keep the default (spam/junk folders are skipped) - Switch day: change MX to
mx1.trivapost.com(priority 10) and remove the old MX. Mail that still reaches the old server is copied by the sync job. - Set up staff devices with the new settings (see section 5).
- Day 3 to day 7: finish. Confirm new mail arrives in Trivapost, turn off the sync jobs, change SPF to the final
v=spf1 include:_spf.trivapost.com -all, and disable email on the old server. If your website or app still sends email from its own server (for example OTP codes), keep that server'sip4:/ip6:in SPF and keep its DKIM record.
Make sure the old server's firewall allows inbound port 993 from 169.58.47.102 and that the source password is correct. The full error is under Logs.
05Set up email apps
Outlook and Thunderbird usually configure themselves from just the email address and password (once the autodiscover/autoconfig records exist). For manual setup:
| Protocol | Server | Port | Security |
|---|---|---|---|
| IMAP (incoming, recommended) | mx1.trivapost.com | 993 | SSL/TLS |
| POP3 (incoming) | mx1.trivapost.com | 995 | SSL/TLS |
| SMTP (outgoing) | mx1.trivapost.com | 465 | SSL/TLS |
| SMTP (outgoing, alternative) | mx1.trivapost.com | 587 | STARTTLS |
The username is always the full email address ([email protected]). Authentication: normal password. SMTP requires sign-in.
Outlook (Windows / Mac)
- File›Add account, enter the email address.
- If asked for an account type, choose IMAP and enter the servers from the table above.
- Enter the password and finish.
iPhone / iPad / Mac Mail
Fastest: sign in to mx1.trivapost.com with the email account, download the Apple connection profile from the account page and open it on the device. Mail, calendar and contacts are set up at once.
Manual: Settings›Mail›Accounts›Add Account›Other›Add Mail Account, choose IMAP and enter the servers from the table above for Incoming and Outgoing.
Android (Gmail app)
- Add account›Other, enter the email address.
- Choose Personal (IMAP) and enter the password.
- Incoming server
mx1.trivapost.comport 993 SSL/TLS; outgoing servermx1.trivapost.comport 465 SSL/TLS.
Thunderbird
Account Settings›Account Actions›Add Mail Account, enter name, email and password. Thunderbird picks up the settings from autoconfig.
Calendar & contacts (CalDAV / CardDAV)
Server address: https://mx1.trivapost.com/SOGo/dav/ with the email address and password. In webmail, each calendar's full link is in that calendar's three-dot menu.
06Send OTP from your app
For automated email (login OTP, password reset, PIN change) use one dedicated mailbox, such as [email protected]. Do not use a staff mailbox.
Preparation
- Create the
no-reply@mailbox (section 3). - Sign in to mx1.trivapost.com as
no-reply@, open App passwords›Create app password. Name it after the application (e.g.api-production) and tick only SMTP. - Store the app password in a secret manager or server environment variable — never in the code repository.
- Create separate app passwords for staging and production, so one can be revoked without affecting the other.
| Setting | Value |
|---|---|
| Host | mx1.trivapost.com |
| Port & encryption | 465 + SSL/TLS (recommended) or 587 + STARTTLS |
| Username | [email protected] |
| Password | The app password |
| From | Must be the signed-in mailbox (or one of its aliases) |
Code samples
MAIL_MAILER=smtp
MAIL_HOST=mx1.trivapost.com
MAIL_PORT=465
MAIL_SCHEME=smtps # Laravel 10 and older: MAIL_ENCRYPTION=ssl
[email protected]
MAIL_PASSWORD=your-app-password
[email protected]
MAIL_FROM_NAME="Your Company"use PHPMailer\PHPMailer\PHPMailer;
$mail = new PHPMailer(true);
$mail->isSMTP();
$mail->Host = 'mx1.trivapost.com';
$mail->Port = 465;
$mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;
$mail->SMTPAuth = true;
$mail->Username = '[email protected]';
$mail->Password = getenv('MAIL_PASSWORD');
$mail->CharSet = 'UTF-8';
$mail->Timeout = 20;
$mail->setFrom('[email protected]', 'Your Company');
$mail->addReplyTo('[email protected]');
$mail->addAddress($userEmail);
$mail->Subject = 'Your verification code';
$mail->isHTML(true);
$mail->Body = "<p>Verification code: <b>{$code}</b></p><p>Valid for 5 minutes. Never share this code.</p>";
$mail->AltBody = "Verification code: {$code}\nValid for 5 minutes. Never share this code.";
$mail->send();const nodemailer = require('nodemailer');
// Create once at startup and reuse for every message
const transporter = nodemailer.createTransport({
host: 'mx1.trivapost.com',
port: 465,
secure: true,
pool: true,
maxConnections: 3,
auth: { user: '[email protected]', pass: process.env.MAIL_PASSWORD },
});
await transporter.sendMail({
from: '"Your Company" <[email protected]>',
replyTo: '[email protected]',
to: userEmail,
subject: 'Your verification code',
text: `Verification code: ${code}\nValid for 5 minutes. Never share this code.`,
html: `<p>Verification code: <b>${code}</b></p><p>Valid for 5 minutes.</p>`,
});import os, ssl, smtplib
from email.message import EmailMessage
from email.utils import formatdate, make_msgid
msg = EmailMessage()
msg["From"] = "Your Company <[email protected]>"
msg["To"] = user_email
msg["Reply-To"] = "[email protected]"
msg["Date"] = formatdate(localtime=True)
msg["Message-ID"] = make_msgid(domain="yourcompany.com")
msg["Subject"] = "Your verification code"
msg.set_content(f"Verification code: {code}\nValid for 5 minutes. Never share this code.")
msg.add_alternative(f"<p>Verification code: <b>{code}</b></p><p>Valid for 5 minutes.</p>", subtype="html")
with smtplib.SMTP_SSL("mx1.trivapost.com", 465, context=ssl.create_default_context(), timeout=20) as s:
s.login("[email protected]", os.environ["MAIL_PASSWORD"])
s.send_message(msg)package mail
import (
"crypto/tls"
"fmt"
"net/smtp"
"os"
"time"
)
func SendOTP(to, code string) error {
const host, from = "mx1.trivapost.com", "[email protected]"
conn, err := tls.Dial("tcp", host+":465", &tls.Config{ServerName: host})
if err != nil {
return err
}
c, err := smtp.NewClient(conn, host)
if err != nil {
return err
}
defer c.Close()
if err = c.Auth(smtp.PlainAuth("", from, os.Getenv("MAIL_PASSWORD"), host)); err != nil {
return err
}
if err = c.Mail(from); err != nil {
return err
}
if err = c.Rcpt(to); err != nil {
return err
}
w, err := c.Data()
if err != nil {
return err
}
fmt.Fprintf(w, "From: Your Company <%s>\r\nTo: %s\r\nSubject: Your verification code\r\nDate: %s\r\nMessage-ID: <%[email protected]>\r\n"+
"MIME-Version: 1.0\r\nContent-Type: text/plain; charset=UTF-8\r\n\r\nVerification code: %s\r\nValid for 5 minutes.\r\n",
from, to, time.Now().Format(time.RFC1123Z), time.Now().UnixNano(), code)
if err = w.Close(); err != nil {
return err
}
return c.Quit()
}# Cargo.toml
[dependencies]
lettre = { version = "0.11", default-features = false, features = ["builder", "smtp-transport", "rustls-tls", "hostname"] }
uuid = { version = "1", features = ["v4"] }
// src/mail.rs
use lettre::message::{header::ContentType, MultiPart, SinglePart};
use lettre::transport::smtp::authentication::Credentials;
use lettre::{Message, SmtpTransport, Transport};
pub fn send_otp(to: &str, code: &str) -> Result<(), Box<dyn std::error::Error>> {
let email = Message::builder()
.from("Your Company <[email protected]>".parse()?)
.reply_to("[email protected]".parse()?)
.to(to.parse()?)
.subject("Your verification code")
.date_now() // Date header
.message_id(Some(format!("<{}@yourcompany.com>", uuid::Uuid::new_v4()))) // Message-ID with your own domain (lettre would otherwise use the machine hostname)
.multipart(
// text + HTML; MIME-Version is added automatically
MultiPart::alternative()
.singlepart(SinglePart::builder().header(ContentType::TEXT_PLAIN)
.body(format!("Verification code: {code}\nValid for 5 minutes. Never share this code.")))
.singlepart(SinglePart::builder().header(ContentType::TEXT_HTML)
.body(format!("<p>Verification code: <b>{code}</b></p><p>Valid for 5 minutes.</p>"))),
)?;
// async (tokio): AsyncSmtpTransport::<Tokio1Executor>::relay(...) with features "tokio1" and "tokio1-rustls-tls"
let mailer = SmtpTransport::relay("mx1.trivapost.com")? // port 465, SSL/TLS
.credentials(Credentials::new(
"[email protected]".to_owned(),
std::env::var("MAIL_PASSWORD")?,
))
.build();
mailer.send(&email)?;
Ok(())
}Test the connection from your app server
# 1. Is the port reachable? (should say "succeeded" / "open")
nc -vz mx1.trivapost.com 465
# 2. Send a test message (swaks package: apt install swaks)
swaks --server mx1.trivapost.com:465 --tls-on-connect \
--auth LOGIN --auth-user [email protected] --auth-password 'your-app-password' \
--from [email protected] --to [email protected] \
--header "Subject: Trivapost test"Best practices for OTP deliverability
- Short and consistent. Same subject every time (Your verification code), the code in the body. No large images or many links.
- Send both text and HTML parts (as in the samples above).
- Always include
Message-ID,DateandMIME-Versionheaders. Gmail puts messages without a Message-ID in spam or rejects them. Laravel, PHPMailer and Nodemailer add them for you (for Rustlettresetmessage_idwith your domain as in the sample); with raw SMTP code (Pythonsmtplib, Gonet/smtp, scripts) add them yourself as in the samples. - No link shorteners (bit.ly and similar) — they are a strong phishing signal.
- Throttle resend requests in your app, e.g. at most 1 code per 60 seconds and 5 per hour per user. This stops abuse from burning your sending limit.
- Send from a queue, not inside the user's request. On a
4xxreply retry after 1, 5 and 15 minutes. A5xxreply is a permanent failure — do not retry. - Reuse connections (pooling) when sending many messages in a row.
- Check the
no-reply@mailbox weekly in webmail: wrong user addresses bounce back there. Flag those addresses in your app so they are not mailed again. - Transactional email only. Promotions, newsletters and mass announcements are not allowed on Trivapost (see section 8).
07Security
- 2FA is required for the domain admin account. Keep backup access safe; if a device is lost, contact support from the registered contact address.
- One app password per device or application. If a laptop is lost or a server is compromised, revoke just that app password.
- Limit unused protocols per mailbox (Mailboxes›Edit›Allowed protocols). For example, turn off POP3 everywhere if nobody uses it.
- Be wary of emails asking you to sign in. Trivapost never asks for passwords by email. The only official sign-in pages are
mx1.trivapost.comandwebmail.trivapost.com. - Move DMARC to
p=rejectafter the monitoring period (section 2) so your domain cannot be forged to deceive customers. - Quarantine: suspicious mail is held back. Release it only when you are sure the sender is legitimate.
- All connections to the server (web, IMAP, SMTP) are TLS-encrypted. Mailboxes are stored on Trivapost servers and backed up regularly, encrypted, to a separate location.
08Limits & policies
| Item | Limit |
|---|---|
| Message size | 100 MB (including attachments; attachments grow about 33% in transit, so about 70 MB of files) |
| Mailboxes & quota | As listed in your onboarding summary |
| Sending limit | Per domain per hour, according to your plan (listed in the onboarding summary). When exceeded, mail is deferred, not lost. |
| Aliases | Up to 400 per domain |
| Dangerous attachments | Executable or infected files may be rejected or quarantined |
Acceptable use
- Allowed: staff business email and transactional email (OTP, password resets, transaction notices, invoices).
- Not allowed: bulk marketing, newsletters to large lists, purchased address lists, spam, phishing or fraudulent content.
- Violations or unusual sending spikes may lead to temporary sending restrictions to protect the server's reputation for every customer. We will contact your registered contact person.
Need a higher sending limit, more mailboxes or more quota? Contact [email protected].
09Troubleshooting
Our mail lands in the recipient's spam folder
- In Gmail, open the message and choose ⋮›Show original. Check that SPF, DKIM and DMARC say
PASS. - If any says
FAIL, check the DNS records from section 2 with the DNS button in the panel. - If all say
PASS: new domains need time to build reputation. Ask a few recipients to mark Not spam, avoid shortened links, and keep content consistent.
App: “Authentication failed” / 535
- The username must be the full email address.
- Use an app password with the SMTP protocol ticked.
- Match port and encryption:
465with SSL/TLS,587with STARTTLS. - Too many failed attempts block the IP temporarily. Wait 30 minutes, fix the password, then try again.
App: connection timeout
Some cloud providers block outgoing mail ports. Test with nc -vz mx1.trivapost.com 465 and then 587. If both fail, open an egress firewall rule on your server or cloud provider.
“Ratelimit” / 4xx reply when sending
The domain's hourly sending limit was reached. Mail is not lost: email apps and properly built queues retry. Look for unusual spikes (such as a bot requesting OTPs repeatedly), then contact us if you genuinely need a higher limit.
Mail is not arriving
- Check MX with
dig +short MX yourcompany.com— it must bemx1.trivapost.com. - Check Quarantine in the panel and the Junk folder in webmail.
- Check mailbox quota. A full mailbox rejects new mail (the sender gets a mailbox full notice).
- Make sure the mailbox and domain are active.
Sync job stopped or shows errors
Open Sync jobs›Logs. Common causes: the old server password changed, the old server's firewall blocks 169.58.47.102, or wrong host/port (use 993 + SSL).
10Support
Email [email protected] from your registered contact address. To get help faster, include:
- The domain and the affected email address
- When it happened, with time zone (e.g. 14:05 UTC+7)
- The full error message (copied text, not only a screenshot)
- For spam or delivery issues: the full message headers (Show original in Gmail)
We will never ask for your password. Do not send passwords or 2FA codes to anyone.