用J2ME实现简单电子邮件发送功能
2024年03月05日
在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的话可以编写一个接受邮件的客户端。