关于我们
About Us
网站建设
Site Design
售后服务
Call Center
经典案例
Projects
技术资料
Source
公司产品
Products
留言板
FeedBack
网站维护
Maintenance
 
 首页>> 技术资料>>JSP  
利用JavaMail 发送/接收 邮件

首先是发送邮件需要sun的mail.jar开发包

1、发送邮件的配置文件

mail.properties

##########  Message type  #############
## type 1:mail  2:insite message 3:mobile message 4: all ######
type=1

###### host(mail server) ######
mailserver=mail.nci.com.cn

####### from (mail man) ########
mailfrom=anhk@nci.com.cn
username=anhk
password=anhk.com

######### can send many people mail ###############
mailto=jones.ahk@gmail.com;jones_ahk@yahoo.com.cn

2、读取配置邮件的文件

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.StringTokenizer;

public class Config {
 // 配置文件名称
 private static String configFile = "/conf/mail.properties";
 private static Properties properties = null;
 
    public Config(){
        init();
    }
    private void init(){
        try {
   properties=new  Properties();
   InputStream fis=this.getClass().getResourceAsStream(configFile);
   properties.load(fis);
   fis.close();   
  } catch (IOException e) {
      System.out.println("== read mail.properties is error ="+e.getMessage());
  }
    }
 /** 取得配置属性 */
 public String getProperty(String key) {
  return properties.getProperty(key);
 }

 /** 取得配置属性(无此属性,返回默认值) */
 public String getProperty(String key, String defaultValue) {
  return properties.getProperty(key, defaultValue);
 }
 /**
  * 解析配置文件中的多个收件人的邮件地址
  * @param str
  * @return
  */
 public String[] splitString(String str){
     String[] mailto = null;
     List list=null;
     if(str!=null){
         list=new ArrayList();
         StringTokenizer st=new StringTokenizer(str,";");
         while(st.hasMoreTokens()){
             list.add(st.nextToken());
         }
     }
     if(list!=null && list.size()>0){
         mailto=new String[list.size()];
         for(int i=0;i<list.size();i++)
             mailto[i]=(String)list.get(i);
     }
     return mailto;
 }
    public static void main(String[] args){
        new Config();
        System.out.println("=====");
    }
}

3、邮件实体

import java.io.Serializable;
import java.util.Vector;

/**
 * 发送邮件的实体
 * CompName: 杭州新世纪信息技术有限公司
 * WebSite : http://www.nci.com.cn
 *
 * @author ahk
 * @msn: jones_ahk@hotmail.com
 */
public class MailEntity implements Serializable{
    private String[] to;   //收件人列表
    private String from;  //发件人
    private String host;  //smtp主机
    private String username; //发送者邮件服务器的用户名
    private String password; //发送者邮件服务器的密码
    private String subject;  //邮件主题
    private String content;  //邮件正文
   
    private String filename; //附件文件名
    private Vector file = new Vector();//附件文件集合
   
    public MailEntity(){
        super();
           
    }
    /**
     * <br>
     * 方法说明:构造器,提供直接的参数传入 <br>
     * 输入参数: <br>
     * 返回类型:
     */
    public MailEntity(String[] to, String from, String smtpServer, String username,
            String password, String subject, String content) {
       
        this.to = to;
        this.from = from;
        this.host = smtpServer;
        this.username = username;
        this.password = password;
        this.subject = subject;
        this.content = content;
    }
    /**
     * <br>
     * 方法说明:往附件组合中添加附件 <br>
     * 输入参数: <br>
     * 返回类型:
     */
    public void attachfile(String fname) {
        file.addElement(fname);
    }
    /**
     * <br>
     * 方法说明:设置邮件服务器地址 <br>
     * 输入参数:String host 邮件服务器地址名称 <br>
     * 返回类型:
     */
    public void setHost(String host) {
        this.host = host;
    }

    /**
     * <br>
     * 方法说明:设置登录服务器校验密码 <br>
     * 输入参数: <br>
     * 返回类型:
     */
    public void setPassWord(String pwd) {
        this.password = pwd;
    }

