/* * Copyright 2011 Future Systems * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.krakenapps.mail.impl; import java.io.IOException; import java.util.Arrays; import javax.mail.BodyPart; import javax.mail.Flags; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.internet.MimeMultipart; import org.krakenapps.api.Script; import org.krakenapps.api.ScriptArgument; import org.krakenapps.api.ScriptContext; import org.krakenapps.api.ScriptUsage; import org.krakenapps.mail.Postbox; import org.krakenapps.mail.PostboxConfig; import org.krakenapps.mail.PostboxRegistry; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class PostboxScript implements Script { private final Logger logger = LoggerFactory.getLogger(PostboxScript.class); private ScriptContext context; private PostboxRegistry postbox; private static Postbox pb; public PostboxScript(PostboxRegistry postbox) { this.postbox = postbox; } @Override public void setScriptContext(ScriptContext context) { this.context = context; } public void list(String[] args) { context.println("Configurations"); context.println("------------------"); for (PostboxConfig config : postbox.getConfigs()) context.printf("name=%s, host=%s, port=%s, user=%s\n", config.getName(), config.getHost(), config.getPort(), config.getUser()); } public void register(String[] args) { try { PostboxConfig config = new PostboxConfig(); context.print("Name? "); config.setName(context.readLine()); context.print("IMAP Server? "); config.setHost(context.readLine()); context.print("IMAP Port? "); config.setPort(Integer.parseInt(context.readLine())); if (config.getPort() < 1 || config.getPort() > 65535) throw new NumberFormatException(); context.print("IMAP User? "); config.setUser(context.readLine()); context.print("IMAP Password? "); config.setPassword(context.readPassword()); postbox.register(config); context.println("new configuration added"); } catch (InterruptedException e) { context.println(""); context.println("interrupted"); } catch (NumberFormatException e) { context.println("invalid port number format"); } catch (Exception e) { logger.error("kraken-mail: configuration failed", e); } } @ScriptUsage(description = "unregister config", arguments = { @ScriptArgument(name = "name", type = "string", description = "postbox config name") }) public void unregister(String[] args) { try { postbox.unregister(args[0]); context.println("imap configuration removed"); } catch (Exception e) { context.println(e.getMessage()); logger.error("kraken-mail: cannot remove imap configuration", e); } } @ScriptUsage(description = "open imap connection", arguments = { @ScriptArgument(name = "name", type = "string", description = "imap configuration name") }) public void connect(String[] args) { if (pb != null && pb.isConnected()) { context.println("already connected."); return; } PostboxConfig config = postbox.getConfig(args[0]); pb = postbox.connect(config); if (pb == null) context.println("connect failed."); else context.println("connected"); } @ScriptUsage(description = "listing messages", arguments = { @ScriptArgument(name = "folder", type = "string", description = "folder name"), @ScriptArgument(name = "page", type = "integer", description = "page number") }) public void messages(String[] args) { if (pb == null || !pb.isConnected()) { context.println("not connected."); return; } try { pb.openFolder(args[0]); int page = Integer.parseInt(args[1]); for (Message msg : pb.getMessages((page - 1) * 10, page * 10)) { boolean isUnread = !msg.getFlags().contains(Flags.Flag.SEEN); context.println(String.format("%s[%d] %s", isUnread ? "*" : " ", msg.getMessageNumber(), msg.getSubject())); } } catch (MessagingException e) { context.println(e.getMessage()); } } @ScriptUsage(description = "listing messages", arguments = { @ScriptArgument(name = "folder", type = "string", description = "folder name"), @ScriptArgument(name = "mail", type = "integer", description = "mail number") }) public void message(String[] args) { if (pb == null || !pb.isConnected()) { context.println("not connected."); return; } try { pb.openFolder(args[0]); Message msg = pb.getMessage(Integer.parseInt(args[1])); context.println("from: " + Arrays.toString(msg.getFrom())); context.println("reply to: " + Arrays.toString(msg.getReplyTo())); context.println("received: " + msg.getReceivedDate()); context.println("subject: " + msg.getSubject()); context.println(""); try { if (msg.getContent() instanceof MimeMultipart) { MimeMultipart content = (MimeMultipart) msg.getContent(); BodyPart part = content.getBodyPart(0); context.println(toSimpleString(part.getContent().toString())); } else context.println(toSimpleString(msg.getContent().toString())); } catch (IOException e) { context.println(e.getMessage()); } } catch (MessagingException e) { context.println(e.getMessage()); } } private String toSimpleString(String str) { return str.replaceAll(" ", " ").replaceAll("<", "<").replaceAll(">", ">").replaceAll("<[^>]*>", "") .replaceAll("(\t|\\t| )+", " "); } public void disconnect(String[] args) { if (pb == null || !pb.isConnected()) { context.println("already disconnected."); return; } try { pb.disconnect(); context.println("disconnected"); } catch (MessagingException e) { context.println("disconnect failed: " + e.getMessage()); logger.error("kraken-mail: cannot close imap", e); } } }