X-Git-Url: http://git.rot13.org/?p=zxing.git;a=blobdiff_plain;f=zxingorg%2Fsrc%2Fcom%2Fgoogle%2Fzxing%2Fweb%2FDecodeEmailTask.java;h=10cbcb1b626a7984f8c625f3014784eb3ea592f2;hp=9105177c6c3d9516a57ccdbd5259577f683de50a;hb=9eb04809796f6d79d0adf63cd866875431a85848;hpb=4ecca315ed38b8f970c2947c904ecbdefb279d0c diff --git a/zxingorg/src/com/google/zxing/web/DecodeEmailTask.java b/zxingorg/src/com/google/zxing/web/DecodeEmailTask.java index 9105177c..10cbcb1b 100644 --- a/zxingorg/src/com/google/zxing/web/DecodeEmailTask.java +++ b/zxingorg/src/com/google/zxing/web/DecodeEmailTask.java @@ -38,13 +38,18 @@ import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import java.awt.image.BufferedImage; import java.io.UnsupportedEncodingException; +import java.io.IOException; import java.util.Properties; import java.util.TimerTask; import java.util.logging.Level; import java.util.logging.Logger; /** - * @author Sean Owen + * A {@link TimerTask} which repeatedly checks an e-mail account for messages with an attached + * image. When one is found it attempts to decode the image and replies with the decoded messages + * by e-mail. + * + * @author Sean Owen (srowen@google.com) */ final class DecodeEmailTask extends TimerTask { @@ -89,75 +94,85 @@ final class DecodeEmailTask extends TimerTask { @Override public void run() { log.info("Checking email..."); + Session session = Session.getInstance(sessionProperties, emailAuthenticator); + Store store = null; + Folder inbox = null; try { - Session session = Session.getInstance(sessionProperties, emailAuthenticator); - Store store = null; - Folder inbox = null; - try { - store = session.getStore("pop3"); - store.connect(); - inbox = store.getFolder("INBOX"); - inbox.open(Folder.READ_WRITE); - int count = inbox.getMessageCount(); - if (count > 0) { - log.info("Found " + count + " messages"); - } - for (int i = 1; i <= count; i++) { - log.info("Processing message " + i); - Message message = inbox.getMessage(i); - Object content = message.getContent(); - if (content instanceof MimeMultipart) { - MimeMultipart mimeContent = (MimeMultipart) content; - int numParts = mimeContent.getCount(); - for (int j = 0; j < numParts; j++) { - MimeBodyPart part = (MimeBodyPart) mimeContent.getBodyPart(j); - String contentType = part.getContentType(); - if (!contentType.startsWith("image/")) { - continue; - } - BufferedImage image = ImageIO.read(part.getInputStream()); - if (image != null) { - Reader reader = new MultiFormatReader(); - Result result = null; - try { - result = reader.decode(new BufferedImageMonochromeBitmapSource(image), DecodeServlet.HINTS); - } catch (ReaderException re) { - log.info("Decoding FAILED"); - } + store = session.getStore("pop3"); + store.connect(); + inbox = store.getFolder("INBOX"); + inbox.open(Folder.READ_WRITE); + int count = inbox.getMessageCount(); + if (count > 0) { + log.info("Found " + count + " messages"); + } + for (int i = 1; i <= count; i++) { + log.info("Processing message " + i); + Message message = inbox.getMessage(i); + processMessage(session, message); + } + } catch (Throwable t) { + log.log(Level.WARNING, "Unexpected error", t); + } finally { + closeResources(store, inbox); + } + } - Message reply = new MimeMessage(session); - Address sender = message.getFrom()[0]; - reply.setRecipient(Message.RecipientType.TO, sender); - reply.setFrom(fromAddress); - if (result == null) { - reply.setSubject("Decode failed"); - reply.setContent("Sorry, we could not decode that image.", "text/plain"); - } else { - String text = result.getText(); - reply.setSubject("Decode succeeded"); - reply.setContent(text, "text/plain"); - } - log.info("Sending reply"); - Transport.send(reply); - } - } - } - message.setFlag(Flags.Flag.DELETED, true); - } - } finally { + private void processMessage(Session session, Message message) throws MessagingException, IOException { + Object content = message.getContent(); + if (content instanceof MimeMultipart) { + MimeMultipart mimeContent = (MimeMultipart) content; + int numParts = mimeContent.getCount(); + for (int j = 0; j < numParts; j++) { + MimeBodyPart part = (MimeBodyPart) mimeContent.getBodyPart(j); + processMessagePart(session, message, part); + } + } + message.setFlag(Flags.Flag.DELETED, true); + } + + private void processMessagePart(Session session, Message message, MimeBodyPart part) + throws MessagingException, IOException { + String contentType = part.getContentType(); + if (contentType.startsWith("image/")) { + BufferedImage image = ImageIO.read(part.getInputStream()); + if (image != null) { + Reader reader = new MultiFormatReader(); + Result result = null; try { - if (inbox != null) { - inbox.close(true); - } - if (store != null) { - store.close(); - } - } catch (MessagingException me) { - // continue + result = reader.decode(new BufferedImageMonochromeBitmapSource(image), DecodeServlet.HINTS); + } catch (ReaderException re) { + log.info("Decoding FAILED"); + } + + Message reply = new MimeMessage(session); + Address sender = message.getFrom()[0]; + reply.setRecipient(Message.RecipientType.TO, sender); + reply.setFrom(fromAddress); + if (result == null) { + reply.setSubject("Decode failed"); + reply.setContent("Sorry, we could not decode that image.", "text/plain"); + } else { + String text = result.getText(); + reply.setSubject("Decode succeeded"); + reply.setContent(text, "text/plain"); } + log.info("Sending reply"); + Transport.send(reply); } - } catch (Throwable t) { - log.log(Level.WARNING, "Unexpected error", t); + } + } + + private void closeResources(Store store, Folder inbox) { + try { + if (inbox != null) { + inbox.close(true); + } + if (store != null) { + store.close(); + } + } catch (MessagingException me) { + // continue } }