`
chenzihong_cyd
  • 浏览: 16040 次
  • 性别: Icon_minigender_1
  • 来自: 昆明
社区版块
存档分类
最新评论
  • a90830: 兄弟,十分感谢!  您帮到我了  我跟你的情况一模一样,我也写 ...
    tapestry
阅读更多
转自:http://www.blogjava.net/BlueSUN/archive/2007/04/18/111750.html

我干软件开发也有一点的年头了,回头想想,也经历了不少的酸甜苦辣,为解决了复杂的问题快乐过.也为不分昼夜的加班赶工程郁闷过.不过这些都没能减少我对计算机的热情,我对程序的喜好.以前对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).它不是邮件传输协议,但是对于传输的内容的消息,附件以及其他的内容定义了格式.可以理解成一个定义合适的标准.

    NNTP:因为JavaMail将供应商和所有其它的东西分开了,您就能轻松添加额外的协议支持.NNTP 就是网络新闻传输协议.

    JavaMailAPI可以到 http://java.sun.com/products/javamail/index.html 进行下载,并将mail.jar添加到classpath即可.

    JAF框架可以到 http://java.sun.com/products/javabeans/glasgow/jaf.html 进行下载,并将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();

        }

    }

}

分享到:
评论

相关推荐

    javamail应用

    在JavaMail的应用中,我们可以实现发送带有附件的邮件,以及利用XStream库将邮件对象转换为XML并保存到本地。此外,JavaMail还支持对邮件进行操作,如删除、查看和恢复。 ### JavaMail核心对象 #### 1. Session `...

    JavaMail应用实例说明:简单(HTML)邮件的发送 javaMail基础教程下载

    JavaMail是一种广泛使用的Java库,它允许开发人员在Java应用程序中发送和接收电子邮件。这个教程主要关注的是如何使用JavaMail发送简单的HTML邮件,这在现代应用程序中非常常见,因为HTML邮件可以提供更丰富的格式和...

    javamail应用三(接收邮件)参照.pdf

    JavaMail 是一个开源库,用于在Java应用程序中处理电子邮件。在本文中,我们将深入探讨如何使用JavaMail API接收邮件,特别关注POP3和IMAP协议的使用。接收邮件的过程涉及几个关键步骤,包括建立会话、连接邮件...

    javamail 所有jar包

    在开发JavaMail应用时,`activation.jar` 提供了对MIME消息支持的必要组件。 2. **mail.jar**:这个文件是JavaMail的核心库,它包含了所有与邮件处理相关的类和接口。JavaMail API 提供了一系列的类和接口,如`...

    简单javamail的实现(HelloWorld)

    这个“简单javamail的实现(HelloWorld)”的教程将引导我们通过创建一个基础的JavaMail应用,这通常被称为“HelloWorld”示例,因为它标志着我们对JavaMail API的初步理解和使用。 JavaMail API 提供了广泛的类和...

    javamail-1.4.3源码

    2. **Session 类**:每个JavaMail应用都需要一个`Session`实例,它管理与邮件服务器的连接参数,如主机名、端口、认证信息等。`Session`是线程安全的,可以全局配置。 3. **Store 类**:用于连接邮件服务器并管理...

    JavaMail的常用类介绍

    每个JavaMail应用至少需要一个`Session`实例,它可以配置多个不同的会话以适应不同的邮件服务需求。`Session.getInstance()`方法用于创建一个新的会话,传入`Properties`对象以设置特定的邮件服务器信息。 3. **...

    javamail所需要的jar包

    开发JavaMail应用时,你需要确保所有必要的jar包都被正确地引入到项目的类路径中。此外,配置Session对象是使用JavaMail的第一步,这涉及到设置属性(如主机名、端口、用户名和密码)以连接到邮件服务器。然后,你...

    javamail发送邮件.zip

    在JavaMail应用中,这可能是用来将上传的文件保存到临时位置,以便作为邮件附件。 4. **正文文本与图片**: 邮件的正文可以包含纯文本,也可以包含HTML格式的内容,从而可以嵌入图片。JavaMail API 支持发送HTML...

    javamail 实例

    JavaMail 是一个开源的 Java 库,用于在 Java 应用程序中实现电子邮件的发送和接收。它提供了全面的 API,使得开发者可以方便地处理 SMTP、POP3 和 IMAP 协议,涵盖邮件的创建、编码、发送以及邮件服务器的交互等...

    非常好的东西-javamail

    6. **jspsmartupload.jar**:这是一个用于处理Web应用中文件上传的库,可能在JavaMail应用中用于上传附件。SmartUpload类库提供了一组方便的API,简化了从HTML表单接收文件的过程。 7. **dsn.jar**:Delivery ...

    Javamail

    在JavaMail应用中,合理的日志配置可以帮助我们跟踪邮件发送的全过程,包括成功发送的邮件、失败的原因以及可能的错误堆栈信息。 在使用JavaMail API时,开发者需要注意以下几个关键知识点: 1. **Session对象**:...

    JavaMail 发送邮件

    每个JavaMail应用至少有一个Session,可以有多个。创建Session时,可以传递Properties对象来指定服务器设置,如:`Session sendMailSession = Session.getInstance(props, null);` 3. **javax.mail.Transport** - ...

    JavaMail使用实例及所需jar包

    JavaMail是一种广泛使用的Java库,它允许开发人员在Java应用程序中...同时,对于那些已经在项目中使用JavaMail的开发者,这个压缩包也提供了一个方便的参考和测试环境,确保他们拥有运行JavaMail应用所需的全部依赖。

    JavaMail 配置文档

    JavaMail 是 Sun 公司提供的一套标准开发包,用于帮助 Java 开发人员在应用程序中实现邮件发送和接收功能。该开发包支持多种常用的邮件协议,如 SMTP、POP3、IMAP 和 MIME 等。 ### JavaMail API 简介 JavaMail ...

    JAVAMAIL学习笔.doc

    在构建JavaMail应用时,还需要考虑安全性,特别是当涉及到SMTP服务器的身份验证时。许多SMTP服务器要求用户通过用户名和密码进行身份验证,JavaMail API提供了相应的方法来处理这些安全细节。 总的来说,JavaMail为...

    JavaMail开发包

    5. **Session类**:每个JavaMail应用都始于一个Session实例,它是整个邮件操作的上下文,用于配置连接参数(如服务器地址、端口、用户名、密码等)以及提供邮件会话的共享资源。 6. **Address类**:用于表示邮件...

Global site tag (gtag.js) - Google Analytics