在 Java 中通过 Amazon 发送带附件的电子邮件的示例

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/7963439/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-30 22:14:26  来源:igfitidea点击:

Example of sending an email with attachment via Amazon in Java

javaemailamazon-web-services

提问by Jason

Does anyone have an example of sending an email, with an attachment, via Amazon SES (in Java)?

有没有人有通过 Amazon SES(在 Java 中)发送带有附件的电子邮件的示例?

回答by Ivan Savchenko

Maybe a little bit late, but you can use this code (you also need Java Mail):

也许有点晚了,但你可以使用这个代码(你还需要 Java Mail):

public class MailSender
{
      private Transport AWSTransport;
      ...
      //Initialize transport
      private void initAWSTransport() throws MessagingException
      {
        String keyID = <your key id>
        String secretKey = <your secret key>
        MailAWSCredentials credentials = new MailAWSCredentials();
        credentials.setCredentials(keyID, secretKey);
        AmazonSimpleEmailService ses = new AmazonSimpleEmailServiceClient(credentials);
        Properties props = new Properties();
            props.setProperty("mail.transport.protocol", "aws");
        props.setProperty("mail.aws.user", credentials.getAWSAccessKeyId());
        props.setProperty("mail.aws.password", credentials.getAWSSecretKey());
        AWSsession = Session.getInstance(props);
        AWStransport = new AWSJavaMailTransport(AWSsession, null);
        AWStransport.connect();
      }

  public void sendEmail(byte[] attachment)
  {
    //mail properties
    String senderAddress = <Sender address>;
    String recipientAddress = <Recipient address>;
    String subject = <Mail subject>;
    String text = <Your text>;
    String mimeTypeOfText = <MIME type of text part>;
    String fileMimeType = <MIME type of your attachment>;
    String fileName = <Name of attached file>;

    initAWSTransport();

    try
    {
      // Create new message
      Message msg = new MimeMessage(AWSsession);
      msg.setFrom(new InternetAddress(senderAddress));
      msg.addRecipient(Message.RecipientType.TO, new InternetAddress(recipientAddress));
      msg.setSubject(subject);

      //Text part
      Multipart multipart = new MimeMultipart();
      BodyPart messageBodyPart = new MimeBodyPart();
      messageBodyPart.setContent(text, mimeTypeOfText);
      multipart.addBodyPart(messageBodyPart);

      //Attachment part
      if (attachment != null && attachment.length != 0)
      {
        messageBodyPart = new MimeBodyPart();
        DataSource source = new ByteArrayDataSource(attachment,fileMimeType);
        messageBodyPart.setDataHandler(new DataHandler(source));
        messageBodyPart.setFileName(fileName);
        multipart.addBodyPart(messageBodyPart);
      }
      msg.setContent(multipart);

      //send message
      msg.saveChanges();
      AWSTransport.sendMessage(msg, null);
    } catch (MessagingException e){...}
  }
}

回答by Christiano Guedes

Maybe a little bit late too. Alternative to send mail using Java Mail and Amazon Raw Mail Sender

也许也有点晚了。使用 Java Mail 和 Amazon Raw Mail Sender 发送邮件的替代方法

