2.3.4. fejezet, Levelezés JavaMail-el

Szerverünk teljessége kommunikációképességében mérhető. Minél több kapcsolatot tud kiépíteni más rendszerekkel, annál értékesebb, annál érdekesebb.

Ha proxy tunel-t használunk, előbb nyissunk egy portot a helyi gépen, például így:

proxytunnel -q -p proxy_host:proxy_port -d smtp.gmail.com:465 -a local_port

Aztán használjuk ez a levelező beállításánál:

props.put("mail.smtp.host", "localhost");
props.put("mail.smtp.port", "local_port");

A levelező modul kiépítéséhez szükségünk lesz a Sun JavaMail csomagjára, ami letölthető a projekt honlapjáról.

Üzenet küldését a következő kóddal szemléltetem:

public boolean execute(Request request) {
	boolean result = true;
	String to = request.getParamAsDecodedString("to", false);
        String from = request.getParamAsDecodedString("from", false);
        String host = request.getParamAsDecodedString("host", false);
        String mailSubj = request.getParamAsDecodedString("subject", false);
        String mailMsg = request.getParamAsDecodedString("message", false);
 
        Properties props = new Properties();
        props.put("mail.transport.protocol", "smtp");
 
        props.setProperty("mail.host", mailSenderProps.getHost());
        props.setProperty("mail.user", mailSenderProps.getUser());
        props.setProperty("mail.password", mailSenderProps.getPasswd());
        props.setProperty("mail.auth", "true");
 
        props.put("mail.smtp.host", mailSenderProps.getHost());
        props.put("mail.smtp.user", mailSenderProps.getUser());
        props.put("mail.smtp.password", mailSenderProps.getPasswd());
        props.put("mail.smtp.auth", "true");
 
        props.put("mail.debug", "true");
 
        Session session = Session.getDefaultInstance(props, new javax.mail.Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(mailSenderProps.getUser(), mailSenderProps.getPasswd());
            }
        });
 
        try {
            // Instantiatee a message
            Message msg = new MimeMessage(session);
 
            //Set message attributes
            msg.setFrom(new InternetAddress(from));
 
            String[] addresses = to.split(";");
 
            for (int addressIterator = 0; addressIterator < addresses.length; addressIterator++) {
                msg.addRecipient(Message.RecipientType.TO, new InternetAddress(addresses[addressIterator]));
            }
 
            msg.setRecipients(Message.RecipientType.TO, address);
            msg.setSubject(mailSubj);
            msg.setSentDate(new Date());
 
            // Set message content
            msg.setText(mailMsg);
 
            //Send the message
            Transport.send(msg);
        }
        catch (MessagingException mex) {
            // Prints all nested (chained) exceptions as well
        	result = false;
            mex.printStackTrace();
        }
        request.addParam("ready", result);
	return result;
}

Üzenet fogadása összetettebb. Könyvtárak választhatók, csatolmányokat kell kezelni, tértivényt kell generálni. Egy egyszerű mintát hadd mutassak azért pop3, pop3s, imap és imaps protokollokra:

package com.omega.engine.actions;
 
import java.util.Properties;
 
import com.omega.configuration.ActionDescriptor;
import com.omega.engine.ILogWriter;
import com.omega.engine.Request;
import com.omega.engine.UnifiedRecordType;
import com.omega.engine.containers.MemoryContainer;
 
import javax.mail.*;
import javax.mail.search.*;
 
/**
 * <!-- begin-user-doc --> Levél lista letöltés kiszolgálóról. (implementation
 * learned from http://www.vipan.com/htdocs/javamail.html) 
 * Állíts be trust store-t a tomcat-nek 
 * és importáld a kliens certificate fájlokat a trust store-ba <!-- end-user-doc -->
 * 
 * @author Papp Zoltán
 * 
 * @generated "UML to Java V5.0
 *            (com.ibm.xtools.transform.uml2.java5.internal.UML2JavaTransform)"
 */
public class FetchMailListAction extends Action {
 
	final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
 
	public FetchMailListAction(ActionDescriptor actionDescriptor, ILogWriter owner) {
		super(actionDescriptor, owner);
		// TODO Auto-generated constructor stub
	}
 
	public void addRecord(Message m) throws MessagingException {
		Object[] fields = new Object[4];
		Address[] from = m.getFrom();
		fields[0] = m.getMessageNumber();
		fields[1] = m.getReceivedDate();
		String strFrom = "";
		for (int i = 0; i < from.length; i++)
			strFrom += from[i].toString() + ";";
		fields[2] = strFrom;
		fields[3] = m.getSubject();
		UnifiedRecordType record = new UnifiedRecordType(fields, ((MemoryContainer) getOwner()).getRecordDescriptor());
		((MemoryContainer) getOwner()).appendRecord(record, true);
	}
 
	@Override
	public boolean execute(Request request) {
		boolean result = true;
		String user = request.getParamAsDecodedString("user", false);
		String passwd = request.getParamAsDecodedString("password", false);
		String host = request.getParamAsDecodedString("host", false);
		String proto = request.getParamAsDecodedString("protocol", false);
		if ((user != null) && (passwd != null) && (host != null)) {
			String subjSearch = request.getParamAsDecodedString("search", false);
			result = (user != null) && (passwd != null) && (host != null);
			if (result)
				try {
					Properties props = new Properties();
					if (proto != null) {
						props.setProperty("mail.store.protocol", proto);
						if (proto.equalsIgnoreCase("imaps")) {
							props.setProperty("mail.imap.socketFactory.class", SSL_FACTORY);
							props.setProperty("mail.imap.socketFactory.fallback", "false");
							props.setProperty("mail.imap.port", "993");
							props.setProperty("mail.imap.socketFactory.port", "993");
						} else if (proto.equalsIgnoreCase("pop3s")) {
							props.setProperty("mail.pop3.socketFactory.class", SSL_FACTORY);
							props.setProperty("mail.pop3.socketFactory.fallback", "false");
							props.setProperty("mail.pop3.port", "995");
							props.setProperty("mail.pop3.socketFactory.port", "995");
						}
						Session session = Session.getInstance(props);
						Store store = session.getStore(proto);
						store.connect(host, user, passwd);
						Folder fldr = store.getFolder("INBOX");
						fldr.open(Folder.READ_WRITE);
						if ((subjSearch != null) && !subjSearch.isEmpty()) {
							SubjectTerm st = new SubjectTerm(subjSearch);
							Message[] found = fldr.search(st);
							for (int i = 1; i < found.length; i++) {
								Message m = found[i];
								addRecord(m);
							}
						} else {
							int count = fldr.getMessageCount();
							for (int i = 1; i <= count; i++) {
								Message m = fldr.getMessage(i);
								addRecord(m);
							}
						}
					}
				} catch (MessagingException mex) {
					mex.printStackTrace();
				}
		}
		return result;
	}
 
}