posts - 70,comments - 408,trackbacks - 0

    我干软件开发也有一点的年头了,回头想想,也经历了不少的酸甜苦辣,为解决了复杂的问题快乐过.也为不分昼夜的加班赶工程郁闷过.不过这些都没能减少我对计算机的热情,我对程序的喜好.以前对javamail也有一些学习性的认识,不过一直没在实际的项目中应用过.直到最近的一个项目,需要javamail所以我打算认真的学习一下这种技术,因为我目前擅长的是struts,而struts又不具备邮件发送的功能,所以我要深刻的学习一下javamailapi.所以在我学会了javamail的基本操作的同时也将这篇文章献给大家,虽然技术含量不高,但是希望能对一些刚刚接触javamail的同道中人有所帮助.好了闲话少说进入正题,首先介绍几个邮件传输协议,虽然说不了解这些协议也可以实用javamailapi,但是我始终认为,如果不透彻的了解一种技术的本质,即使会用了也是照葫芦画瓢,换一种模式也许就玩不转了.

    smtp:简单邮件传输协议(simple mail transfer protocol,smtp)由rfc821定义,它定义了发送邮件的机制,在javamail环境中,基于javamail的程序将和因特网服务供应商isp(internet service provider s)smtp服务器通信.smtp服务器会中转消息给接收方smtp服务器以便最终让用户经由pop或者imap获得.

    pop:代表邮局协议(post office protocol).目前的版本是3.所以一般都称之为pop3.这个协议是由rfc1939定义的.pop是一种机制,因特网上多大数用户用它得到邮件.它规定每个用户一个邮箱的支持.使用pop协议的时候,用户的许多性能并不是由pop协议支持的,如查看几封新邮件消息这个功能,这些功能内建在如eudora或microsoftoutlook之类的程序中,它们记住一些事.所以在用javamail的时候,如果你想要这些信息,你就必须自己算了.

    imap:是更高级的用户接收消息的协议,被定义在rfc2060中,imap代表因特网消息访问协议(internet message access protocol),目前用的版本是4,所以也叫做imap4.在用到imap的时候,邮件服务器必须支持这个协议,不能仅仅把使用pop的程序用于imap,并指望它支持imap所有性能.

    mime:是因特网邮件扩展标准(multipurpose internet mail extensions).它不是邮件传输协议,但是对于传输的内容的消息,附件以及其他的内容定义了格式.可以理解成一个定义合适的标准.

    就是网络新闻传输协议.

    javamailapi可以到 进行下载,并将mail.jar添加到classpath即可.

    jaf框架可以到 进行下载,并将activation.jar添加到classpath即可.

    如果实用j2ee就没由什么特定非要用基本的javamailapi了.j2ee的类就能处理了.只要确保j2ee.jar文件在classpath中就ok了.

下面我用一个最简单的例子还演示第一条消息的发送.

1,获取系统properties.

properties props = system.getproperties();

2,将您的smtp服务器名添加到mail.smtp.host关键字的属性中.

props.pout( mail.smtp.host ,host);

3,获取基于properties session对象.

session session = session.getdefaultinstance(props,null);

4,从session创建一个mimemessage.

mimemessage message = new mimemessage(session);

5,设置消息from域.

message.setform(new internetaddress(from));

6,设置to域.

message.addrecipient(message.recipienttype.to,new internetaddress(to));

7,设置消息主题.

message.setsubject( hellojavamail );

8,设置消息内容.

message.settext( welcome to javamail );

9发送消息.

transport.send(message);

10,在编译用运的时候传递mstp服务器,from地址,to地址.

    通过简单的接触了javamail相信大家多邮件发送也有了简单的了解和认识,下面我主要研究一下它的具体功能,也就是说具体的接口或类的含义.

    session类定义了一个基本的邮件会话,所有的其他类都是由这个session才得意生效的,session对象用java.util.properties对象获取信息,如邮件服务器,用户名,密码及整个应用程序中共享的其他信息.类的构造器是此有的,private.它能用getdefaultinstance()方法来共享.获取session对象的方方法如下:

