private void sendMail( HttpServletRequest request, BlogAuthor blogAuthor, Entity blog, Settings settings) throws IOException { if (settings.dontSendEmail()) { return; } try { String digest = DS.getBlogDigest(blog); MailService mailService = MailServiceFactory.getMailService(); Message reply = new Message(); reply.setSender(blogAuthor.toString()); Email sender = (Email) blog.getProperty(SenderProperty); reply.setTo(sender.getEmail()); String subject = (String) blog.getProperty(SubjectProperty); reply.setSubject("Blog: " + subject + " received"); StringBuilder sb = new StringBuilder(); URI reqUri = new URI(request.getScheme(), NamespaceManager.get(), "", ""); if (!settings.isPublishImmediately()) { sb.append("<div>"); sb.append( "<p>Blog is not yet published because it was sent from untrusted email address " + sender.getEmail() + ". </p>"); URI publishUri = reqUri.resolve( "/blog?action=publish&blog=" + KeyFactory.keyToString(blog.getKey()) + "&auth=" + digest); sb.append("<a href=\"" + publishUri.toASCIIString() + "\">Publish Blog</a>"); sb.append("</div>"); } sb.append("<div>"); sb.append("<p>If blog is not ok, you can delete and then resend it.</p>"); URI deleteUri = reqUri.resolve( "/blog?action=remove&blog=" + KeyFactory.keyToString(blog.getKey()) + "&auth=" + digest); sb.append("<a href=\"" + deleteUri.toASCIIString() + "\">Delete Blog</a>"); sb.append("</div>"); reply.setHtmlBody(sb.toString()); mailService.send(reply); } catch (URISyntaxException ex) { throw new IOException(ex); } }
private void handleMail( HttpServletRequest request, HttpServletResponse response, BlogAuthor blogAuthor) throws IOException, ServletException, EntityNotFoundException, MessagingException, HttpException { DS ds = DS.get(); Properties props = new Properties(); Session session = Session.getDefaultInstance(props, null); MimeMessage message = new MimeMessage(session, request.getInputStream()); String messageId = getMessageId(message); String contentType = message.getContentType(); if (messageId == null) { log("messageID missing"); response.sendError(HttpServletResponse.SC_BAD_REQUEST); return; } log("Message-ID=" + messageId); // TODO authorization if (handleSpot(message)) { return; } InternetAddress sender = (InternetAddress) message.getSender(); log("sender=" + sender); if (sender == null) { Address[] from = message.getFrom(); if (from != null && from.length != 0) { sender = (InternetAddress) from[0]; } } if (sender == null) { log("Sender missing"); response.sendError(HttpServletResponse.SC_BAD_REQUEST); return; } Email senderEmail = new Email(sender.getAddress()); Settings settings = ds.getSettingsFor(senderEmail); if (settings == null) { log(senderEmail.getEmail() + " not allowed to send blogs"); response.sendError(HttpServletResponse.SC_FORBIDDEN); return; } String[] ripperDate = message.getHeader(BlogRipper + "Date"); boolean ripping = ripperDate != null && ripperDate.length > 0; Object content = message.getContent(); if (content instanceof Multipart) { Multipart multipart = (Multipart) message.getContent(); List<BodyPart> bodyPartList = findParts(multipart); try { Entity blog = null; String htmlBody = getHtmlBody(bodyPartList); if (htmlBody != null && htmlBody.length() > 10) { boolean publishImmediately = settings.isPublishImmediately(); blog = updateBlog(messageId, message, htmlBody, publishImmediately, senderEmail); if (!ripping) { if (blog != null) { sendMail(request, blogAuthor, blog, settings); } } else { log("not sending email because ripping"); } } else { log("no html body"); } List<Future<HTTPResponse>> futureList = new ArrayList<Future<HTTPResponse>>(); for (BodyPart bodyPart : bodyPartList) { Collection<Future<HTTPResponse>> futures = handleBodyPart(request, blog, bodyPart, settings); if (futures != null) { futureList.addAll(futures); } } long remainingMillis = ApiProxy.getCurrentEnvironment().getRemainingMillis(); log("remainingMillis=" + remainingMillis); for (Future<HTTPResponse> res : futureList) { try { HTTPResponse hr = res.get(); log("code=" + hr.getResponseCode()); if (hr.getResponseCode() != HttpServletResponse.SC_OK) { throw new ServletException("blob upload failed code=" + hr.getResponseCode()); } } catch (InterruptedException ex) { throw new IOException(ex); } catch (ExecutionException ex) { throw new IOException(ex); } } } catch (MessagingException ex) { throw new IOException(ex); } } else { if (content instanceof String) { String bodyPart = (String) content; if (contentType.startsWith("text/plain")) { bodyPart = textPlainToHtml(bodyPart); } boolean publishImmediately = settings.isPublishImmediately(); Entity blog = updateBlog(messageId, message, bodyPart, publishImmediately, senderEmail); if (blog != null) { sendMail(request, blogAuthor, blog, settings); } } else { log("body not MultiPart of String"); } } }