作者:mingjava 文章来源:http://www.j2medev.com/Article/ShowArticle.asp?ArticleID=141
在GCF中并没有提供给我们能够发送电子邮件的API,J2ME的可选包也没有提供相关的功能。那么我们能用J2ME实现发送电子邮件功能嘛?答案是肯定的。本文将主要讲述如何在J2ME中实现发送电子邮件的功能。
这里一个非常重要的思想就是代理。我们知道GCF提供给我们进行联网的能力了,比如通过Http联网。在MIDP2.0中甚至提供了socket联网的API。那么我们可以通过他们连接服务器端的程序比如servlet,然后servlet可以通过JavaMail提供的接口发送邮件。那么我们需要做的只是通过Http协议或者其他协议把邮件的标题、内容、收件人等发送给servlet。就是这个简单的思想却是非常灵活非常有用。
首先我们构造一个Message类来代表发送的消息。它包括主题、收件人和内容三个字段。
package com.j2medev.mail;
public class Message {
private String to;
private String subject;
private String content;
public Message() {
}
public Message(String to, String subject, String content) { this.to = to; this.subject = subject; this.content = content; }
public String getContent() { return content; }
public void setContent(String content) { this.content = content; } public String getSubject() { return subject; }
public void setSubject(String subject) { this.subject = subject; }
public String getTo() { return to; } public void setTo(String to) { this.to = to; } public String toString() { return to+subject+content; } }
在用户界面的设计上,我们需要两个界面。一个让用户输入收件人和主题,另一个用于收集用户输入的内容。由于TextBox要独占一个屏幕的,因此我们不能把他们放在一起。
/* * Created on 2004-12-8 * * TODO To change the template for this generated file go to * Window - Preferences - Java - Code Style - Code Templates */ package com.j2medev.mail;
import javax.microedition.lcdui.Form; import javax.microedition.lcdui.Item; import javax.microedition.lcdui.*; import javax.microedition.midlet.MIDlet;
/** * @author P2800 * * TODO To change the template for this generated type comment go to Window - * Preferences - Java - Code Style - Code Templates */ public class MainForm extends Form implements CommandListener {
private MailClient midlet;
private TextField toField;
private TextField subField; private boolean first = true;
public static final Command nextCommand = new Command("NEXT", Command.OK, 1);
public MainForm(MailClient midlet, String arg0) { super(arg0); this.midlet = midlet; if(first) { first = false; init(); } }
public void init() { toField = new TextField("To:", null, 25, TextField.ANY); subField = new TextField("Subject:", null, 30, TextField.ANY); this.append(toField); this.append(subField); this.addCommand(nextCommand); this.setCommandListener(this); } public void commandAction(Command cmd,Displayable disp) { if(cmd == nextCommand) { String to = toField.getString(); String subject = subField.getString(); if(to == "" && subject == "") { midlet.displayAlert("Null to or sub",AlertType.WARNING,this); } else { midlet.getMessage().setTo(to); midlet.getMessage().setSubject(subject); midlet.getDisplay().setCurrent(midlet.getContentForm()); } } }
}
package com.j2medev.mail;
import javax.microedition.lcdui.Command; import javax.microedition.lcdui.CommandListener; import javax.microedition.lcdui.Displayable; import javax.microedition.lcdui.TextBox; import javax.microedition.midlet.MIDlet;
public class ContentForm extends TextBox implements CommandListener { private MailClient midlet;
private boolean first = true;
public static final Command sendCommand = new Command("SEND", Command.ITEM, 1);
public ContentForm(String arg0, String arg1, int arg2, int arg3, MailClient midlet) { super(arg0, arg1, arg2, arg3); this.midlet = midlet; if (first) { first = false; init(); }
}
public void init() { this.addCommand(sendCommand); this.setCommandListener(this); }
public void commandAction(Command cmd, Displayable disp) { if (cmd == sendCommand) { String content = this.getString(); midlet.getMessage().setContent(content); System.out.println(midlet.getMessage()); try { synchronized (midlet) { midlet.notify(); }
} catch (Exception e) { }
} } }
最后我们完成MIDlet,在其中包括联网的程序代码,由于本站已经提供了很多关于J2ME联网的介绍,因此这里不再进行更多的解释。
package com.j2medev.mail;
import java.io.DataOutputStream; import java.io.IOException;
import javax.microedition.midlet.MIDlet; import javax.microedition.midlet.MIDletStateChangeException; import javax.microedition.lcdui.*; import javax.microedition.io.*;
public class MailClient extends MIDlet { private MainForm mainForm;
private ContentForm contentForm;
private Display display;
private Message message;
public Message getMessage() { return message; }
public void setMessage(Message message) { this.message = message; }
public void displayAlert(String text, AlertType type, Displayable disp) { Alert alert = new Alert("Application Error"); alert.setString(text); alert.setType(type); alert.setTimeout(2000); display.setCurrent(alert, disp);
}
public ContentForm getContentForm() { return contentForm; }
public Display getDisplay() { return display; }
public MainForm getMainForm() { return mainForm; }
public void initMIDlet() { MailThread t = new MailThread(this); t.start(); message = new Message(); display = Display.getDisplay(this); mainForm = new MainForm(this, "Simple Mail Client"); contentForm = new ContentForm("Content", null, 150, TextField.ANY, this); display.setCurrent(mainForm); }
protected void startApp() throws MIDletStateChangeException { initMIDlet();
}
protected void pauseApp() {
}
protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
}
}
class MailThread extends Thread { private MailClient midlet;
public MailThread(MailClient midlet) { this.midlet = midlet; }
public void run() { synchronized(midlet) { try { midlet.wait(); } catch(Exception e) { e.printStackTrace(); } } System.out.println("connecting to server....."); HttpConnection httpConn = null; DataOutputStream dos = null; try { httpConn = (HttpConnection)Connector.open("http://localhost:8088/mail/maildo"); httpConn.setRequestMethod("POST"); dos = new DataOutputStream(httpConn.openOutputStream()); dos.writeUTF(midlet.getMessage().getTo()); dos.writeUTF(midlet.getMessage().getSubject()); dos.writeUTF(midlet.getMessage().getContent()); dos.close(); httpConn.close(); System.out.println("end of sending mail"); } catch(IOException e) {} }}
在服务器端,我们要完成自己的servlet。他的任务比较简单就是接受客户端的数据然后通过JavaMail发送到指定的收件人那里。如果您对JavaMail还不熟悉请参考如下文章。这里直接给出servlet代码。 使用JavaMail实现收发电子邮件功能 使用Servlet发送电子邮件
package com.j2medev.servletmail;
import java.io.DataInputStream; import java.io.IOException; import java.util.Properties;
import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.mail.*; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import java.util.*; import java.net.*;
public class MailServlet extends HttpServlet { private static String host;
private static String from;
public void init(ServletConfig config) throws ServletException { super.init(config); host = config.getInitParameter("host"); from = config.getInitParameter("from"); System.out.println(host + from); }
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response); }
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { DataInputStream dis = new DataInputStream(request.getInputStream()); String send = dis.readUTF(); String subject = dis.readUTF(); String content = dis.readUTF(); try { Properties props = System.getProperties(); // Setup mail server props.put("mail.smtp.host", host); // Get session Session session = Session.getDefaultInstance(props, null); // Define message MimeMessage message = new MimeMessage(session); // Set the from address message.setFrom(new InternetAddress(from)); // Set the to address message.addRecipient(Message.RecipientType.TO, new InternetAddress( send)); // Set the subject message.setSubject(subject); // Set the content message.setText(content); // Send message Transport.send(message); } catch (Exception e) { e.printStackTrace(); } } }
web.xml <?xml version="1.0" ?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app> <servlet> <servlet-name>ServletMail</servlet-name> <servlet-class>com.j2medev.servletmail.MailServlet</servlet-class> <init-param> <param-name>host</param-name> <param-value>smtp.263.net</param-value> </init-param> <init-param> <param-name>from</param-name> <param-value>eric.zhan@263.net</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>ServletMail</servlet-name> <url-pattern>/maildo</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list>
<error-page> <error-code>404</error-code> <location>/error.jsp</location> </error-page>
</web-app>
总结:本文更多要介绍的其实还是这个代理的思想,利用所学的知识灵活应用。不要局限于J2ME提供给你的API。文章中实现的客户端服务器都比较简单,也不够友好,如果感兴趣可以稍微修饰一下,对提高能力还是有帮助的。在MIDP中只是提供了RMS作为持久存储用,因此实现接受存储邮件不是很方便。如果手机支持FileConnection的话可以编写一个接受邮件的客户端。
|