properties props = new properties();

session session = session.getdefaultinstance(props,null);

null参数都是authenticator对象,在这里没有使用.

对于大多数情况,共享的session已经足够用了.

    message消息类,在获得了session对象后,就可以继续创建要发送的消息.因为message是个抽象类,您必须用一个子类,多数情况下为java.mail.internet.mimemessage.这个能理解成mime类型和头的电子邮件消息.正如不同的rfc中定义的,虽然在某些头部域非ascii字符也能被编译,但是message头只能被限制用us-ascii字符.要创建一个message请将session对象传递给mimemessage的构造器.

mimemessage message = newmimemessage(session);

一旦获得消息,就可以设置各个部分了.最基本的就是setcontent()方法,例如/

message.setcontent( hello , text/plain );

如果知道在实用mimemessage,而且消息是纯文本格式,就可以用settext()方法,它只需要代表实际内容的参数.(mime类型缺省为text/plain)

setsubject()方法设置subject(主题);

message.setsubject( 主题 );

    address地址类,和message一样也是一个抽象类,一旦创建了session和message并将内容填入消息后,就可以用address确定信件的地址了,用javax.mail.internet.

internetaddress类.若创建的地址只包含电子邮件地址,只要传递电子邮件地址给构造器就可以了.例如:address address = new internetaddress( it5719@163.com );

若希望名字挨着电子邮件现实,就可以把它传递给构造器,如下:

address address = new internetaddress( it5719@163.com , 我心依旧 );

需要为消息的from域和to域创建地址对象,除非邮件服务器阻止,没有什么能阻止你发送一段看上去是任何人的消息了呵呵.一旦创建address将他们域消息连接方法有两种,如要要识别发件人的就可以用setfrom()和setreplyto方法.然后message.setfrom(address);

需要实用多个from地址的就用addfrom()方法.例子如下:

address[] address = ,.,. ;    message.addfrom(address);

若要识别消息recipient收件人,就要实用addrecipient()方法了.例如:

message.addrecipient(type,address)

    authenticator与java.net类一样,javamailapi也可以利用authentcator通过用户名密码访问受保护的资源.对于javamail来说,这些资源就是邮件服务器,authentcator类在javax.mail包中.要使用authenticator,首先创建一个抽象的子类,并从

getpasswordauthentication方法中返回passwordauthentication实例,创建完成后,您必须向session注册authenticator,然后在需要认证的时候会通知它,其实说白了就是把配置的用户名和密码返回给调用它的程序.例如:

properties props = new properties();

authenticator auth = new mailauthenticator()//接口声明,创建自己新类的实例.

session session = session.getdefauitinstance(props,auth);

    transport消息发送传输类,这个类用协议指定的语言发送消息,通常是smtp,它是抽象类,它的工作方式与session有些类似,尽调用静态方法send()方法,就ok了.例如:

transport.send(message);

或者也可以从针对协议的会话中获取一个特定的实例,传递用户名和密码.发送消息,然后关闭连接,例如:

message.savechanges();

transport transport = session.gettreansport( smtp );//指定的协议

transport.connect(host,username,password);

transport.sendmessage(message,message.getallrecipients());

transport.close();

如果要观察传到邮件服务器上的邮件命令,请用session.setdubug(true)设置调试标志.

    store和folder用session获取消息,与发送消息开始很相似,但是在session得到后,很可能实用用户名和密码或实用authenticator连接到一个store.类似于transport,也是一样要告诉store用什么协议.例如

store store = session.getstore( pop3 );

store.connect(host,username,password);

连接到store之后,接下来,获得一个folder,必须打开它就可以读取里边的消息了.

folder folder = store.getfolder("inbox");

folder.open(folder.read_only);

message[] message = folder.getmessages();

pop3唯一可用的文件夹就是inbox,如果实用imap,还可以用其他的文件夹.

