【问题标题】:how to send attached via email using SES and lambda in Java如何在 Java 中使用 SES 和 lambda 通过电子邮件发送附件
【发布时间】:2020-07-27 16:48:56
【问题描述】:

我正在尝试使用 AWS SES 和 java 中的 lambda 通过电子邮件发送存储在 s3 中的文件。邮件已成功发送,但当我尝试打开文件时出现错误“Excel 无法打开文件‘filename.xlsx’,因为文件格式或文件扩展名无效。验证文件未损坏且文件扩展名匹配文件的格式。”

java中的代码片段: 公共类 EmailNotification {

static LambdaLogger logger = null;
private static String SENDER=null;
private static String RECIPIENT=null;
private static String SUBJECT=null;
private static String BODY_TEXT=null;
private static String filekey=null;

public void verifyEmailNotification(Context context) throws Exception {
    LambdaLogger logger = null;
    
    try {
        logger = context.getLogger();
        String bucket_name = "bucket_name";
        String key_name = "path/";
        String file_name ="file_name.xlsx";
        filekey = key_name + file_name;
        AmazonS3 s3client = GetAWSClients.getS3();
        boolean isFileExists=Utility.checkIfFileExists(bucket_name, filekey);
        logger.log("isFileExists " + isFileExists);
        if (isFileExists)
            filekey = key_name + file_name;
        else
            logger.log("file not available");
        
        InputStream stream = s3client.getObject(bucket_name, filekey).getObjectContent();
        XSSFWorkbook workbook = new XSSFWorkbook(stream);
        
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        workbook.write(bos);
        ByteArrayInputStream contentsAsStream = new ByteArrayInputStream(bos.toByteArray());
        ObjectMetadata md = new ObjectMetadata();
        
        md.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        md.setSSEAlgorithm(ObjectMetadata.AES_256_SERVER_SIDE_ENCRYPTION);
        md.setContentLength(bos.toByteArray().length);
        
        SENDER = "sender email";
        RECIPIENT = "receiver email";
        SUBJECT = "subject";
        BODY_TEXT = "Body text";
        
        Session session = Session.getDefaultInstance(new Properties());
        MimeMessage message = new MimeMessage(session);
        message.setSubject(SUBJECT);

        message.setFrom(new InternetAddress(SENDER));
        message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(RECIPIENT));
        MimeMultipart msg_body = new MimeMultipart("alternative");
        MimeBodyPart textPart = new MimeBodyPart();
        textPart.setContent(BODY_TEXT, "text/plain; charset=UTF-8");
        msg_body.addBodyPart(textPart);
        
        MimeBodyPart att = new MimeBodyPart();
        DataSource fds = new ByteArrayDataSource(bos.toByteArray(), "application/octet-stream");
        att.setDataHandler(new DataHandler(fds));
        att.setFileName(TemplateFile);
        message.setContent(msg_body);
        msg_body.addBodyPart(att);
        
        
        try {
            System.out.println("Attempting to send an email through Amazon SES "
                              +"using the AWS SDK for Java...");
            AmazonSimpleEmailService client = GetAWSClients.getSES();
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            message.writeTo(outputStream);
            RawMessage rawMessage = new RawMessage(ByteBuffer.wrap(outputStream.toByteArray()));
            SendRawEmailRequest rawEmailRequest = new SendRawEmailRequest(rawMessage);
            client.sendRawEmail(rawEmailRequest);
            System.out.println("Email sent!");
            workbook.close();
        } catch (Exception ex) {
            System.out.println("Email Failed");
            System.err.println("Error message: " + ex.getMessage());
            ex.printStackTrace();
        }

    }
    catch(Exception ex) {
        System.out.println("Email Failed");
        System.err.println("Error message: " + ex.getMessage());
        ex.printStackTrace();
    }
}

}

【问题讨论】:

  • 请编辑您的问题,向我们展示您的代码发生错误的位置。另外,请注意 S3 路径通常如下所示:s3://bucket-name/path/file_name.xlsx
  • 请编辑您的问题并在其中包含代码,而不是将其放入 cmets。另外,让我们知道是哪一行产生了错误。
  • 当然@JohnRotenstein
  • 我可以发送带有附件的电子邮件,但是当我尝试打开文件时出现错误.. 文件扩展名已更改或文件已损坏。

标签: amazon-web-services amazon-s3 aws-lambda amazon-ses


【解决方案1】:

使用 POI 和工作簿概念并解决了问题。

public void verifyEmailNotification(Context context) throws IOException, MessagingException {
        String bucketName = "bucketName";
        String key = "prefix";
        String fileName = "fileName.xlsx";
        String keyName = key + fileName;
        S3Object fullObject = null;
        try {
            SENDER = "sender email";
            RECIPIENT = "receiver email";
            SUBJECT = "Subject msg";
            BODY_TEXT = "Hi";
                    
            logger = context.getLogger();

            AmazonS3Client s3Client = (AmazonS3Client) AmazonS3ClientBuilder.defaultClient();
            InputStream stream = s3Client.getObject(new GetObjectRequest(bucketName, keyName)).getObjectContent();

            // Preparing input-stream as spreed sheet.
            XSSFWorkbook workbook = new XSSFWorkbook(stream);
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            workbook.write(bos);

            logger.log("Read success\n");

            Session session = Session.getDefaultInstance(new Properties());
            MimeMessage message = new MimeMessage(session);
            message.setSubject(SUBJECT);

            message.setFrom(new InternetAddress(SENDER));
            message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(RECIPIENT));

            MimeMultipart msg_body = new MimeMultipart("alternative");
            MimeBodyPart textPart = new MimeBodyPart();
            textPart.setContent(BODY_TEXT, "text/plain; charset=UTF-8");
            msg_body.addBodyPart(textPart);

            // Preparing the attachment from the spread sheet
            MimeBodyPart att = new MimeBodyPart();
            DataSource fds = new ByteArrayDataSource(bos.toByteArray(), "application/octet-stream");
            att.setDataHandler(new DataHandler(fds));
            att.setFileName(fileName);
            msg_body.addBodyPart(att);
            message.setContent(msg_body);

            logger.log("attachment prepared\n");

            AmazonSimpleEmailServiceClientBuilder.standard().withRegion(Regions.US_EAST_1).build();
            AmazonSimpleEmailService client = GetAWSClients.getSES();
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

            message.writeTo(outputStream);
            RawMessage rawMessage = new RawMessage(ByteBuffer.wrap(outputStream.toByteArray()));
            SendRawEmailRequest rawEmailRequest = new SendRawEmailRequest(rawMessage);
            client.sendRawEmail(rawEmailRequest);
            System.out.println("Email sent!");

        } catch (AmazonServiceException e) {
            // The call was transmitted successfully, but Amazon S3 couldn't process
            // it, so it returned an error response.
            e.printStackTrace();
        } catch (SdkClientException e) {
            // Amazon S3 couldn't be contacted for a response, or the client
            // couldn't parse the response from Amazon S3.
            e.printStackTrace();
        }

    }

【讨论】:

    猜你喜欢
    • 2016-11-17
    • 1970-01-01
    • 1970-01-01
    • 2018-10-12
    • 2015-03-29
    • 2020-11-25
    • 1970-01-01
    • 2015-12-13
    • 2019-12-13
    相关资源
    最近更新 更多