Heim  >  Artikel  >  Backend-Entwicklung  >  Senden Sie Roh-E-Mails mit Anhängen in Go über AWS SES v2

Senden Sie Roh-E-Mails mit Anhängen in Go über AWS SES v2

WBOY
WBOYnach vorne
2024-02-15 17:00:09816Durchsuche

通过 AWS SES v2 在 Go 中发送带有附件的原始电子邮件

php-Editor Xiaoxin präsentiert Ihnen einen Artikel über das Senden von Original-E-Mails mit Anhängen mithilfe von AWS SES v2 in Go. Die Kombination aus AWS SES v2, einem flexiblen und zuverlässigen E-Mail-Dienst, und Go, einer leistungsstarken Programmiersprache, kann Ihnen dabei helfen, ganz einfach Original-E-Mails mit Anhängen zu versenden. In diesem Artikel wird detailliert beschrieben, wie Sie mithilfe der AWS SES v2-API und der Go-Sprache Code schreiben, um diese Funktionalität zu implementieren. Unabhängig davon, ob Sie Anfänger oder erfahrener Entwickler sind, bietet Ihnen dieser Artikel eine klare Anleitung, wie Sie Ihre Arbeit erfolgreich erledigen können. Lass uns anfangen!

Frageninhalt

Ich versuche, einen HTTP-Endpunkt zu erstellen, um Formularübermittlungen von einer Website zu verarbeiten.

Das Formular enthält die folgenden Felder:

  • Name
  • E-Mail
  • Telefon
  • E-Mail-Text (Text des E-Mail-Textes)
  • Fotos (maximal 5)

Mein Endpunkt sendet dann eine E-Mail an [email protected] mit dem Foto als Anhang und dem Text der E-Mail wie folgt:

john ([email protected]) says:
email body ...

Ich bin neu dabei, aber ich versuche schon seit zwei Wochen, es zum Laufen zu bringen, und habe immer noch kein Glück.

Mein aktueller Code ist:

package aj

import (
    "bytes"
    "encoding/base64"
    "fmt"
    "io/ioutil"
    "mime"
    "net/http"
    "net/mail"
    "net/textproto"
    "os"

    "github.com/aws/aws-sdk-go-v2/aws"
    "github.com/aws/aws-sdk-go-v2/service/sesv2"
    "github.com/aws/aws-sdk-go-v2/service/sesv2/types"
    "go.uber.org/zap"
)

const expectedContentType string = "multipart/form-data"
const charset string = "UTF-8"

func FormSubmissionHandler(logger *zap.Logger, emailSender EmailSender) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        logger.Info("running the form submission handler...")

        // get the destination email address
        destinationEmail := os.Getenv("DESTINATION_EMAIL")

        // get the subject line of the email
        emailSubject := os.Getenv("EMAIL_SUBJECT")

        // enforce a multipart/form-data content-type
        contentType := r.Header.Get("content-type")

        mediatype, _, err := mime.ParseMediaType(contentType)
        if err != nil {
            logger.Error("error when parsing the mime type", zap.Error(err))
            http.Error(w, err.Error(), http.StatusBadRequest)
            return
        }

        if mediatype != expectedContentType {
            logger.Error("unsupported content-type", zap.Error(err))
            http.Error(w, fmt.Sprintf("api expects %v content-type", expectedContentType), http.StatusUnsupportedMediaType)
            return
        }

        err = r.ParseMultipartForm(10 << 20)
        if err != nil {
            logger.Error("error parsing form data", zap.Error(err))
            http.Error(w, "error parsing form data", http.StatusBadRequest)
            return
        }

        name := r.MultipartForm.Value["name"]
        if len(name) == 0 {
            logger.Error("name not set", zap.Error(err))
            http.Error(w, "api expects name to be set", http.StatusBadRequest)
            return
        }

        email := r.MultipartForm.Value["email"]
        if len(email) == 0 {
            logger.Error("email not set", zap.Error(err))
            http.Error(w, "api expects email to be set", http.StatusBadRequest)
            return
        }

        phone := r.MultipartForm.Value["phone"]
        if len(phone) == 0 {
            logger.Error("phone not set", zap.Error(err))
            http.Error(w, "api expects phone to be set", http.StatusBadRequest)
            return
        }

        body := r.MultipartForm.Value["body"]
        if len(body) == 0 {
            logger.Error("body not set", zap.Error(err))
            http.Error(w, "api expects body to be set", http.StatusBadRequest)
            return
        }

        files := r.MultipartForm.File["photos"]
        if len(files) == 0 {
            logger.Error("no files were submitted", zap.Error(err))
            http.Error(w, "api expects one or more files to be submitted", http.StatusBadRequest)
            return
        }

        emailService := NewEmailService()

        sendEmailInput := sesv2.SendEmailInput{}

        destination := &types.Destination{
            ToAddresses: []string{destinationEmail},
        }

        // add the attachments to the email
        for _, file := range files {
            f, err := file.Open()
            if err != nil {
                http.Error(w, err.Error(), http.StatusInternalServerError)
                return
            }
            defer f.Close()

            // not sure what to do here to get the email with the attachements
        }

        message := &types.RawMessage{
            Data: make([]byte, 0), // This must change to be the bytes of the raw message
        }

        content := &types.EmailContent{
            Raw: message,
        }

        sendEmailInput.Content = content
        sendEmailInput.Destination = destination
        sendEmailInput.FromEmailAddress = aws.String(email[0])

        err = emailService.SendEmail(logger, r.Context(), &sendEmailInput)
        if err != nil {
            logger.Error("an error occured sending the email", zap.Error(err))
            http.Error(w, "error sending email", http.StatusBadRequest)
            return
        }

        w.WriteHeader(http.StatusOK)
    })
}