public static void sendMail(String subject, String message, byte[] attachement, String fileName, String contentType, String from, String[] to) {
    try {
        // JavaMail representation of the message
        Session s = Session.getInstance(new Properties(), null);
        MimeMessage mimeMessage = new MimeMessage(s);

        // Sender and recipient
        mimeMessage.setFrom(new InternetAddress(from));
        for (String toMail : to) {
            mimeMessage.addRecipient(javax.mail.Message.RecipientType.TO, new InternetAddress(toMail));
        }

        // Subject
        mimeMessage.setSubject(subject);

        // Add a MIME part to the message
        MimeMultipart mimeBodyPart = new MimeMultipart();
        BodyPart part = new MimeBodyPart();
        part.setContent(message, MediaType.TEXT_HTML);
        mimeBodyPart.addBodyPart(part);

        // Add a attachement to the message
        part = new MimeBodyPart();
        DataSource source = new ByteArrayDataSource(attachement, contentType);
        part.setDataHandler(new DataHandler(source));
        part.setFileName(fileName);
        mimeBodyPart.addBodyPart(part);

        mimeMessage.setContent(mimeBodyPart);

        // Create Raw message
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        mimeMessage.writeTo(outputStream);
        RawMessage rawMessage = new RawMessage(ByteBuffer.wrap(outputStream.toByteArray()));

        // Credentials
        String keyID = "";// <your key id>
        String secretKey = "";// <your secret key>
        AWSCredentials credentials = new BasicAWSCredentials(keyID, secretKey);
        AmazonSimpleEmailServiceClient client = new AmazonSimpleEmailServiceClient(credentials);

        // Send Mail
        SendRawEmailRequest rawEmailRequest = new SendRawEmailRequest(rawMessage);
        rawEmailRequest.setDestinations(Arrays.asList(to));
        rawEmailRequest.setSource(from);
        client.sendRawEmail(rawEmailRequest);

    } catch (IOException | MessagingException e) {
        // your Exception
        e.printStackTrace();
    }
}

回答by Big Pumpkin

https://docs.aws.amazon.com/ses/latest/DeveloperGuide/send-email-raw.htmlhas an example that sends both html and text bodies (with an attachment, of course). FWIW, here is the conversion and reorganization of its Java code to Kotlin. The dependency is 'com.sun.mail:javax.mail:1.6.2'.

https://docs.aws.amazon.com/ses/latest/DeveloperGuide/send-email-raw.html有一个发送 html 和文本正文的示例(当然还有附件)。FWIW,这里是它的 Java 代码到 Kotlin 的转换和重组。依赖是'com.sun.mail:javax.mail:1.6.2'.

data class Attachment(val fileName: String, val contentType: String, val data: ByteArray)

fun sendEmailWithAttachment(from: String, to: List<String>, subject: String, htmlBody: String, textBody: String,
                            attachment: Attachment) {
    try {
        val textPart = MimeBodyPart().apply {
            setContent(textBody, "text/plain; charset=UTF-8")
        }

        val htmlPart = MimeBodyPart().apply {
            setContent(htmlBody, "text/html; charset=UTF-8")
        }

        // Create a multipart/alternative child container.
        val childPart = MimeMultipart("alternative").apply {
            // Add the text and HTML parts to the child container.
            addBodyPart(textPart)
            addBodyPart(htmlPart)
        }

        // Create a wrapper for the HTML and text parts.
        val childWrapper = MimeBodyPart().apply {
            setContent(childPart)
        }

        // Define the attachment
        val dataSource = ByteArrayDataSource(attachment.data, attachment.contentType)
        // val dataSource = FileDataSource(filePath)  // if using file directly
        val attPart = MimeBodyPart().apply {
            dataHandler = DataHandler(dataSource)
            fileName = attachment.fileName
        }

        // Create a multipart/mixed parent container.
        val parentPart = MimeMultipart("mixed").apply {
            // Add the multipart/alternative part to the message.
            addBodyPart(childWrapper)
            addBodyPart(attPart)  // Add the attachment to the message.
        }

        // JavaMail representation of the message
        val s = Session.getDefaultInstance(Properties())
        val mimeMessage = MimeMessage(s).apply {
            // Add subject, from and to lines
            this.subject = subject
            setFrom(InternetAddress(from))
            to.forEach() {
                addRecipient(javax.mail.Message.RecipientType.TO, InternetAddress(it))
            }

            // Add the parent container to the message.
            setContent(parentPart)
        }

        // Create Raw message
        val rawMessage = with(ByteArrayOutputStream()) {
            mimeMessage.writeTo(this)
            RawMessage(ByteBuffer.wrap(this.toByteArray()))
        }

        val rawEmailRequest = SendRawEmailRequest(rawMessage).apply {
            source = from
            setDestinations(to)
        }

        // Send Mail
        val client = AmazonSimpleEmailServiceClientBuilder.standard()
                .withRegion(Regions.US_EAST_1).build()
        client.sendRawEmail(rawEmailRequest)
        println("Email with attachment sent to $to")
    } catch (e: Exception) {
        println(e)
    }
}

