package com.oreilly.jent.javamail;

/**
 * In general, you may use the code in this book in your programs and 
 * documentation. You do not need to contact us for permission unless 
 * you're reproducing a significant portion of the code. For example, 
 * writing a program that uses several chunks of code from this book does 
 * not require permission. Selling or distributing a CD-ROM of examples 
 * from O'Reilly books does require permission. Answering a question by 
 * citing this book and quoting example code does not require permission. 
 * Incorporating a significant amount of example code from this book into 
 * your product's documentation does require permission.
 * 
 * We appreciate, but do not require, attribution. An attribution usually 
 * includes the title, author, publisher, and ISBN. For example: 
 * 
 *   "Java Enterprise in a Nutshell, Third Edition, 
 *    by Jim Farley and William Crawford 
 *    with Prakash Malani, John G. Norman, and Justin Gehtland. 
 *    Copyright 2006 O'Reilly Media, Inc., 0-596-10142-2."
 *  
 *  If you feel your use of code examples falls outside fair use or the 
 *  permission given above, feel free to contact us at 
 *  permissions@oreilly.com.
 */

import java.util.Properties;

import javax.mail.Flags;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.search.OrTerm;
import javax.mail.search.SearchTerm;
import javax.mail.search.SubjectTerm;

public class SpamCleaner { 
  static String mailhost = "imap.mycompany.com"; 
  static String smtphost = "mail.mycompany.com"; 
  static String redirectEmail = "spamlog@mycompany.com"; 
  static String[] badSubjects = {"XXX", "MAKEMONEYFAST", "!!!!"}; 
  
  public static void main(String[] args) { 
    Properties props = new Properties(  ); 
    props.setProperty("mail.smtp.host", smtphost); 
    Session session = Session.getDefaultInstance(props, null); 
    
    try { 
      Store imapStore = session.getStore("imap"); 
      imapStore.connect(mailhost, "scott", "yu7xx"); 
      
      Folder defaultFolder = imapStore.getDefaultFolder(  ); 
      Folder inboxFolder = defaultFolder.getFolder("INBOX"); 
      inboxFolder.open(Folder.READ_WRITE); 
      
      // Assemble some search criteria, using nested OrTerm objects 
      SearchTerm spamCriteria = null; 
      for (int i=0; i<badSubjects.length; i++) { 
        SubjectTerm st = new SubjectTerm(badSubjects[i]); 
        if(spamCriteria == null) 
          spamCriteria = st; 
        else 
          spamCriteria = new OrTerm(spamCriteria, st); 
      } 
      
      Message[] msgs = inboxFolder.search(spamCriteria); 
      if (msgs != null) 
        for (int i = 0; i < msgs.length; i++) { 
          // Redirect the message 
          Message m = new MimeMessage((MimeMessage)msgs[i]); 
          m.setRecipient(Message.RecipientType.TO, 
                         new InternetAddress(redirectEmail)); 
          // Clear out the cc: field so we don't loop or anything 
          m.setHeader("CC", ""); 
          Transport.send(m); 
          
          // Now delete the original 
          System.out.println("Deleting Message " +
                             msgs[i].getMessageNumber(  ) + ":" 
                             + msgs[i].getSubject(  )); 
          msgs[i].setFlag(Flags.Flag.DELETED, true); 
        } 
      
      // Close inbox folder, with "Expunge" flag set to true 
      inboxFolder.close(true); 
      imapStore.close(  ); 
    } 
    catch (MessagingException me) { 
      me.printStackTrace(System.out); 
    } 
  } // End main(  ) 
} 