    /**
     * <br>
     * 方法说明:设置登录服务器校验用户 <br>
     * 输入参数: <br>
     * 返回类型:
     */
    public void setUserName(String usn) {
        this.username = usn;
    }

    /**
     * <br>
     * 方法说明:设置邮件发送目的邮箱 <br>
     * 输入参数: <br>
     * 返回类型:
     */
    public void setTo(String[] to) {
        this.to = to;
    }

    /**
     * <br>
     * 方法说明:设置邮件发送源邮箱 <br>
     * 输入参数: <br>
     * 返回类型:
     */
    public void setFrom(String from) {
        this.from = from;
    }

    /**
     * <br>
     * 方法说明:设置邮件主题 <br>
     * 输入参数: <br>
     * 返回类型:
     */
    public void setSubject(String subject) {
        this.subject = subject;
    }

    /**
     * <br>
     * 方法说明:设置邮件内容 <br>
     * 输入参数: <br>
     * 返回类型:
     */
    public void setContent(String content) {
        this.content = content;
    }  
    /**
     * @return content.
     */
    public String getContent() {
        return content;
    }

    /**
     * @return file.
     */
    public Vector getFile() {
        return file;
    }
    /**
     * @param file.
     */
    public void setFile(Vector file) {
        this.file = file;
    }
    /**
     * @return filename.
     */
    public String getFilename() {
        return filename;
    }
    /**
     * @param filename.
     */
    public void setFilename(String filename) {
        this.filename = filename;
    }
    /**
     * @return from.
     */
    public String getFrom() {
        return from;
    }
    /**
     * @return host.
     */
    public String getHost() {
        return host;
    }

    /**
     * @return password.
     */
    public String getPassword() {
        return password;
    }
    /**
     * @param password.
     */
    public void setPassword(String password) {
        this.password = password;
    }
    /**
     * @return subject.
     */
    public String getSubject() {
        return subject;
    }
    /**
     * @return to.
     */
    public String[] getTo() {
        return to;
    }

    /**
     * @return username.
     */
    public String getUsername() {
        return username;
    }
    /**
     * @param username.
     */
    public void setUsername(String username) {
        this.username = username;
    }
}

4、发送邮件

import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.Enumeration;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;


/**
 * 功能:根据配置文件判断发送某种信息通知客户
 * 这里先实现了邮件通知功能
 * @version 1.0
 */
public class MailSender implements Serializable{
    /**初始化配置文件*/
 private static Config cfg;
 static{
     cfg=new Config();
 }
 
 public MailSender(){
    
 }