当读到了具体的message以后,就可以用getcontent来获取内容,或者用writeto()将内容写入流,getcontent()方法只能得到消息内容,而writeto()的输出却包含消息头.

system.out.println(((mimemessage)message).getconntent());

一旦读取完毕邮件,要关闭store和folder的连接.

folder.colse(boolean);

store.colse();

传递给folder的close()方法的boolean参数表示是否清楚已删除的消息从而更新folder.

    上面就是javamail邮件操作的基本的常用类,我觉得理解了这几个类的机制,基本就可以处理一般的邮件操作了.下面是一个我写的javamail实现邮件发送的代码.

首先是一个authenticator类的实现:记录用户名和密码:

import javax.mail.*;

 

 

public class mailauthenticator extends authenticator

{

    //******************************

    //由于发送邮件的地方比较多,

    //下面统一定义用户名,口令.

    //******************************

    public static string huawei_mail_user = "it5719@163.com";

    public static string huawei_mail_password = "密码";

 

 

    public mailauthenticator()

    {

    }

 

    protected passwordauthentication getpasswordauthentication()

    {

        return new passwordauthentication(huawei_mail_user, huawei_mail_password);

    }

 

}

 

这个类是发送邮件的类.

 

 

package com.deepdo.common.mail;

 

/**

 * 此处插入类型说明。

 * 创建日期:(2006-4-21 14:57:16)

 * @author:张宏亮

 */

 

import java.util.*;

import java.io.*;

import javax.mail.*;

import javax.mail.internet.*;

import javax.activation.*;

 

 

public class sendmail {

 

    //要发送mail地址

    private string mailto = null;

    //mail发送的起始地址

    private string mailfrom = null;

    //smtp主机地址

    private string smtphost = null;

    //是否采用调试方式

    private boolean debug = false;

 

    private string messagebasepath = null;

    //mail主题

    private string subject;

    //mail内容

    private string msgcontent;

 

    private vector attachedfilelist;

    private string mailaccount = null;

    private string mailpass = null;

    private string messagecontentmimetype ="text/html; charset=gb2312";

 

    private string mailbccto = null;

    private string mailccto = null;

    /**

     * sendmailservice 构造子注解。

     */

    public sendmail() {

        super();

   

    }

 

    private void fillmail(session session,mimemessage msg) throws ioexception, messagingexception{

   

        string filename = null;

        multipart mpart = new mimemultipart();

        if (mailfrom != null) {

            msg.setfrom(new internetaddress(mailfrom));

            system.out.println("发送人mail地址:" mailfrom);

        } else {

            system.out.println("没有指定发送人邮件地址!");

            return;

        }

        if (mailto != null) {

            internetaddress[] address = internetaddress.parse(mailto);

            msg.setrecipients(message.recipienttype.to, address);

            system.out.println("收件人mail地址:" mailto);

        } else {

            system.out.println("没有指定收件人邮件地址!");

            return;

        }

   

        if (mailccto != null) {

            internetaddress[] ccaddress = internetaddress.parse(mailccto);

            system.out.println("ccmail地址:" mailccto);

            msg.setrecipients(message.recipienttype.cc, ccaddress);

        }

        if (mailbccto != null) {

            internetaddress[] bccaddress = internetaddress.parse(mailbccto);

            system.out.println("bccmail地址:" mailbccto);

            msg.setrecipients(message.recipienttype.bcc, bccaddress);

        }

        msg.setsubject(subject);

        internetaddress[] replyaddress = { new internetaddress(mailfrom)};

        msg.setreplyto(replyaddress);

        // create and fill the first message part

        mimebodypart mbodycontent = new mimebodypart();

        if (msgcontent != null)

            mbodycontent.setcontent(msgcontent, messagecontentmimetype);

        else

            mbodycontent.setcontent("", messagecontentmimetype);

        mpart.addbodypart(mbodycontent);

        // attach the file to the message

        if (attachedfilelist != null) {

            for (enumeration filelist = attachedfilelist.elements(); filelist.hasmoreelements();) {

                filename = (string) filelist.nextelement();

                mimebodypart mbodypart = new mimebodypart();

   

                // attach the file to the message

                filedatasource fds = new filedatasource(messagebasepath filename);

                system.out.println("mail发送的附件为:" messagebasepath filename);

                mbodypart.setdatahandler(new datahandler(fds));

                mbodypart.setfilename(filename);

                mpart.addbodypart(mbodypart);

            }

        }

        msg.setcontent(mpart);

        msg.setsentdate(new date());

    }

