// (c) Julian Bunn, 2003
import java.io.*;
import java.io.FileWriter;
import java.io.PrintWriter;
import cdo.*;

public class ArchiveMail
{
	
	cdo.Session			session;
	com.ms.com.Variant	nullParameter,profileName,var,item;
	cdo.Folder			folder;	
	int					nMessagesProcessed,nFiles;

	/**@attribute System.STAThreadAttribute()*/

	public static void main (String[] args)
	{
		ArchiveMail arr = new ArchiveMail();
	}
	
	public ArchiveMail() {
		System.out.println("Archive");
		
		session = new cdo.Session();
		nullParameter = new com.ms.com.Variant();
		nullParameter.noParam();
		
		profileName = new com.ms.com.Variant();
		profileName.putString("Microsoft Outlook Internet Settings");
		
		PrintWriter outFile = null;
		PrintStream outStream = null;
		String outFileName = "";
		String parentDirectory = null;
		String currentDirectory = null;
		String folderDirectory = null;
		
		nMessagesProcessed = nFiles = 0;
		
		
		try {
			File dir = new File("c:\\temp");
			//parentDirectory = dir.getCanonicalPath();


			parentDirectory = "c:\\temp";
			System.out.println("Running in: "+parentDirectory);
			
			//session.Logon(profileName, 
			session.Logon(new com.ms.com.Variant(""),
					  nullParameter,
					  nullParameter,
					  nullParameter,
					  nullParameter,
					  nullParameter,
					  nullParameter);

			
			
			cdo.InfoStores stores = (cdo.InfoStores) session.getInfoStores().getDispatch();
			
			int nStores = stores.getCount().getInt();
			System.out.println("Stores="+nStores);
			
			for(int i=1;i<=nStores;i++) {
				var = new com.ms.com.Variant();
				var.putInt(i);
							
				cdo.InfoStore store = (cdo.InfoStore) stores.getItem(var).getDispatch();
				
				String name = (String) store.getName().toString();
				
				currentDirectory = name;
				
				folder = (cdo.Folder) store.getRootFolder().getDispatch();
				
				System.out.println(i+" "+folder.getName());
				
				cdo.Folders folders = (cdo.Folders) folder.getFolders().getDispatch();
				
				int nFolders = folders.getCount().getInt();
				
				System.out.println("   "+nFolders+" folders");
				
				for(int j=1;j<=nFolders;j++) {
									
					var.putInt(j);
					cdo.Folder thisFolder = (cdo.Folder) folders.getItem(var).getDispatch();
					
					System.out.print("\n      "+thisFolder.getName());
					
					folderDirectory = thisFolder.getName().toString().trim();

					try 
					{
						File Fdir = new File(parentDirectory+"/"+folderDirectory);
						if(!Fdir.exists()) Fdir.mkdir();
						if(!Fdir.exists()) throw new Exception("Aaargh!");
					} 
					catch (Exception e) 
					{
						System.err.println("Whoops, error creating: "+e);
						System.exit(0);
					}

					
					cdo.Messages messages = (cdo.Messages) thisFolder.getMessages().getDispatch();
					
					int nMessages = messages.getCount().getInt();
					
					System.out.println(" "+nMessages+" messages");

					String sender = "unknown";
					String senderaddress = "unknown";
					String fields1 = "unknown";
					String subject = "unknown";
					String sent = "unknown";
					String timeReceived = "no time";
					String dateReceived = "no date";
					String text = "";
					String size = "0b";
					String recipientlist = "";
					
					nMessagesProcessed = 0;
					
					for(int k=1;k<=nMessages;k++) {
						var.putInt(k);
						cdo.Message thisMessage = null;
						cdo.AddressEntry address = null;
						try 
						{
							thisMessage = (cdo.Message) messages.getItem(var).getDispatch();
						}
						catch (Exception e) 
						{
							System.err.println("Cannot find message "+k);
							continue;
						}
					
						//String type = (String) thisMessage.getType().getString();
						//if(!type.equals("IPM.Note")) continue;
																
						if(!thisMessage.getType().getString().equals("IPM.Note")) {
							com.ms.com.ComLib.release(thisMessage);
							System.gc();
							continue;
						}				
					
						try 
						{
							sender = thisMessage.getSender().toString();
						} 
						catch (Exception e) {;}						
						try 
						{
							fields1 = thisMessage.getFields().toString();
						} 
						catch (Exception e) {;}						
						try 
						{
							subject = thisMessage.getSubject().toString();
							if(subject.length() > 50) subject = subject.substring(0,50);
						} 
						catch (Exception e) {;}
						try 
						{
							sent = thisMessage.getSent().toString();
						} 
						catch (Exception e) {;}
						try 
						{
							timeReceived = thisMessage.getTimeReceived().toString();
							timeReceived = timeReceived.replace('/','-');
							timeReceived = timeReceived.replace(':','-');
							dateReceived = timeReceived.substring(0,timeReceived.indexOf(" "));
						} 
						catch (Exception e) {;}
						try 
						{
							size = thisMessage.getSize().toString();
						} 
						catch (Exception e) {;}
						try 
						{
							text = thisMessage.getText().toString();
						} 
						catch (Exception e) {;}
						try 
						{
							address = (cdo.AddressEntry) thisMessage.getSender().getDispatch();
							senderaddress = address.getAddress().toString();
							sender = address.getName().toString();
						}
						catch (Exception e) 
						{
							//System.err.println("Cannot find message address "+k);
							//System.err.println("Using senderaddress: "+senderaddress+" sender: "+sender);
						}


						nMessagesProcessed++;
						System.out.print(nMessagesProcessed+"-->"+size+" ");

						
						try 
						{
							cdo.Recipients recipients = (cdo.Recipients) thisMessage.getRecipients().getDispatch();
							int nRecipients = recipients.getCount().toInt();
						
						
							for(int m=1;m<=nRecipients;m++) 
							{
								var.putInt(m);
								cdo.Recipient recipient = (cdo.Recipient) recipients.getItem(var).getDispatch();
								//System.out.println("                   R"+m+" "+recipient.getAddress());
								//address = (cdo.AddressEntry) recipient.getAddress().getDispatch();
								//String rname = (String) address.toString();
								String rname = recipient.getAddress().toString();
								if(rname.startsWith("SMTP:")) rname = rname.substring(5);
								if(m>1) 
								{
									recipientlist += ";"+rname;
								} 
								else 
								{
									recipientlist = rname;
								}				
							}
						} 
						catch (Exception e) 
						{
							System.err.println("Cannot find recipient list");
							recipientlist = "Unknown";
						}
						
						try {
							outFileName = sender+"_"+dateReceived+"_"+nMessagesProcessed+"_"+subject;
							// ensure JOLIET compliance
							outFileName = outFileName.replace('/','-');
							outFileName = outFileName.replace('\\','-');
							outFileName = outFileName.replace(':','-');
							outFileName = outFileName.replace(';','-');
							outFileName = outFileName.replace('?','-');
							outFileName = outFileName.replace('>','-');
							outFileName = outFileName.replace('<','-');
							outFileName = outFileName.replace('*','-');
							outFileName = outFileName.replace('"',' ');
							outFileName = outFileName.replace('`',' ');
							outFileName = outFileName.replace('|','-');

							//outFileName = folderDirectory+"_"+outFileName;
							if(outFileName.length() > 58) outFileName = outFileName.substring(0,58);
							outFileName = outFileName+".txt";
							
							outFileName = parentDirectory+"/"+folderDirectory+"/"+outFileName;

							File thisFile = new File(outFileName);
							if(thisFile.exists()) 
							{
								System.err.println("File already exists: "+outFileName);
								continue;
							}

							System.out.println(" "+outFileName);
						
							outFile = new PrintWriter(new FileWriter(outFileName));
							outFile.println("Sender:  "+sender+" <"+senderaddress+">");
							outFile.println("To:      "+recipientlist);
							outFile.println("Subject: "+subject);
							outFile.println("Received:"+timeReceived);
							outFile.println("Size:    "+size);
							outFile.println(" ");
							outFile.println(text);
							outFile.close();

							nFiles++;
							
						} catch (Exception e) {
							System.err.println("\nError! "+e);
						}
						
						if(thisMessage != null) com.ms.com.ComLib.release(thisMessage);
						if(address != null) com.ms.com.ComLib.release(address);
						System.gc();
					}
					
				}
				
			}
			
			System.out.println("\nFinished "+nMessagesProcessed+" messages, wrote "+nFiles+" files");
							  
			
			
			
		
			session.Logoff();
		
		
		
		} catch (Exception e) {
			System.err.println("Exception: "+e);
		}
		try {
			//Thread.sleep(20000);
		} catch (Exception e) {;}
	}
}