 /**
     * 发送信息,根据配置文件内容进行功能选择
     */
    public static void sendMessage(String subject,String content){
        String type=cfg.getProperty("type");
        //发送邮件设置
        if(type!=null && type.equals("1")){
            MailEntity mail=new MailEntity();
            mail.setFrom(cfg.getProperty("mailfrom"));
            mail.setUserName(cfg.getProperty("username"));
            mail.setPassword(cfg.getProperty("password"));
            mail.setHost(cfg.getProperty("mailserver"));
            mail.setSubject(subject);
            mail.setContent(content);
            mail.setTo(cfg.splitString(cfg.getProperty("mailto")));
            //开始发送邮件
            sendMail(mail);
        //发送站内短信  
        }else if(type!=null && type.equals("2")){
            MessageEntity entity=new MessageEntity();
            sendSiteMessage(entity);
        //发送手机短信
        }else if(type!=null && type.equals("3")){
        //全部发送
        }else{
           
        }
    }
    /**
     * <br>
     * 方法说明:发送邮件 <br>
     * 输入参数: <br>
     * 返回类型:boolean 成功为true,反之为false
     */
    public static boolean sendMail(MailEntity entity) {
        final String userName=entity.getUsername();
        final String password=entity.getPassword();
        boolean flag=false;
        //构造mail session
        Properties props = System.getProperties();
        props.put("mail.smtp.host", entity.getHost());
        props.put("mail.smtp.auth", "true");
        Session session = Session.getDefaultInstance(props,
                new Authenticator() {
                    public PasswordAuthentication getPasswordAuthentication() {
                        return new PasswordAuthentication(userName,password);
                    }
                });

        try {
            //构造MimeMessage 并设定基本的值
            MimeMessage msg = new MimeMessage(session);
            msg.setFrom(new InternetAddress(entity.getFrom()));
            InternetAddress[] address = null;
            //设置多个收件人的邮件地址
            if(entity.getTo().length>0){
                address=new InternetAddress[entity.getTo().length];
                for(int i=0;i<entity.getTo().length;i++){                   
                    address[i]=new InternetAddress(entity.getTo()[i]);
                }
            }
            //发送到邮箱
            msg.setRecipients(Message.RecipientType.TO, address);
            //抄送到邮箱
            //msg.setRecipient(Message.RecipientType.CC, new InternetAddress(mailaddr));
            msg.setSubject(transferChinese(entity.getSubject()));

            //构造Multipart
            Multipart mp = new MimeMultipart();

            //向Multipart添加正文
            MimeBodyPart mbpContent = new MimeBodyPart();
            mbpContent.setText(entity.getContent());
            //向MimeMessage添加(Multipart代表正文)
            mp.addBodyPart(mbpContent);

            //向Multipart添加附件
            Enumeration efile = entity.getFile().elements();
            while (efile.hasMoreElements()) {
                MimeBodyPart mbpFile = new MimeBodyPart();
                String filename = efile.nextElement().toString();
                FileDataSource fds = new FileDataSource(filename);
                mbpFile.setDataHandler(new DataHandler(fds));
                mbpFile.setFileName(fds.getName());
                //向MimeMessage添加(Multipart代表附件)
                mp.addBodyPart(mbpFile);
            }
            entity.getFile().removeAllElements();
            //向Multipart添加MimeMessage
            msg.setContent(mp);
            msg.setSentDate(new Date());
            //发送邮件
            Transport.send(msg);
            flag=true;
        } catch (MessagingException mex) {
            mex.printStackTrace();
            Exception ex = null;
            if ((ex = mex.getNextException()) != null) {
                ex.printStackTrace();
            }
            flag=false;
        }
        return flag;
    }
    /**
     * <br>
     * 方法说明:把主题转换为中文 <br>
     * 输入参数:String strText <br>
     * 返回类型:
     */
    public static String transferChinese(String strText) {
        try {
            strText = MimeUtility.encodeText(new String(strText.getBytes(),
                    "GB2312"), "GB2312", "B");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        return strText;
    }
   
    /**
     * 发送站内短信
     * @param entity
     * @return
     */
    public static boolean sendSiteMessage(MessageEntity entity){
        boolean flag=false;
        //进行相关处理,进行发送站内短信
        return flag;
    }
    /**
     * <br>
     * 方法说明:主方法,用于测试 <br>
     * 输入参数: <br>
     * 返回类型:
     */
    public static void main(String[] args) {
//        MailEntity entity=new MailEntity();
//        entity.setHost("mail.nci.com.cn");
//        entity.setUserName("anhk");
//        entity.setPassWord("anhk.com");
//        entity.setFrom("anhk@nci.com.cn");
//        entity.setTo(new String[]{"jones.ahk@gmail.com","jones_ahk@yahoo.com.cn"});
//        entity.setSubject("你好,这是sendmail测试!");
//        entity.setContent("你好,这是留言测试中的发送邮件通知信息测试!");
        //Mail sendmail = new
        // Mail("dujiang@sricnet.com","du_jiang@sohu.com","smtp.sohu.com","du_jiang","31415926","你好","胃,你好吗?");
        //sendmail.attachfile("c:\test.txt");
        //sendmail.attachfile("DND.jar");
//        sendMail(entity);
       sendMessage("你好,这是sendmail测试!","你好,这是留言测试中的发送邮件通知信息测试!");
    }
}

测试完毕

使用JavaMail接收邮件

import javax.mail.*;
import javax.mail.internet.*;
import java.util.*;
import java.io.*;
/**
 * <p>Title: 使用JavaMail接收邮件</p>
 * <p>Description: 实例JavaMail包接收邮件,本实例没有实现接收邮件的附件。</p>
 * <p>Copyright: Copyright (c) 2003</p>
 * <p>Filename: POPMail.java</p>
 * @version 1.0
 */
public class POPMail{
/**
 *<br>方法说明:主方法,接收用户输入的邮箱服务器、用户名和密码
 *<br>输入参数:
 *<br>返回类型:
 */
    public static void main(String args[]){
        try{
            String popServer=args[0];
            String popUser=args[1];
            String popPassword=args[2];
            receive(popServer, popUser, popPassword);
        }catch (Exception ex){
            System.out.println("Usage: java com.lotontech.mail.POPMail" " popServer popUser popPassword");
        }
        System.exit(0);
    }
/**
 *<br>方法说明:接收邮件信息
 *<br>输入参数:
 *<br>返回类型:
 */
    public static void receive(String popServer, String popUser, String popPassword){
        Store store=null;
        Folder folder=null;
        try{
            //获取默认会话
            Properties props = System.getProperties();
            Session session = Session.getDefaultInstance(props, null);
            //使用POP3会话机制,连接服务器
            store = session.getStore("pop3");
            store.connect(popServer, popUser, popPassword);
            //获取默认文件夹
            folder = store.getDefaultFolder();
            if (folder == null) throw new Exception("No default folder");
            //如果是收件箱
            folder = folder.getFolder("INBOX");
            if (folder == null) throw new Exception("No POP3 INBOX");
            //使用只读方式打开收件箱
            folder.open(Folder.READ_ONLY);
            //得到文件夹信息,获取邮件列表
            Message[] msgs = folder.getMessages();
            for (int msgNum = 0; msgNum < msgs.length; msgNum ){
                printMessage(msgs[msgNum]);
            }
        }catch (Exception ex){
            ex.printStackTrace();
        }
        finally{
        //释放资源
            try{
                if (folder!=null) folder.close(false);
                if (store!=null) store.close();
            }catch (Exception ex2) {
                ex2.printStackTrace();
            }
        }
    }
/**
 *<br>方法说明:打印邮件信息
 *<br>输入参数:Message message 信息对象
 *<br>返回类型:
 */
    public static void printMessage(Message message){
        try{
            //获得发送邮件地址
            String from=((InternetAddress)message.getFrom()[0]).getPersonal();
            if (from==null) from=((InternetAddress)message.getFrom()[0]).getAddress();
            System.out.println("FROM: " from);
            //获取主题
            String subject=message.getSubject();
            System.out.println("SUBJECT: " subject);
            //获取信息对象
            Part messagePart=message;
            Object content=messagePart.getContent();
            //附件
            if (content instanceof Multipart){
                messagePart=((Multipart)content).getBodyPart(0);
                System.out.println("[ Multipart Message ]");
            }
            //获取content类型
            String contentType=messagePart.getContentType();
            //如果邮件内容是纯文本或者是HTML,那么打印出信息
            System.out.println("CONTENT:" contentType);
            if (contentType.startsWith("text/plain")||
                contentType.startsWith("text/html")){
                InputStream is = messagePart.getInputStream();
                BufferedReader reader=new BufferedReader(new InputStreamReader(is));
                String thisLine=reader.readLine();
                while (thisLine!=null){
                    System.out.println(thisLine);
                    thisLine=reader.readLine();
                }
            }
            System.out.println("-------------- END ---------------");
        }catch (Exception ex){
            ex.printStackTrace();
        }
    }
} 

 
 
北京四方互动网络技术有限公司
© 版权所有 2001-2005
地址:北京市海淀区知春路豪景佳苑3号楼401室
邮编:100086 公司地图
业务专线:010-62568654 62106102
传  真:010-82611617
公司总机:62106100/1/2/3
售后服务:分机808、881、812