2 * Copyright 2008 Google Inc.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 package com.google.zxing.web;
19 import com.google.zxing.MultiFormatReader;
20 import com.google.zxing.Reader;
21 import com.google.zxing.ReaderException;
22 import com.google.zxing.Result;
23 import com.google.zxing.client.j2se.BufferedImageMonochromeBitmapSource;
25 import javax.imageio.ImageIO;
26 import javax.mail.Address;
27 import javax.mail.Authenticator;
28 import javax.mail.Flags;
29 import javax.mail.Folder;
30 import javax.mail.Message;
31 import javax.mail.MessagingException;
32 import javax.mail.Session;
33 import javax.mail.Store;
34 import javax.mail.Transport;
35 import javax.mail.internet.InternetAddress;
36 import javax.mail.internet.MimeBodyPart;
37 import javax.mail.internet.MimeMessage;
38 import javax.mail.internet.MimeMultipart;
39 import java.awt.image.BufferedImage;
40 import java.io.UnsupportedEncodingException;
41 import java.util.Properties;
42 import java.util.TimerTask;
43 import java.util.logging.Level;
44 import java.util.logging.Logger;
49 final class DecodeEmailTask extends TimerTask {
51 private static final Logger log = Logger.getLogger(DecodeEmailTask.class.getName());
53 private static final String SMTP_HOST = "smtp.gmail.com";
54 private static final String POP_HOST = "pop.gmail.com";
55 private static final String SMTP_PORT = "465";
56 private static final String POP_PORT = "995";
57 private static final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
58 private static final Address fromAddress;
59 private static final Properties sessionProperties = new Properties();
62 fromAddress = new InternetAddress("w@zxing.org", "ZXing By Email");
63 } catch (UnsupportedEncodingException uee) {
64 throw new RuntimeException(uee);
66 sessionProperties.setProperty("mail.transport.protocol", "smtp");
67 sessionProperties.setProperty("mail.smtp.host", SMTP_HOST);
68 sessionProperties.setProperty("mail.smtp.auth", "true");
69 sessionProperties.setProperty("mail.smtp.port", SMTP_PORT);
70 sessionProperties.setProperty("mail.smtp.socketFactory.port", SMTP_PORT);
71 sessionProperties.setProperty("mail.smtp.socketFactory.class", SSL_FACTORY);
72 sessionProperties.setProperty("mail.smtp.socketFactory.fallback", "false");
73 sessionProperties.setProperty("mail.smtp.quitwait", "false");
74 sessionProperties.setProperty("mail.pop3.host", POP_HOST);
75 sessionProperties.setProperty("mail.pop3.auth", "true");
76 sessionProperties.setProperty("mail.pop3.port", POP_PORT);
77 sessionProperties.setProperty("mail.pop3.socketFactory.port", POP_PORT);
78 sessionProperties.setProperty("mail.pop3.socketFactory.class", SSL_FACTORY);
79 sessionProperties.setProperty("mail.pop3.socketFactory.fallback", "false");
82 private final Authenticator emailAuthenticator;
84 DecodeEmailTask(Authenticator emailAuthenticator) {
85 this.emailAuthenticator = emailAuthenticator;
90 log.info("Checking email...");
92 Session session = Session.getInstance(sessionProperties, emailAuthenticator);
96 store = session.getStore("pop3");
98 inbox = store.getFolder("INBOX");
99 inbox.open(Folder.READ_WRITE);
100 int count = inbox.getMessageCount();
102 log.info("Found " + count + " messages");
104 for (int i = 1; i <= count; i++) {
105 log.info("Processing message " + i);
106 Message message = inbox.getMessage(i);
107 Object content = message.getContent();
108 if (content instanceof MimeMultipart) {
109 MimeMultipart mimeContent = (MimeMultipart) content;
110 int numParts = mimeContent.getCount();
111 for (int j = 0; j < numParts; j++) {
112 MimeBodyPart part = (MimeBodyPart) mimeContent.getBodyPart(j);
113 String contentType = part.getContentType();
114 if (!contentType.startsWith("image/")) {
117 BufferedImage image = ImageIO.read(part.getInputStream());
119 Reader reader = new MultiFormatReader();
120 Result result = null;
122 result = reader.decode(new BufferedImageMonochromeBitmapSource(image), DecodeServlet.HINTS);
123 } catch (ReaderException re) {
124 log.info("Decoding FAILED");
127 Message reply = new MimeMessage(session);
128 Address sender = message.getFrom()[0];
129 reply.setRecipient(Message.RecipientType.TO, sender);
130 reply.setFrom(fromAddress);
131 if (result == null) {
132 reply.setSubject("Decode failed");
133 reply.setContent("Sorry, we could not decode that image.", "text/plain");
135 String text = result.getText();
136 reply.setSubject("Decode succeeded");
137 reply.setContent(text, "text/plain");
139 log.info("Sending reply");
140 Transport.send(reply);
144 message.setFlag(Flags.Flag.DELETED, true);
154 } catch (MessagingException me) {
158 } catch (Throwable t) {
159 log.log(Level.WARNING, "Unexpected error", t);
163 public static void main(String[] args) {
164 Authenticator emailAuthenticator = new EmailAuthenticator(args[0], args[1]);
165 new DecodeEmailTask(emailAuthenticator).run();