回答by Chloe

Here is an updated, cleaned up version with logging and check for production.

这是一个更新的、清理过的版本,带有日志记录和生产检查。

public void sendEmail(String to, String subject, String body, String attachment, String mimeType, String fileName) {
    if (to == null) return;

    String environment = System.getProperty("ENVIRONMENT", System.getenv("ENVIRONMENT"));
    String logMessage;
    if (environment != null && environment.equals("production")) {
        logMessage = "Sent email to " + to + ".";
    } else {
        to = "[email protected]";
        logMessage = "Email sent to [email protected] because $ENVIRONMENT != 'production'";
    }

    // https://docs.aws.amazon.com/ses/latest/DeveloperGuide/examples-send-raw-using-sdk.html
    Session session = Session.getDefaultInstance(new Properties());
    MimeMessage message = new MimeMessage(session);
    try {
        message.setSubject(subject, "UTF-8");
        message.setFrom(new InternetAddress(FROM));
        message.setRecipients(javax.mail.Message.RecipientType.TO, InternetAddress.parse(to));
            MimeMultipart msg = new MimeMultipart("mixed");
                MimeBodyPart wrap = new MimeBodyPart();
                    MimeMultipart msgBody = new MimeMultipart("alternative");
                        MimeBodyPart textPart = new MimeBodyPart();
                        MimeBodyPart htmlPart = new MimeBodyPart();
                        textPart.setContent(body, "text/plain; charset=UTF-8");
                        htmlPart.setContent(body,"text/html; charset=UTF-8");
                    msgBody.addBodyPart(textPart);
                    msgBody.addBodyPart(htmlPart);
                wrap.setContent(msgBody);
            msg.addBodyPart(wrap);
                MimeBodyPart att = new MimeBodyPart();
                att.setDataHandler(new DataHandler(attachment, mimeType));
                att.setFileName(fileName);
//                  DataSource fds = new FileDataSource(attachment);
//                  att.setDataHandler(new DataHandler(fds));
//                  att.setFileName(fds.getName());
            msg.addBodyPart(att);
        message.setContent(msg);

        AmazonSimpleEmailService client = AmazonSimpleEmailServiceClientBuilder
                .standard().withRegion(Regions.US_EAST_1).build();
        message.writeTo(System.out);
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        message.writeTo(outputStream);
        RawMessage rawMessage = new RawMessage(ByteBuffer.wrap(outputStream.toByteArray()));
        SendRawEmailRequest rawEmailRequest = new SendRawEmailRequest(rawMessage);
//                      .withConfigurationSetName(CONFIGURATION_SET);
        client.sendRawEmail(rawEmailRequest);
        Logger.info(this.getClass(), "sendEmail()", logMessage);
    } catch (Exception ex) {
        Logger.info(this.getClass(), "sendEmail()", "The email was not sent. Error: " + ex.getMessage());
    }
}

https://docs.aws.amazon.com/ses/latest/DeveloperGuide/examples-send-raw-using-sdk.html

https://docs.aws.amazon.com/ses/latest/DeveloperGuide/examples-send-raw-using-sdk.html

You use a shared credentials file to pass your AWS access key ID and secret access key. As an alternative to using a shared credentials file, you can specify your AWS access key ID and secret access key by setting two environment variables (AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY, respectively).

您使用共享凭证文件来传递您的 AWS 访问密钥 ID 和秘密访问密钥。作为使用共享凭证文件的替代方法,您可以通过设置两个环境变量(分别为 AWS_ACCESS_KEY_ID 和 AWS_SECRET_ACCESS_KEY)来指定您的 AWS 访问密钥 ID 和秘密访问密钥。