Enviar um email
Uma mensagem agora ou mais tarde, com anexos, ou cem num só pedido.
Enviar uma mensagem
Map<String, Object> email = client.emails().send(Body.of( "from", "Acme Billing <[email protected]>", "to", List.of("[email protected]", Body.of("email", "[email protected]", "name", "Grace")), "replyTo", "[email protected]", "subject", "Your September invoice", "html", "<p>Invoice attached.</p>", "text", "Invoice attached."), RequestOptions.create().idempotencyKey("invoice-2026-09-ada")); System.out.println(email.get("id") + " " + email.get("status"));to, cc e bcc aceitam um endereço ou uma lista, e um endereço é um texto como Ada <[email protected]> ou um mapa com email e name. O corpo vem de html e text, de um template guardado ou de um draftId.
Cada envio leva uma chave de idempotência. O cliente cria uma por chamada e reutiliza-a quando tenta de novo, por isso um pedido repetido reproduz a primeira mensagem. Passe idempotencyKey num RequestOptions para que isso se mantenha entre processos e reinícios.
Anexos
byte[] report = "month,total".getBytes(StandardCharsets.UTF_8); client.emails().send(Body.of( "from", "[email protected]", "to", "[email protected]", "subject", "Your September report", "text", "The report is attached.", "attachments", List.of( Body.of("filename", "report.csv", "content", report, "contentType", "text/csv"), Body.of("fileId", "b3e1f0a4-6c2d-4e8a-9f17-2d5c8a0b4e6f") )));content aceita um byte[] ou um Path, que o cliente codifica em base64, ou texto que já está em base64. fileId indica um ficheiro carregado com client.files().upload, que é como se envia um ficheiro com mais de 5 MB.
Enviar mais tarde
Map<String, Object> scheduled = client.emails().send(Body.of( "from", "[email protected]", "to", "[email protected]", "subject", "Your invoice is due tomorrow", "text", "A reminder that your invoice is due tomorrow.", "scheduledAt", Instant.now().plus(Duration.ofHours(1)))); String id = (String) scheduled.get("id"); client.emails().reschedule(id, Instant.now().plus(Duration.ofHours(2)));client.emails().cancel(id);scheduledAt aceita um Instant, um instante ISO 8601 em texto ou uma duração como PT1H. Um Instant, um OffsetDateTime ou um ZonedDateTime em qualquer ponto de um corpo é enviado como um instante ISO 8601 em UTC. Uma mensagem agendada pode ser alterada ou cancelada até sair.
Enviar um lote
BatchResult batch = client.emails().sendBatch(List.of( Body.of("from", "[email protected]", "to", "[email protected]", "subject", "Your invoice", "text", "Invoice attached."), Body.of("from", "[email protected]", "to", "[email protected]", "subject", "Your invoice", "text", "Invoice attached."))); for (Map<String, Object> item : batch) { if ("error".equals(item.get("status"))) { System.err.println(item.get("index") + " " + item.get("error")); }} System.out.println(batch.sent() + " sent, " + batch.failed() + " failed");Um lote leva até 100 mensagens e nunca é tudo ou nada: um endereço errado faz falhar o seu próprio item e os restantes seguem na mesma. Verifique failed() e o status de cada item em vez de contar com uma exceção.