Valore spezzato in stringhe da 255 caratteri (per DNS che lo richiedono)
| Codice | Destinatari | Esempio di risposta |
|---|
Nessun errore di consegna nel periodo.
Nessun messaggio fallito. Ottimo.
| Data | Stato | Destinatario | Oggetto | Mittente | Dest. | Origine |
|---|
Nessun messaggio corrisponde ai filtri.
| Dominio | Stato | DKIM | Account | Invii 24h | Falliti 24h |
|---|
Nessun dominio configurato. Aggiungi il dominio da cui vuoi inviare: ti verranno mostrati i record DNS da creare.
| Indirizzo | Nome | Stato | Mittenti | Limite/ora | API key | Ultimo uso |
|---|
Nessun account. Ogni applicazione che invia mail dovrebbe avere il suo: così il report mostra chi ha inviato cosa.
Vengono conservate solo le ultime 50 email ricevute: le più vecchie vengono eliminate automaticamente. La posta in arrivo non viene recapitata, serve solo per verifica.
| Data | Da | A | Oggetto |
|---|
Nessuna email ricevuta. Se ti aspetti posta: verifica record MX, RECEIVE_DOMAINS e la porta 25 in ingresso.
YicMail è un relay di posta solo in uscita: le applicazioni gli consegnano i messaggi, lui li firma (DKIM) e li inoltra ai destinatari, tenendo traccia dell'esito per ogni destinatario e permettendo il reinvio dei falliti.
Ci sono due modi per inviare, entrambi legati a un account di un dominio configurato:
/api/v1/send): per integrazioni applicative con API key.Qualunque canale usi, il messaggio compare nel Report invii ed è reinviabile. Server di posta: .
Configura il tuo client o la tua libreria con questi parametri. Le credenziali SMTP (utente e password) si creano nella sezione Account.
Il mittente (MAIL FROM e header From) deve appartenere al dominio dell'account. Se l'account non ha il permesso "qualunque indirizzo", deve coincidere esattamente con l'email dell'account.
Esempio con l'utility swaks:
swaks --server :587 --tls \ --auth LOGIN --auth-user noreply@tuodominio.it --auth-password LA_PASSWORD \ --from noreply@tuodominio.it --to destinatario@example.com \ --header "Subject: Prova" --body "Ciao dal relay"
API pubblica REST per le applicazioni. Tutte le richieste usano HTTPS e JSON.
L'API key si genera nella sezione Account (voce "Genera API key"). Viene mostrata una sola volta: ha prefisso mr_.
Accoda un messaggio. Risposta 202 Accepted con l'identificativo del messaggio.
| Campo | Tipo | Obbl. | Note |
|---|---|---|---|
| from | string | sì | indirizzo del dominio dell'account |
| from_name | string | no | nome visualizzato del mittente |
| to | string[] | sì* | destinatari principali |
| cc | string[] | no | copia conoscenza |
| bcc | string[] | no | copia nascosta |
| reply_to | string | no | indirizzo per le risposte |
| subject | string | sì | oggetto (max 998 caratteri) |
| text | string | sì** | corpo testo semplice |
| html | string | sì** | corpo HTML |
| headers | object | no | header custom (vietati i riservati e i CR/LF) |
| attachments | array | no | vedi "Allegati" |
* almeno uno tra to, cc, bcc. ** almeno uno tra text e html.
Esempio di richiesta:
curl -X POST /send \
-H "Authorization: Bearer mr_la_tua_api_key" \
-H "Content-Type: application/json" \
-d '{
"from": "noreply@tuodominio.it",
"from_name": "ACME",
"to": ["cliente@example.com"],
"reply_to": "assistenza@tuodominio.it",
"subject": "Benvenuto",
"text": "Ciao, grazie per esserti registrato.",
"html": "<p>Ciao, grazie per esserti registrato.</p>"
}'
Risposta 202:
{ "id": "6f1c2a3e-0000-4000-8000-000000000001", "status": "queued" }
Stato del messaggio e dei singoli destinatari. Solo i messaggi dell'account chiamante; altrimenti 404.
curl /messages/6f1c2a3e-0000-4000-8000-000000000001 \ -H "Authorization: Bearer mr_la_tua_api_key"
{
"id": "6f1c2a3e-...",
"status": "sent",
"created_at": "2026-10-06T10:00:00Z",
"completed_at": "2026-10-06T10:00:03Z",
"recipients": [
{ "address": "cliente@example.com", "status": "sent", "dsn": "2.0.0", "response": "250 OK" }
]
}
Python (requests):
import requests
r = requests.post(
"/send",
headers={"Authorization": "Bearer mr_la_tua_api_key"},
json={
"from": "noreply@tuodominio.it",
"to": ["cliente@example.com"],
"subject": "Benvenuto",
"text": "Ciao!",
},
timeout=15,
)
print(r.status_code, r.json())
PHP:
$ch = curl_init("/send");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer mr_la_tua_api_key",
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode([
"from" => "noreply@tuodominio.it",
"to" => ["cliente@example.com"],
"subject" => "Benvenuto",
"text" => "Ciao!",
]),
]);
$res = curl_exec($ch);
echo curl_getinfo($ch, CURLINFO_HTTP_CODE), " ", $res;
Gli allegati vanno passati nel campo attachments come array di oggetti con il contenuto codificato in base64.
| Campo | Tipo | Obbl. | Note |
|---|---|---|---|
| filename | string | sì | nome del file (max 255) |
| content | string | sì | contenuto in base64 |
| content_type | string | no | MIME, es. application/pdf |
{
"from": "noreply@tuodominio.it",
"to": ["cliente@example.com"],
"subject": "Fattura",
"text": "In allegato la fattura.",
"attachments": [
{ "filename": "fattura.pdf", "content": "JVBERi0xLjQK...", "content_type": "application/pdf" }
]
}
La dimensione massima del messaggio (corpo + allegati) è impostata lato server; oltre il limite la richiesta viene rifiutata.
Lo stato del messaggio deriva da quello dei suoi destinatari.
| Stato messaggio | Significato | Reinviabile |
|---|---|---|
| In coda | accettato, in attesa di elaborazione | no |
| In consegna | passato a Postfix | no |
| Consegnato | tutti i destinatari consegnati | no |
| Rinviato | almeno un destinatario in differita (retry) | no |
| Parziale | esiti finali misti (alcuni ok, altri falliti) | sì |
| Respinto | tutti i destinatari respinti | sì |
| Fallito | mai accettato da Postfix | sì |
Il reinvio crea un nuovo messaggio collegato all'originale e non viene conteggiato nel limite orario. Dal Report invii puoi reinviare un singolo messaggio o selezionarne fino a 500 per il reinvio in blocco, scegliendo "solo destinatari falliti" oppure "tutti".
Perché le mail siano accettate dai provider servono i record DNS del dominio. Dalla sezione Domini, con "Record DNS", trovi nome e valore di ciascun record e il pulsante "Verifica di nuovo".
selettore._domainkey.dominio): firma crittografica, generata automaticamente alla creazione del dominio._dmarc.dominio): politica di allineamento; parti con p=none.| Codice | Quando |
|---|---|
| 202 | messaggio accettato e accodato (API) |
| 401 | API key mancante o non valida |
| 422 | dati non validi: la risposta contiene detail e un array errors con field e message |
| 429 | limite orario dell'account superato |
Esempio di errore di validazione:
{
"detail": "Dati non validi",
"errors": [ { "field": "to.0", "message": "value is not a valid email address" } ]
}
DKIM-Signature o quello di tracciamento interno) e qualunque CR/LF nei valori degli header vengono rimossi o rifiutati: non è possibile falsificare il tracciamento né iniettare header.Authorization.