Nach meinem Verständnis (bitte korrigieren Sie mich, wenn ich falsch liege) muss ich die ursprüngliche Nachricht in einem ähnlichen Format erstellen. Vorausgesetzt, das stimmt, weiß ich einfach nicht, wie ich das in Go machen soll.

Workaround

Um Anhänge zu erstellen, müssen Sie base64 消息内容来 encode verwenden.

Hier ist ein Beispiel für das Senden einer CSV-Datei als Anhang:

import (
  // ...
  secretutils "github.com/alessiosavi/GoGPUtils/aws/secrets"
  sesutils "github.com/alessiosavi/GoGPUtils/aws/ses"
)

type MailConf struct {
    FromName string   `json:"from_name,omitempty"`
    FromMail string   `json:"from_mail,omitempty"`
    To       string   `json:"to,omitempty"`
    CC       []string `json:"cc,omitempty"`
}

func SendRawMail(filename string, data []byte) error {
    var mailConf MailConf
    if err := secretutils.UnmarshalSecret(os.Getenv("XXX_YOUR_SECRET_STORED_IN_AWS"), &mailConf); err != nil {
        return err
    }
    subject := fmt.Sprintf("Found errors for the following file: %s", filename)
    var carbonCopy string
    if len(mailConf.CC) > 0 {
        carbonCopy = stringutils.JoinSeparator(",", mailConf.CC...)
    } else {
        carbonCopy = ""
    }
    raw := fmt.Sprintf(`From: "%[1]s" <%[2]s>
To: %[3]s
Cc: %[4]s
Subject: %[5]s
Content-Type: multipart/mixed;
    boundary="1"

--1
Content-Type: multipart/alternative;
    boundary="sub_1"

--sub_1
Content-Type: string/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable

Please see the attached file for a list of errors

--sub_1
Content-Type: string/html; charset=utf-8
Content-Transfer-Encoding: quoted-printable

<html>
<head></head>
<body>
<h1>%[6]s</h1>
<p><h2>Please see the attached file for the list of the rows.<h2></p>
</body>
</html>

--sub_1--

--1
Content-Type: string/plain; name="errors_%[6]s"
Content-Description: errors_%[6]s
Content-Disposition: attachment;filename="errors_%[6]s";
creation-date="%[7]s";
Content-Transfer-Encoding: base64

%[8]s

--1--`, mailConf.FromName, mailConf.FromMail, mailConf.To, carbonCopy, subject, strings.Replace(filename, ".csv", ".json", 1), time.Now().Format("2-Jan-06 3.04.05 PM"), base64.StdEncoding.EncodeToString(data))

    return sesutils.SendMail([]byte(raw))
}


Das obige ist der detaillierte Inhalt vonSenden Sie Roh-E-Mails mit Anhängen in Go über AWS SES v2. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen