MillionSend Docs

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 millionsend
import { 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 millionsend
import 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-go
client := 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 millionsend
require "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-php
use 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 MillionSend
using 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"}]
end
config :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):

RecursoMétodos
emails.receivinglist (com wait, since, inboxId, to, from, subjectContains, unread, includeQuarantined), get, reply, forward, remove
emails.receiving.attachmentslist, get
inboxescreate, list, get (pelo id ou pelo endereço), update, remove
inboxes.safetyget, update
inboxes.codeslatest (com from, wait, maxAge)
inboxes.quarantinelist, release (com trustSender)
inboxes.labelslist, create, update, remove
inboxes.threadslist, search, get, update, remove
inboxes.threads.emailslist, get, reply, forward
inboxes.draftslist, 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 Go WithIdempotencyKey, 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" ou kind: "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 API inbox_id, os webhooks inbox_ids, e os tipos de evento de webhook ganham o email.received e os eventos das caixas.

Nesta página