使用 AWS SES 中的模板发送带附件的电子邮件

问题描述 投票:0回答:3

我正在尝试使用电子邮件模板来个性化我发送的电子邮件,方法是通过 JSON 字符串将数据传递到已创建的模板。尽管我可以通过附加文件来发送原始电子邮件,但我想要一种在使用 SES 中的电子邮件模板时可以在电子邮件中发送电子邮件附件的方法。

amazon-web-services aws-sdk amazon-ses
3个回答
8
投票

根据我的 RND,无法使用 SES 模板和附件发送电子邮件,但是我们可以这样做。

  1. 使用下面的代码从 SES 获取模板,然后我们可以替换令牌,然后我们在 SendRawEmail 电子邮件中使用它们以及附件。

     AmazonSimpleEmailService emailSendClient = 
      AmazonSimpleEmailServiceClient.builder()
             .withRegion(Regions.AP_SOUTH_1).build();
     String templateName = "MyTemplate";
     GetTemplateRequest getTemplateRequest = new GetTemplateRequest();
     getTemplateRequest.setTemplateName(templateName);
     GetTemplateResult temp = emailSendClient.getTemplate(getTemplateRequest);
     String htmlpart = temp.getTemplate().getHtmlPart();
    

0
投票

没有选项可以发送带附件的模板电子邮件。另一方面,SendRawEmail 要求您构建自己的 MIME 格式的电子邮件,这绝非易事。您可以将 Nodemailer 与 AWS SES 结合使用来完成此操作。请关注此链接


0
投票

使用 SES v2、Java 17 和 jakarta.mail 的解决方案:

public class EmailContentDto {
    private String templateName;
    private String content;
    private String subject;
    private String[] to;
    private String[] cc;
    private String[] bcc;
    private EmailAttachmentDto[] attachments;
}

private void sendTemplated(EmailContentDto email) throws Exception {
    EmailAttachmentDto[] attachments = email.getAttachments();
    if (attachments == null || attachments.length < 1) {
        Template template = Template.builder()
                .templateName(email.getTemplateName())
                .templateData(email.getContent())
                .build();

        EmailContent emailContent = EmailContent.builder()
                .template(template)
                .build();

        SendEmailRequest emailRequest = buildSendEmailRequest(email, emailContent);

        awsSesService.send(emailRequest);
    } else {
        sendRawTemplated(email);
    }
}

private void sendRawTemplated(EmailContentDto email) throws Exception {
    String mimeContent = awsSesService.getRenderedTemplate(email.getTemplateName(), email.getContent());
    String content = parseMimeContent(mimeContent);
    MimeBodyPart bodyPart = new MimeBodyPart();
    bodyPart.setContent(content, "text/html; charset=" + EmailConstants.DEF_CHARSET);
    sendRaw(email, bodyPart);
}

private String parseMimeContent(String mimeContent) throws Exception {
    Session session = Session.getDefaultInstance(new Properties());
    InputStream inputStream = new ByteArrayInputStream(mimeContent.getBytes());
    MimeMessage mimeMessage = new MimeMessage(session, inputStream);
    return mimeMessage.getContent().toString();
}

private SendEmailRequest buildSendEmailRequest(EmailContentDto emailDto, EmailContent content) {
    return SendEmailRequest.builder()
            .destination(Destination.builder()
                    .toAddresses(emailDto.getTo())
                    .bccAddresses(emailDto.getBcc() == null ? new String[0] : emailDto.getBcc())
                    .ccAddresses(emailDto.getCc() == null ? new String[0] : emailDto.getCc())
                    .build())
            .content(content)
            .fromEmailAddress(emailFrom)
            .build();
}

private void sendRaw(EmailDto email) throws Exception {
    MimeBodyPart textPart = new MimeBodyPart();
    textPart.setContent(email.getContent(), "text/plain; charset=" + EmailConstants.DEF_CHARSET);
    sendRaw(email, textPart);
}

private void sendRaw(EmailDto email, MimeBodyPart textPart) throws Exception {
    Session session = Session.getDefaultInstance(new Properties());
    MimeMessage message = new MimeMessage(session);

    // basic
    message.setSubject(email.getSubject(), EmailConstants.DEF_CHARSET);
    message.setFrom(new InternetAddress(emailFrom));
    message.setRecipients(jakarta.mail.Message.RecipientType.TO, InternetAddress.parse(email.getToJoining()));
    String cc = email.getCcJoining();
    if (cc != null) {
        message.setRecipients(jakarta.mail.Message.RecipientType.CC, InternetAddress.parse(cc));
    }
    String bcc = email.getBccJoining();
    if (bcc != null) {
        message.setRecipients(jakarta.mail.Message.RecipientType.BCC, InternetAddress.parse(bcc));
    }

    // multipart container.
    MimeMultipart msgBody = new MimeMultipart("alternative");
    MimeBodyPart wrap = new MimeBodyPart();
    msgBody.addBodyPart(textPart);
    wrap.setContent(msgBody);
    MimeMultipart msg = new MimeMultipart("mixed");
    message.setContent(msg);
    msg.addBodyPart(wrap);

    // attachments
    for (EmailAttachmentDto attachment : email.getAttachments()) {
        MimeBodyPart att = new MimeBodyPart();
        byte[] decoded = Base64.getDecoder().decode(attachment.getContent());
        DataSource fds = new ByteArrayDataSource(decoded, attachment.getMimeType());
        att.setDataHandler(new DataHandler(fds));
        att.setFileName(attachment.getName());
        msg.addBodyPart(att);
    }

    // RawMessage
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    message.writeTo(outputStream);
    ByteBuffer buf = ByteBuffer.wrap(outputStream.toByteArray());
    byte[] arr = new byte[buf.remaining()];
    buf.get(arr);
    SdkBytes data = SdkBytes.fromByteArray(arr);
    RawMessage rawMessage = RawMessage.builder().data(data).build();
    SendEmailRequest emailRequest = SendEmailRequest.builder()
            .content(EmailContent.builder().raw(rawMessage).build())
            .build();

    this.awsSesService.send(emailRequest);
}

class AWSSesService {
    public SendEmailResponse send(final SendEmailRequest request) {
        SesV2Client client = getClient();
        return client.sendEmail(request);
    }
    // ...
}

导入 jakarta.mail 2.0.1:

import jakarta.activation.DataHandler;
import jakarta.activation.DataSource;
import jakarta.mail.Session;
import jakarta.mail.internet.InternetAddress;
import jakarta.mail.internet.MimeBodyPart;
import jakarta.mail.internet.MimeMessage;
import jakarta.mail.internet.MimeMultipart;
import jakarta.mail.util.ByteArrayDataSource;
© www.soinside.com 2019 - 2024. All rights reserved.