    /**

     * 此处插入方法说明。

     */

    public void init()

    {

   

    }

    /**

     * 发送e_mail,返回类型为int

     * 当返回值为0时,说明邮件发送成功

     * 当返回值为3时,说明邮件发送失败

     */

    public int sendmail() throws ioexception, messagingexception {

   

        int loopcount;

        properties props = system.getproperties();

        props.put("mail.smtp.host", smtphost);

        props.put("mail.smtp.auth", "true");

   

        mailauthenticator auth = new mailauthenticator();

   

        session session = session.getinstance(props, auth);

        session.setdebug(debug);

        mimemessage msg = new mimemessage(session);

        transport trans = null;

        try {

   

            fillmail(session,msg);

            // send the message

            trans = session.gettransport("smtp");

            try {

                trans.connect(smtphost, mailauthenticator.huawei_mail_user, mailauthenticator.huawei_mail_password);//, huawei_mail_password);

            } catch (authenticationfailedexception e) {

                e.printstacktrace();

                system.out.println("连接邮件服务器错误:");

                return 3;

            } catch (messagingexception e) {

                system.out.println("连接邮件服务器错误:");

                return 3;

            }

   

            trans.send(msg);

            trans.close();

   

        } catch (messagingexception mex) {

            system.out.println("发送邮件失败:");

            mex.printstacktrace();

            exception ex = null;

            if ((ex = mex.getnextexception()) != null) {

                system.out.println(ex.tostring());

                ex.printstacktrace();

            }

            return 3;

        } finally {

            try {

                if (trans != null && trans.isconnected())

                    trans.close();

            } catch (exception e) {

                system.out.println(e.tostring());

            }

        }

        system.out.println("发送邮件成功!");

        return 0;

    }

    public void setattachedfilelist(java.util.vector filelist)

    {

        attachedfilelist = filelist;

    }

    public void setdebug(boolean debugflag)

    {

        debug=debugflag;

    }

    public void setmailaccount(string straccount) {

        mailaccount = straccount;

    }

    public void setmailbccto(string bccto) {

        mailbccto = bccto;

    }

    public void setmailccto(string ccto) {

        mailccto = ccto;

    }

    public void setmailfrom(string from)

    {

        mailfrom=from;

    }

    public void setmailpass(string strmailpass) {

        mailpass = strmailpass;

    }

    public void setmailto(string to)

    {

        mailto=to;

    }

    public void setmessagebasepath(string basepath)

    {

        messagebasepath=basepath;

    }

    public void setmessagecontentmimetype(string mimetype)

    {

        messagecontentmimetype = mimetype;

    }

    public void setmsgcontent(string content)

    {

        msgcontent=content;

    }

    public void setsmtphost(string host)

    {

        smtphost=host;

    }

    public void setsubject(string sub)

    {

        subject=sub;

    }

   

    public static void main(string[] argv) throws exception

    {

        for(int i = 0;i<10;i ) {

        sendmail sm = new sendmail();

        sm.setsmtphost("smtp地址");

        sm.setmailfrom("发送地址");

        sm.setmailto("目标地址");

        sm.setmsgcontent("内容");

        sm.setsubject("标题");

        sm.sendmail();

        }

    }

}

posted on 2006-04-24 11:05 我心依旧 阅读(29993) 评论(28)    

feedback:
# re: javamail 深入浅出
2006-04-24 12:50 |
总结得不错,我在用javamail编程时,只是对其中一些重要的类有点肤浅的认识,换句话说,只知其然(好使就行:-)),而不知其所以然。读了你的文章,感觉对其中的内幕有了一定的认识,谢谢你!  回复  
  
