带附件的 AWS-Pinpoint 电子邮件通知不起作用

AWS-Pinpoint email notification with attachment not working

我正在尝试做一个 POC,我在其中使用 aws pinpoint 发送电子邮件。简单的电子邮件工作正常,但当我尝试发送带附件的电子邮件时,我无法确定什么是正确的方式。 在文档中,此 link 描述了需要做什么

https://docs.aws.amazon.com/pinpoint-email/latest/APIReference/API_RawMessage.html

以下是我在各个网站上找到的代码:

        // Create a new email client
        AmazonPinpointEmail client = AmazonPinpointEmailClientBuilder.standard()
                .withRegion(region).build();

        // Combine all of the components of the email to create a request.
        SendEmailRequest request = new SendEmailRequest()
                .withFromEmailAddress(senderAddress)
                .withConfigurationSetName(configurationSet)
                .withDestination(new Destination()
                        .withToAddresses(toAddresses)
                        .withCcAddresses(ccAddresses)
                        .withBccAddresses(bccAddresses)
                )
                .withContent(new EmailContent()
                        .withRaw(new RawMessage().withData())
                        //the withData takes type buffer, how to create a message which contains attachement.
        client.sendEmail(request);
        System.out.println("Email sent!");
        System.out.println(request);

有人用这个 api 发送附件,请帮助创建包含附件、主题和正文的消息。 谢谢

要使用 Amazon PinpointEmail 发送带附件的电子邮件,您需要(为简单起见):

  • JavaMail Library : 一个API,用于利用[=]之类的类来撰写、编写和阅读电子信息22=]BodyPart, MimeBodyPart e.t.c

下面是我测试过的示例 java 代码片段 :

    Session session = Session.getDefaultInstance(new Properties());

    // Create a new MimeMessage object.
    MimeMessage message = new MimeMessage(session);

    // Add subject, from and to lines.
    message.setSubject(subject, "UTF-8");
    message.setFrom(new InternetAddress(senderAddress));
    message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(toAddress));

    // Create a multipart/alternative child container.
    MimeMultipart msg_body = new MimeMultipart("alternative");

    // Create a wrapper for the HTML and text parts.        
    MimeBodyPart wrap = new MimeBodyPart();

    // Define the text part.
    MimeBodyPart textPart = new MimeBodyPart();
    textPart.setContent(BODY_TEXT, "text/plain; charset=UTF-8");

    // Define the HTML part.
    MimeBodyPart htmlPart = new MimeBodyPart();
    htmlPart.setContent(BODY_HTML,"text/html; charset=UTF-8");

    // Add the text and HTML parts to the child container.
    msg_body.addBodyPart(textPart);
    msg_body.addBodyPart(htmlPart);

    // Add the child container to the wrapper object.
    wrap.setContent(msg_body);

    // Create a multipart/mixed parent container.
    MimeMultipart msg = new MimeMultipart("mixed");

    // Add the parent container to the message.
    message.setContent(msg);

    // Add the multipart/alternative part to the message.
    msg.addBodyPart(wrap);

    // Define the attachment
    MimeBodyPart att = new MimeBodyPart();
    DataSource fds = new FileDataSource(ATTACHMENT);
    att.setDataHandler(new DataHandler(fds));
    att.setFileName(fds.getName());

    // Add the attachment to the message.
    msg.addBodyPart(att);

    // Try to send the email.
    try {

        System.out.println("===============================================");

        System.out.println("Getting Started with Amazon PinpointEmail"
                +"using the AWS SDK for Java...");
        System.out.println("===============================================\n");


        // Instantiate an Amazon PinpointEmail client, which will make the service call with the supplied AWS credentials.
        AmazonPinpointEmail client = AmazonPinpointEmailClientBuilder.standard()
            .withRegion(Regions.US_EAST_1).build();

        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        message.writeTo(outputStream);

              SendEmailRequest rawEmailRequest = new SendEmailRequest()
                      .withFromEmailAddress(senderAddress)
                      .withDestination(new Destination()
                          .withToAddresses(toAddress)
                      )
                      .withContent(new EmailContent()
                              .withRaw(new RawMessage().withData(ByteBuffer.wrap(outputStream.toByteArray())))
                      );

        client.sendEmail(rawEmailRequest);

        System.out.println("Email sent!");
        // Display an error if something goes wrong.
    } catch (Exception ex) {
        System.out.println("Email Failed");
        System.err.println("Error message: " + ex.getMessage());
        ex.printStackTrace();
    }

以上代码可以总结为6个步骤:

  1. 获取会话
  2. 创建 MimeBodyPart 对象
  3. 创建 MimeMultiPart 对象
  4. 创建数据源(定义附件)
  5. 将部分添加到 MimeMultiPart
  6. 通过 AmazonPinpointEmail 发送电子邮件 API

您可以在github

中找到完整的代码

希望对您有所帮助。