Guest User

Untitled

a guest
Jun 18th, 2018
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.68 KB | None | 0 0
  1. package notification;
  2.  
  3. import com.amazonaws.regions.Regions;
  4. import com.amazonaws.services.simpleemail.AmazonSimpleEmailService;
  5. import com.amazonaws.services.simpleemail.AmazonSimpleEmailServiceClientBuilder;
  6. import com.amazonaws.services.simpleemail.model.*;
  7. import com.google.common.base.Joiner;
  8. import com.google.common.base.Preconditions;
  9. import com.google.inject.Inject;
  10. import com.typesafe.config.Config;
  11. import exceptions.BadResponseException;
  12. import play.Logger;
  13.  
  14. import javax.activation.DataHandler;
  15. import javax.activation.DataSource;
  16. import javax.mail.Session;
  17. import javax.mail.internet.InternetAddress;
  18. import javax.mail.internet.MimeBodyPart;
  19. import javax.mail.internet.MimeMessage;
  20. import javax.mail.internet.MimeMultipart;
  21. import javax.mail.util.ByteArrayDataSource;
  22. import java.io.ByteArrayOutputStream;
  23. import java.nio.ByteBuffer;
  24. import java.util.List;
  25. import java.util.Properties;
  26. import java.util.stream.Collectors;
  27.  
  28. /**
  29. * @author James Lin
  30. */
  31. public class SESServiceImpl implements EmailService {
  32.  
  33. private static final Logger.ALogger logger = Logger.of(SESServiceImpl.class);
  34.  
  35. private AmazonSimpleEmailService client;
  36. private static String SENDER;
  37. private static final int MAX_RECIPIENTS = 50; // AWS SES 限制每次的有收信者最多 50 人
  38.  
  39. @Inject
  40. public SESServiceImpl(Config config) {
  41. client = AmazonSimpleEmailServiceClientBuilder.standard().withRegion(Regions.US_EAST_1).build();
  42. SENDER = config.getString("email.sender");
  43. }
  44.  
  45. @Override
  46. public void send(Notification notification) {
  47. Preconditions.checkArgument((notification.users != null && !notification.users.isEmpty()) &&
  48. (notification.message.type.isPublic() || (notification.users.size() == 1 && notification.message.template != null)));
  49. try {
  50. List<String> toAddresses = notification.users.stream().map(user -> user.email).collect(Collectors.toList());
  51. int fromIndex = 0;
  52. while(fromIndex < toAddresses.size()) {
  53. int toIndex = (fromIndex + MAX_RECIPIENTS) < toAddresses.size() ? (fromIndex + MAX_RECIPIENTS) : toAddresses.size();
  54. SendEmailRequest request = new SendEmailRequest().withDestination(new Destination().withToAddresses(toAddresses.subList(fromIndex, toIndex)))
  55. .withSource(SENDER).withMessage(new com.amazonaws.services.simpleemail.model.Message()
  56. .withSubject(new Content().withCharset("UTF-8").withData(notification.message.title))
  57. .withBody(new Body().withHtml(new Content().withCharset("UTF-8").withData(notification.message.content))));
  58. client.sendEmail(request);
  59. fromIndex += MAX_RECIPIENTS;
  60. if(fromIndex < toAddresses.size()) {
  61. Thread.sleep(3000); // 等X秒再寄信,比較不會被擋 ???
  62. }
  63. }
  64. } catch (Throwable e) {
  65. throw new BadResponseException(String.format("fail to send email %s", notification), e, "AWS-SES");
  66. }
  67. }
  68.  
  69. @Override
  70. public void send(EmailMessage myMessage) {
  71. try {
  72. Session session = Session.getDefaultInstance(new Properties());
  73. MimeMessage javaMailMessage = new MimeMessage(session);
  74. javaMailMessage.setSubject(myMessage.subject, "UTF-8");
  75. javaMailMessage.setFrom(new InternetAddress(SENDER));
  76. javaMailMessage.setRecipients(javax.mail.Message.RecipientType.TO, InternetAddress.parse(Joiner.on(",").join(myMessage.addresses)));
  77.  
  78. MimeMultipart multipart = new MimeMultipart();
  79. MimeBodyPart htmlBodyPart = new MimeBodyPart();
  80. htmlBodyPart.setContent(myMessage.body, "text/html; charset=UTF-8");
  81. multipart.addBodyPart(htmlBodyPart);
  82.  
  83. MimeBodyPart attachmentPart = new MimeBodyPart();
  84. for(EmailMessage.Attachment attachment: myMessage.attachments) {
  85. DataSource fds = new ByteArrayDataSource(attachment.content, attachment.mimeType);
  86. ((ByteArrayDataSource) fds).setName(attachment.fileName);
  87. attachmentPart.setDataHandler(new DataHandler(fds));
  88. attachmentPart.setFileName(fds.getName());
  89. multipart.addBodyPart(attachmentPart);
  90. }
  91. javaMailMessage.setContent(multipart);
  92.  
  93. ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
  94. javaMailMessage.writeTo(outputStream);
  95. RawMessage rawMessage = new RawMessage(ByteBuffer.wrap(outputStream.toByteArray()));
  96. SendRawEmailRequest request = new SendRawEmailRequest(rawMessage);
  97. client.sendRawEmail(request);
  98. } catch (Throwable e) {
  99. throw new BadResponseException(String.format("fail to send email %s", myMessage), e, "AWS-SES");
  100. }
  101. }
  102. }
  103.  
  104. public class EmailMessage {
  105.  
  106. public EmailMessage(String subject, String body, Set<String> addresses) {
  107. this.subject = subject;
  108. this.body = body;
  109. this.addresses = addresses;
  110. }
  111.  
  112. public String subject;
  113.  
  114. public String body;
  115.  
  116. public Set<String> addresses;
  117.  
  118. public List<Attachment> attachments = new ArrayList<>();
  119.  
  120. public static class Attachment {
  121.  
  122. public String mimeType = "application/vnd.ms-excel";
  123.  
  124. public String fileName;
  125.  
  126. public InputStream content;
  127.  
  128. public Attachment(String fileName, InputStream content) {
  129. this.fileName = fileName;
  130. this.content = content;
  131. }
  132. }
  133. }
  134.  
  135. public class Notification {
  136.  
  137. public Message message;
  138.  
  139. public Set<User> users;
  140.  
  141. public Notification(Message message, Set<User> users) {
  142. this.message = message;
  143. this.users = users;
  144. }
  145. }
Add Comment
Please, Sign In to add comment