`
wanchong998
  • 浏览: 236038 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

用J2ME实现简单电子邮件发送功能

    博客分类:
  • J2me
阅读更多

在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的话可以编写一个接受邮件的客户端。

分享到:
评论

相关推荐

    基于J2ME的移动电子邮件系统的设计与实现.doc

    2.1.2 电子邮件发送和接收的基本原理 邮件发送通常使用SMTP协议,将邮件从本地服务器发送到目标服务器;接收则使用POP3或IMAP协议,从远程服务器下载邮件至本地设备。 2.1.3 电子邮件地址的构成和格式 电子邮件地址...

    J2ME Email的简单实现

    在Java 2 Micro Edition (J2ME)平台上开发应用程序时,有时我们需要实现基本的电子邮件功能。J2ME是Java的一个轻量级版本,主要用于移动设备和嵌入式系统,因此它的API可能没有Java Standard Edition (Java SE)那么...

    用J2ME实现的手机邮箱,包含源码。

    J2ME中的`javax.wireless.messaging`包提供了用于发送和接收消息的功能,如电子邮件。`MIMEMessage`类用于构建复杂的邮件,而`MessageConnection`接口则处理邮件的发送和接收。 4. **用户界面** MIDP提供了基础的...

    J2ME 邮件系统

    在J2ME中开发邮件系统,主要是利用JavaMail API来实现邮件的发送功能。本文将深入探讨如何在J2ME平台上构建一个简单的邮件系统,以及涉及到的关键技术和步骤。 1. **JavaMail API**:JavaMail API是Java环境中处理...

    J2ME开发教程

    - 利用J2ME API实现简单的电子邮件发送功能。 - 配置邮件服务器设置。 #### 六、游戏开发 - **游戏编程基础**: - 学习J2ME Game API的基础知识。 - 实现基本的游戏逻辑和图形绘制。 - **游戏开发实践**: - ...

    Java移动通信程序设计-J2ME MIDP

    而网络连接功能则允许应用程序通过无线网络获取数据,实现在线服务,如浏览网页、发送电子邮件或者下载更新。 在Java移动通信程序设计中,开发者会学习到如何使用MIDP的CLDC(Connected Limited Device ...

    J2MEDev电子期刊5月号PDF版

    用J2ME实现简单电子邮件发送功能.........................................................................40 游戏栏目........................................................................................

    java源码包---java 源码 大量 实例

    一个简单的CS模式的聊天软件,用socket实现,比较简单。 凯撒加密解密程序 1个目标文件 1、程序结构化,用函数分别实现 2、对文件的加密,解密输出到文件 利用随机函数抽取幸运数字 简单 EJB的真实世界模型(源代码...

    java源码包2

    一个简单的CS模式的聊天软件,用socket实现,比较简单。 凯撒加密解密程序 1个目标文件 1、程序结构化,用函数分别实现 2、对文件的加密,解密输出到文件 利用随机函数抽取幸运数字 简单 EJB的真实世界模型(源...

    java源码包3

    一个简单的CS模式的聊天软件,用socket实现,比较简单。 凯撒加密解密程序 1个目标文件 1、程序结构化,用函数分别实现 2、对文件的加密,解密输出到文件 利用随机函数抽取幸运数字 简单 EJB的真实世界模型(源...

    java源码包4

    一个简单的CS模式的聊天软件,用socket实现,比较简单。 凯撒加密解密程序 1个目标文件 1、程序结构化,用函数分别实现 2、对文件的加密,解密输出到文件 利用随机函数抽取幸运数字 简单 EJB的真实世界模型(源...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    Java圆形电子时钟源代码 1个目标文件 内容索引:JAVA源码,系统相关,电子钟 用JAVA编写的指针式圆形电子钟,效果图如下所示,其实代码很简单,希望对你有帮助。 Message-Driven Bean EJB实例源代码 2个目标文件 摘要:...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    Java圆形电子时钟源代码 1个目标文件 内容索引:JAVA源码,系统相关,电子钟 用JAVA编写的指针式圆形电子钟,效果图如下所示,其实代码很简单,希望对你有帮助。 Message-Driven Bean EJB实例源代码 2个目标文件 摘要:...

    计算机科学与技术专业毕业论文参考选题.doc

    - **基于SNMP的网络管理软件的设计**:开发支持简单网络管理协议(SNMP)的网络管理工具,实现网络设备的集中管理。 - **基于NetFlow的网络流量分析系统设计**:构建一个用于监控网络流量的系统,优化网络资源分配。...

    《java 网络编程》实验指导书.doc

    通过JavaMail API,实验者可以学习如何使用Java发送和接收电子邮件。 5. 实验五:JSP程序设计 JSP(JavaServer Pages)是用于动态网页开发的,实验者将学习如何结合Java和HTML创建交互式的Web应用。 6. 实验六:...

    JME程序设计实例教程

    6.1 RecordStore:JME提供了RecordStore类,允许应用程序在设备上保存和读取小量数据,实现简单的数据持久化。 6.2 RMS扩展:开发者可以利用RecordManagementSystem类进行更复杂的数据管理,如创建多个RecordStore...

    展讯MMI软件开发平台

    此外,还包括多媒体应用程序,如音频、视频、测试工具、电话、短信、彩信、WAP浏览、电子邮件、SIP、H.324/MPTT、AT命令、MIDI、MP3、MPEG4、H.263等。平台还支持J2ME Java应用程序和DAL(Device Access Layer),...

Global site tag (gtag.js) - Google Analytics