Send e-post med Amazon SES og SST

En stor fordel med å bruke SST, er at man kan kombinere ulike komponenter. Her forklarer jeg hvordan du kan bruke Amazon Simple Email Service (SES) til å sende deg e-post.

Åpen postkasse med brev inni
Du har fått post

Konfigurering av SST

Konfigurering av e-post er enkelt med SST. Her er sst.config.ts igjen:

// <reference path="./.sst/platform/config.d.ts" />

export default $config({
  app(input) {
    return {
      name: 'sst-nextjs-test',
      removal: input?.stage === 'production' ? 'retain' : 'remove',
      protect: ['production'].includes(input?.stage),
      home: 'aws',
    }
  },
  async run() {
    const email = sst.aws.Email.get('MyEmail', 'mail@example.com')
    new sst.aws.Nextjs('MyWeb', {
      domain:
        $app.stage === 'production'
          ? {
              name: 'example.com',
              redirects: ['www.example.com'],
            }
          : undefined,
      link: [email],
    })
  },
})

Nå har jeg lagt til linjen:

const email = sst.aws.Email.get('MyEmail', 'mail@example.com')

Jeg bruker Email.get her fordi jeg allerede har opprettet en konfigurasjon av Amazon SES hos AWS. Du kan også opprette en ny e-postidentitet slik:

const email = new sst.aws.Email('MyEmail', { sender: 'mail@example.com' })

Når du starter med Amazon SES vil du jobbe i sandkassemodus, og hver e-postadresse må bekreftes ved å trykke på verifiseringslenken i e-posten som sendes til adressen. Når du aktiverer produksjonsmodus, kan du konfigurere et domene som avsender, og sende fra en hvilken som helst e-postadresse med dette domenet, såfremt domenet er konfigurert riktig.

Det er også viktig å huske på å linke e-postkomponenten til Next.js-komponenten, dette har jeg gjort med link: [email] i konfigurasjonsobjektet. Jeg glemte å gjøre det først, og fikk en feilmelding om at jeg ikke hadde tillatelse til å sende e-post. Ved å linke vil SST legge til den nødvendige tillatelsen.

Slik linking fungerer med alle komponentene i SST. Det er et veldig fleksibelt konsept, som kan brukes til å bygge avanserte skytjenester.

Sending av e-post

E-post sender man ved å bruke SDK-en som finnes i npm-pakken @aws-sdk/client-ses. Her er eksempelkode:

import { SendEmailCommand, SESClient } from '@aws-sdk/client-ses'

const sesClient = new SESClient({
  region: 'eu-west-1',
})

export async function sendEmail(message: string, email: string) {
  const from = 'mail@example.com'
  const to = 'mail@example.com'
  const sendEmailCommand = new SendEmailCommand({
    Destination: {
      ToAddresses: [to],
    },
    Message: {
      Body: {
        Text: {
          Charset: 'UTF-8',
          Data: message,
        },
      },
      Subject: {
        Charset: 'UTF-8',
        Data: `Message from <${email}>`,
      },
    },
    ReplyToAddresses: [email],
    Source: from,
  })
  try {
    await sesClient.send(sendEmailCommand)
  } catch (error) {
    console.error(error)
  }
}

Jeg bruker en lignende funksjon som denne til å sende meg en e-post når noen sender inn kontaktskjemaet.

Hvis du bruker denne koden til noe lignende, må du huske å validere eventuelle inndata som kommer fra klienten. Jeg har for eksempel kode som validerer at e-postadressen som sendes inn, er en ekte e-postadresse. Jeg kan anbefale å bruke pakken deep-email-validator til å validere e-postadresser.

Konklusjon

Som du ser er det rimelig enkelt å konfigurere SST slik at du har støtte for å sende e-post gjennom Amazon SES. Du kan finne mer informasjon i dokumentasjonen for e-postkomponenten.

Dette lille eksempelet er et godt eksempel på hvordan man kan linke komponenter sammen i SST. Dette er et veldig kraftig verktøy som kan brukes til å bygge avanserte skytjenester med SST.

Håper du hadde nytte av denne artikkelen. Ta gjerne kontakt hvis du har spørsmål eller kommentarer.