# re: javamail 深入浅出
2006-04-24 19:00 |
是不错。。最近也在研究javamail
...
  回复  
  
# re: javamail 深入浅出
2006-08-20 15:28 |
好人啊...........................................  回复  
  
# re: javamail 深入浅出
2006-10-30 11:04 |
用javamail做完程序,想打包成jar,但是出错,郁闷,你们碰见过吗?  回复  
  
# re: javamail 深入浅出
2006-11-21 10:00 |
接收邮件正文出现乱码怎么解决,诸位有什么好办法?  回复  
  
# re: javamail 深入浅出
2006-11-21 10:00 |
接收邮件正文出现乱码怎么解决,诸位有什么好办法?  回复  
  
# re: javamail 深入浅出
2007-04-18 11:18 |
如果做邮件服务器 不是客户端怎么办? 接收邮件该怎么去实现呢?  回复  
  
# re: javamail 深入浅出
2007-05-08 13:56 |
真是不错啊,谢谢大侠!  回复  
  
# re: javamail 深入浅出[未登录]
2007-10-25 21:39 |
非常好的讲解,楼主辛苦了,谢谢!  回复  
  
# re: javamail 深入浅出
2007-11-29 09:57 |
爱死你了,  回复  
  
# re: javamail 深入浅出
2007-12-17 07:07 |
被同学点名过来看 谢谢了 学了不少  回复  
  
# re: javamail 深入浅出
2007-12-20 22:12 |
很好,受益非浅  回复  
  
# re: javamail 深入浅出
2008-06-23 17:55 |
  回复  
  
# re: javamail 深入浅出
2008-06-23 17:57 |
老大,抄的吧  回复  
  
# re: javamail 深入浅出[未登录]
2009-06-19 14:53 |
学习一下。。。。

  回复  
  
# re: javamail 深入浅出
2009-07-20 09:42 |
谢谢,你总结的很不错阿。我最近一在学习这个,看了你这个,大致的框架都清楚了阿。  回复  
  
# re: javamail 深入浅出
2009-08-07 14:44 |
@wangf
不是乱码,是被加密了的!可以根据加密方法,进行解密的!  回复  
  
# re: javamail 深入浅出
2009-08-12 16:03 |
  回复  
  
# re: javamail 深入浅出
2009-08-12 16:04 |
  回复  
  
# re: javamail 深入浅出
2009-09-11 15:03 |
我想请教下
stmphost应该怎么写的  回复  
  
# re: javamail 深入浅出
2009-12-15 10:34 |
最近也在学习javamail,感觉楼主总结的不错,谢了啊。  回复  
  
# re: javamail 深入浅出
2010-07-15 09:14 |
你们放在tomcat中web项目中发生过没有?为什么我直接用main方法可以发送,放在web中用action调用就出问题了。java.lang.unsupportedoperationexception: method not yet implemented
调试发现时在创建mimemessage对象时出错,有没有高人帮帮忙啊。
qq:595755330  回复  
  
# re: javamail 深入浅出
2010-10-11 20:44 |
@wailintojava
好!  回复  
  
# re: javamail 深入浅出
2010-12-20 09:51 |
写的很详细,谢谢!  回复  
  
# re: javamail 深入浅出
2011-03-12 22:08 |
很好 不错  回复  
  
# re: javamail 深入浅出
2011-03-25 13:22 |
不错,学习了!  回复  
  
# re: javamail 深入浅出
2011-08-29 11:57 |
您好,关于javamail,小弟有一些疑问,希望您能够帮助我一下。我的qq是109345300.您能加我指导一下我嘛?  回复  
  
# re: javamail 深入浅出
2011-09-13 16:33 |
javax.mail.authenticationfailedexception: 535 authentication failed
这是什么原因?  回复  
  

只有注册用户后才能发表评论。


网站导航:
              
 
网站地图