2.3.4. fejezet, Levelezés JavaMail-el
Beküldte pzoli - 2011, május 16 - 3:37du
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; } }
- A hozzászóláshoz be kell jelentkezni