SDKs
SDKs oficiais do MillionSend para nove linguagens, publicados sob MIT.
Cada SDK espelha o formato do SDK oficial correspondente do Resend, então migrar é quase um localizar-e-substituir: troque o import/classe e aponte a URL base para o MillionSend. Todos os SDKs são licenciados sob MIT e vivem em repositórios próprios na organização MillionSend no GitHub.
Como a API é compatível com a do Resend, os SDKs oficiais do
Resend também funcionam — aponte-os para o MillionSend pela opção de URL base
(ex.: RESEND_BASE_URL). A partir da 0.9.0, todo SDK do MillionSend também
cobre os e-mails recebidos e as caixas de entrada.
URL base
api.millionsend.com — o que todos os exemplos desta página usam, e o padrão a partir do SDK 0.5.0: sem uma URL base configurada, o SDK fala com o MillionSend Cloud.
Node.js / TypeScript
millionsend no npm — Node 18+.
npm install millionsendimport { MillionSend } from "millionsend";
const ms = new MillionSend("ms_123", { baseUrl: "https://api.millionsend.com" });
const { data, error } = await ms.emails.send({
from: "Acme <onboarding@acme.dev>",
to: "success@simulator.amazonses.com",
subject: "Hello from MillionSend",
html: "<strong>It works!</strong>",
});Python
millionsend no PyPI — Python 3.9+.
pip install millionsendimport millionsend
millionsend.api_key = "ms_123"
millionsend.base_url = "https://api.millionsend.com"
email = millionsend.Emails.send({
"from": "Acme <onboarding@acme.dev>",
"to": "success@simulator.amazonses.com",
"subject": "Hello from MillionSend",
"html": "<strong>It works!</strong>",
})Go
millionsend-go — Go 1.21+.
go get github.com/MillionSend/millionsend-goclient := millionsend.NewClient("ms_123")
client.BaseURL = "https://api.millionsend.com"
sent, err := client.Emails.Send(&millionsend.SendEmailRequest{
From: "Acme <onboarding@acme.dev>",
To: []string{"success@simulator.amazonses.com"},
Subject: "Hello from MillionSend",
Html: "<strong>It works!</strong>",
})Ruby
millionsend no RubyGems — Ruby 3.0+.
gem install millionsendrequire "millionsend"
Millionsend.api_key = "ms_123"
Millionsend.base_url = "https://api.millionsend.com"
email = Millionsend::Emails.send(
from: "Acme <onboarding@acme.dev>",
to: "success@simulator.amazonses.com",
subject: "Hello from MillionSend",
html: "<strong>It works!</strong>"
)PHP
millionsend/millionsend-php no Packagist — PHP 8.1+.
composer require millionsend/millionsend-phpuse MillionSend\MillionSend;
$ms = MillionSend::client('ms_123', 'https://api.millionsend.com');
$email = $ms->emails->send([
'from' => 'Acme <onboarding@acme.dev>',
'to' => 'success@simulator.amazonses.com',
'subject' => 'Hello from MillionSend',
'html' => '<strong>It works!</strong>',
]);Rust
millionsend no crates.io — async
(tokio + reqwest).
[dependencies]
millionsend = "0.9"
tokio = { version = "1", features = ["macros", "rt-multi-thread"] }use millionsend::{MillionSend, SendEmailOptions};
let ms = MillionSend::with_base_url("ms_123", "https://api.millionsend.com");
let sent = ms.emails.send(&SendEmailOptions {
from: "Acme <onboarding@acme.dev>".into(),
to: "success@simulator.amazonses.com".into(),
subject: "Hello from MillionSend".into(),
html: Some("<strong>It works!</strong>".into()),
..Default::default()
}).await?;Java
com.millionsend:millionsend-java no Maven Central — Java 11+.
<dependency>
<groupId>com.millionsend</groupId>
<artifactId>millionsend-java</artifactId>
<version>0.9.0</version>
</dependency>MillionSend ms = new MillionSend("ms_123", "https://api.millionsend.com");
CreateEmailResponse sent = ms.emails().send(
CreateEmailOptions.builder()
.from("Acme <onboarding@acme.dev>")
.to("success@simulator.amazonses.com")
.subject("Hello from MillionSend")
.html("<strong>It works!</strong>")
.build());.NET
MillionSend no NuGet — alvo net8.0.
dotnet add package MillionSendusing MillionSend;
var client = new MillionSendClient("ms_123", "https://api.millionsend.com");
var res = await client.EmailSendAsync(new EmailMessage
{
From = "Acme <onboarding@acme.dev>",
To = "success@simulator.amazonses.com",
Subject = "Hello from MillionSend",
Html = "<strong>It works!</strong>",
});Elixir
millionsend no Hex — Elixir 1.15+.
# mix.exs
def deps do
[{:millionsend, "~> 0.9"}]
endconfig :millionsend, MillionSend.Client,
api_key: System.get_env("MILLIONSEND_API_KEY"),
base_url: "https://api.millionsend.com"
{:ok, email} =
MillionSend.Emails.send(%{
from: "Acme <onboarding@acme.dev>",
to: "success@simulator.amazonses.com",
subject: "Hello from MillionSend",
html: "<strong>It works!</strong>"
})Recebimento e caixas de entrada
A partir da 0.9.0, todo SDK lê os e-mails recebidos e trabalha com as caixas de entrada, com a mesma árvore no jeito de cada linguagem (os nomes abaixo são os do Node):
| Recurso | Métodos |
|---|---|
emails.receiving | list (com wait, since, inboxId, to, from, subjectContains, unread, includeQuarantined), get, reply, forward, remove |
emails.receiving.attachments | list, get |
inboxes | create, list, get (pelo id ou pelo endereço), update, remove |
inboxes.safety | get, update |
inboxes.codes | latest (com from, wait, maxAge) |
inboxes.quarantine | list, release (com trustSender) |
inboxes.labels | list, create, update, remove |
inboxes.threads | list, search, get, update, remove |
inboxes.threads.emails | list, get, reply, forward |
inboxes.drafts | list, create, get, update, remove, send, reject |
import { MillionSend } from "millionsend";
const ms = new MillionSend("ms_123");
// Espera até 30 segundos pelo próximo e-mail entregue numa caixa.
const { data: page } = await ms.emails.receiving.list({ inboxId: "7eeb9517-aed7-40d7-ad65-500be42ed147", wait: 30 });
// O código de verificação ou link de acesso mais recente que ela recebeu.
const { data: code } = await ms.inboxes.codes.latest("7eeb9517-aed7-40d7-ad65-500be42ed147", { wait: 30 });- Responder, encaminhar e enviar rascunhos aceitam uma chave de
idempotência (no Node
{ idempotencyKey }, no GoWithIdempotencyKey, e o equivalente de cada linguagem). Passe uma para poder repetir a chamada sem risco: o SDK não manda nenhuma por conta própria. - Uma resposta ou um encaminhamento que as regras da caixa retêm devolve um
rascunho em vez do e-mail enviado, e os SDKs dizem qual dos dois veio: no
Node o resultado traz
kind: "sent"oukind: "draft", e cada linguagem tem o equivalente. - Campos e valores de enum desconhecidos são mantidos ou ignorados, nunca viram erro, então uma API mais nova não quebra um SDK mais antigo.
- Os domínios ganham
receiving_catch_all, as chaves de APIinbox_id, os webhooksinbox_ids, e os tipos de evento de webhook ganham oemail.receivede os eventos das caixas.