我正在尝试使用电子邮件模板来个性化我发送的电子邮件,方法是通过 JSON 字符串将数据传递到已创建的模板。尽管我可以通过附加文件来发送原始电子邮件,但我想要一种在使用 SES 中的电子邮件模板时可以在电子邮件中发送电子邮件附件的方法。
根据我的 RND,无法使用 SES 模板和附件发送电子邮件,但是我们可以这样做。
使用下面的代码从 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();
没有选项可以发送带附件的模板电子邮件。另一方面,SendRawEmail 要求您构建自己的 MIME 格式的电子邮件,这绝非易事。您可以将 Nodemailer 与 AWS SES 结合使用来完成此操作。请关注此链接
使用 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;