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

    技术2022-05-11  75

    GCF中并没有提供给我们能够发送电子邮件的APIJ2ME的可选包也没有提供相关的功能。那么我们能用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的话可以编写一个接受邮件的客户端。

     

     

    最新回复(0)