Java邮件服务学习之三:邮箱服务客户端-Java Mail

 

一、java mail的两个JAR包

1、mail.jar:不在JDK中,核心功能依赖JDK4及以上,该jar包已经加入到java EE5;

下载地址:http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-eeplat-419426.html

 

2、activation.jar:JavaMail依赖JAF(JavaBeans Activation Framework),JAF在Java6之后已经合并到JDK中,而JDK5之前需要另外下载JAF的类库。

最好单独下载加入到工程中。

下载地址:http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-java-plat-419418.html

 

二、常用API介绍

  1. javax.mail.Session:会话类,如服务器的主机名、端口号、协议名称等  主要用来创建邮件对象、实现邮件对象中数据的封装并可指定邮件服务器认证的客户端属性。它表示程序与某一个邮件服务器即将建立通信,在建立的过程可以进行口令认证。
  2. javax.mail.Message:邮件模型,发送邮件和接收邮件的媒介,封装了邮件的信息,如发件人、收件人、邮件标题、邮件内容等  
  3. javax.mail.Transport:邮件发送类 连接邮件SMTP服务器,发送邮件  
  4. javax.mail.Store:邮件接收类 连接邮件POP3、IMAP服务器,收取邮件, 邮件服务器中的存储库,里面放着所有的邮件文件夹
  5. javax.mail.internet.InternetAddress 主要是表示邮件发送人和邮件接收人的地址
  6. javax.mail.Folder  该文件夹就是消息的具体所在文件夹,默认的邮件均在INBOX文件中

三、使用java mail 发送邮件

基本步骤:

1 利用Properties来设置Session,一般主要设置两个mail.smtp.host和mail.smtp.auth,第一个主要是设置邮件服务器名,第二个是设置口令true或者false

2 利用Session.getInstance(Properties)启动一个与邮件服务器的会话

3 根据获取的Session来传建一个消息Message

4 定义消息的发信人地址InternetAddress和消息的收信人地址。

5 设置消息发送的主题和内容

6 利用Message.saveChanges()来存储填写的邮件信息

7 根据Session.getTransport("smtp")获取邮件发送类

8 利用发送人的用户名和密码连接到指定的邮件服务器

9 将该消息发送

10 关闭连接

eg:

(1)发送一个纯文本邮件

package mail;

import java.util.Date;
import java.util.Properties;

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.URLName;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

/**
 * 邮件发送服务
 */
public class SendMailService
{

    /**
     * 发送纯文本邮件
     * @param smtpHost 邮件服务器
     * @param to 收件人(可以是多个,使用逗号分隔)
     * @param cc 抄送人(可以是多个,使用逗号分隔)
     * @param bcc密送人(可以是多个,使用逗号分隔)
     * @param sender发件人
     * @param title邮件标题
     * @param content邮件内容
     * @param username邮箱用户名(一般是去掉@之前的那一部分)
     * @param password(邮箱密码)
     * @throws MessagingException
     */
    public static void sendPlainTextEmail(String smtpHost,
            String to,
            String cc,
            String bcc,
            String sender,
            String title,
            String content,
            String username,
            String password
            ) throws MessagingException
    {
        //第一步 利用Properties来设置Session,一般主要设置两个mail.smtp.host和mail.smtp.auth,第一个主要是设置邮件服务器名,第二个是设置口令true或者false
        Properties props = new Properties();
        props.put("mail.host", smtpHost);
        props.put("mail.transport.protocol", "smtp");
        props.put("mail.smtp.auth", "true");
        
        //第二步 利用Session.getInstance(Properties)启动一个与邮件服务器的会话
        Session session = Session.getInstance(props);
        session.setDebug(true);
        
        //第三步 根据获取的Session来传建一个消息Message
        MimeMessage message = new MimeMessage(session);
        
        //第四步 定义消息的发信人地址InternetAddress和消息的收信人地址。
        //发件人
        InternetAddress sendaddr = new InternetAddress(sender);
        message.setFrom(sendaddr);
        //收件人
        InternetAddress[] toaddrs = InternetAddress.parse(to);
        message.setRecipients(Message.RecipientType.TO, toaddrs);
        //抄送人
        InternetAddress[] ccaddrs = InternetAddress.parse(cc);
        message.setRecipients(Message.RecipientType.CC, ccaddrs);
        //密送人
        InternetAddress[] bccaddrs = InternetAddress.parse(bcc);
        message.setRecipients(Message.RecipientType.BCC, bccaddrs);
        //第五步 设置消息发送的主题、内容、时间
        message.setSubject(title);
        message.setText(content);
        message.setSentDate(new Date());
        //第六步 利用Message.saveChanges()来存储填写的邮件信息
        message.saveChanges();
        //第七步 根据Session.getTransport("smtp")获取邮件发送类
        Transport ts = session.getTransport("smtp");
        //第八步 利用发送人的用户名和密码连接到指定的邮件服务器
        ts.connect(smtpHost, username, password);  
        //第九步将该消息发送
        ts.sendMessage(message, message.getAllRecipients());
        //第十步 关闭连接
        ts.close();
    }
    
}

(2)先创建已通过身份验证的会话连接 再发送邮件

package mail;

import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;

/**
 * 用户身份认证
 * @author Administrator
 *
 */
public class SmtpAuth extends Authenticator 
{

    private String username;
    private String password;
    
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
    
    public void setUserinfo(String username,String password)
    {
        this.username = username;
        this.password = password;
    }

    protected PasswordAuthentication getPasswordAuthentication()
    {
        return new PasswordAuthentication(username,password);
    }
    
    
}
package mail;

import java.util.Date;
import java.util.Properties;

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.URLName;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

/**
 * 邮件发送服务
 */
public class SendMailService
{

    /**
     * 发送纯文本邮件
     * @param smtpHost 邮件服务器
     * @param to 收件人(可以是多个,使用逗号分隔)
     * @param cc 抄送人(可以是多个,使用逗号分隔)
     * @param bcc密送人(可以是多个,使用逗号分隔)
     * @param sender发件人
     * @param title邮件标题
     * @param content邮件内容
     * @param username邮箱用户名(一般是去掉@之前的那一部分)
     * @param password(邮箱密码)
     * @throws MessagingException
     */
    
    public static void sendPlainTextEmailByAuth(String smtpHost,
            String to,
            String cc,
            String bcc,
            String sender,
            String title,
            String content,
            String username,
            String password
            ) throws MessagingException
    {
        //第一步 利用Properties来设置Session,一般主要设置两个mail.smtp.host和mail.smtp.auth,第一个主要是设置邮件服务器名,第二个是设置口令true或者false
                Properties props = new Properties();
                props.put("mail.host", smtpHost);
                props.put("mail.transport.protocol", "smtp");
                props.put("mail.smtp.auth", "true");
                
                //第二步 利用Session.getInstance(Properties)启动一个与邮件服务器的会话
                SmtpAuth sa = new SmtpAuth();
                sa.setUserinfo(username, password);
                //Session session = Session.getInstance(props, sa);
                Session session = Session.getDefaultInstance(props, sa);
                session.setPasswordAuthentication(new URLName(smtpHost), sa.getPasswordAuthentication());
                session.setDebug(true);
                
                //第三步 根据获取的Session来传建一个消息Message
                MimeMessage message = new MimeMessage(session);
                
                //第四步 定义消息的发信人地址InternetAddress和消息的收信人地址。
                //发件人
                InternetAddress sendaddr = new InternetAddress(sender);
                message.setFrom(sendaddr);
                //收件人
                InternetAddress[] toaddrs = InternetAddress.parse(to);
                message.setRecipients(Message.RecipientType.TO, toaddrs);
                //抄送人
                InternetAddress[] ccaddrs = InternetAddress.parse(cc);
                message.setRecipients(Message.RecipientType.CC, ccaddrs);
                //密送人
                InternetAddress[] bccaddrs = InternetAddress.parse(bcc);
                message.setRecipients(Message.RecipientType.BCC, bccaddrs);
                //第五步 设置消息发送的主题、内容、时间
                message.setSubject(title);
                message.setText(content);
                message.setSentDate(new Date());
                //第六步 利用Message.saveChanges()来存储填写的邮件信息
                message.saveChanges();
                //第七步将该消息发送
                Transport.send(message);
    }
    
    
    public static void main(String[] args) 
    {
        try 
        {
            sendPlainTextEmailByAuth("smtp.163.com", "cac2020@163.com", "ssssss@qq.com", "", "cac2020@163.com", "测试一个纯文本邮件", "ssssss", "cac2020", "ffafasdfsdfsaf");
        } 
        catch (MessagingException e) 
        {
            e.printStackTrace();
        }
        
    }

}

(3)发送一封含图片的邮件

package mail;

import java.util.Date;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.URLName;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

/**
 * 邮件发送服务
 */
public class SendMailService
{

    
    /**
     * 发送内嵌图片邮件
     * @param smtpHost 邮件服务器
     * @param to 收件人(可以是多个,使用逗号分隔)
     * @param cc 抄送人(可以是多个,使用逗号分隔)
     * @param bcc密送人(可以是多个,使用逗号分隔)
     * @param sender发件人
     * @param title邮件标题
     * @param username邮箱用户名(一般是去掉@之前的那一部分)
     * @param password(邮箱密码)
     * @throws MessagingException
     */
    public static void sendImageEmail(String smtpHost,
            String to,
            String cc,
            String bcc,
            String sender,
            String title,
            String username,
            String password) throws MessagingException
    {
        Properties props = new Properties();
        props.put("mail.host", smtpHost);
        props.put("mail.transport.protocol", "smtp");
        props.put("mail.smtp.auth", "true");
        
        Session session = Session.getDefaultInstance(props);
        session.setDebug(true);
        Transport ts = session.getTransport();
        ts.connect(smtpHost, username, password);
        
        //创建含图片邮件
        MimeMessage msg = new MimeMessage(session);
        msg.setFrom(new InternetAddress(sender));
        msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
        msg.setRecipients(Message.RecipientType.CC, InternetAddress.parse(cc));
        msg.setRecipients(Message.RecipientType.BCC, InternetAddress.parse(bcc));
        msg.setSubject(title);
        msg.setSentDate(new Date());
        
        //邮件正文文本
        MimeBodyPart text = new MimeBodyPart();
        text.setContent("这是一封邮件正文带图片<img src='cid:576f707a5ba85.JPG'>的邮件", "text/html;charset=UTF-8");
        
        //邮件正文中的图片
        MimeBodyPart image = new MimeBodyPart();
        image.setContentID("576f707a5ba85.JPG");
        DataHandler dh = new DataHandler(new FileDataSource("src\\576f707a5ba85.JPG"));
        image.setDataHandler(dh);
        
        MimeMultipart mmp = new MimeMultipart();
        mmp.addBodyPart(text);
        mmp.addBodyPart(image);
        mmp.setSubType("related");
        
        msg.setContent(mmp);
        msg.saveChanges();

ts.sendMessage(msg, msg.getAllRecipients()); ts.close(); } }

(4)发送包含附件的图片

package mail;

import java.util.Date;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.URLName;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

/**
 * 邮件发送服务
 */
public class SendMailService
{

    /**
     * 发送含附件邮件
     * @param smtpHost 邮件服务器
     * @param to 收件人(可以是多个,使用逗号分隔)
     * @param cc 抄送人(可以是多个,使用逗号分隔)
     * @param bcc密送人(可以是多个,使用逗号分隔)
     * @param sender发件人
     * @param title邮件标题
     * @param username邮箱用户名(一般是去掉@之前的那一部分)
     * @param password(邮箱密码)
     * @throws MessagingException
     */
    public static void sendAttachEmail(String smtpHost,
            String to,
            String cc,
            String bcc,
            String sender,
            String title,
            String username,
            String password) throws MessagingException
    {
        Properties props = new Properties();
        props.put("mail.host", smtpHost);
        props.put("mail.transport.protocol", "smtp");
        props.put("mail.smtp.auth", "true");
        
        Session session = Session.getDefaultInstance(props);
        session.setDebug(true);
        Transport ts = session.getTransport();
        ts.connect(smtpHost, username, password);
        
        //创建含图片邮件
        MimeMessage msg = new MimeMessage(session);
        msg.setFrom(new InternetAddress(sender));
        msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
        msg.setRecipients(Message.RecipientType.CC, InternetAddress.parse(cc));
        msg.setRecipients(Message.RecipientType.BCC, InternetAddress.parse(bcc));
        msg.setSubject(title);
        msg.setSentDate(new Date());
        
        //邮件正文文本
        MimeBodyPart text = new MimeBodyPart();
        text.setContent("使用JavaMail创建的带附件的邮件", "text/html;charset=UTF-8");
        
        //邮件附件
        MimeBodyPart attach = new MimeBodyPart();
        DataHandler dh = new DataHandler(new FileDataSource("src\\576f707a5ba85.JPG"));
        attach.setDataHandler(dh);
        attach.setFileName(dh.getName());
        
        //创建个区块之间关系
        MimeMultipart mmp = new MimeMultipart();
        mmp.addBodyPart(text);
        mmp.addBodyPart(attach);
        mmp.setSubType("mixed");
        
        msg.setContent(mmp);
        msg.saveChanges();
        
        ts.sendMessage(msg, msg.getAllRecipients());
        ts.close();
    }
    

}

(5)发送包含内嵌图片和附件的复杂邮件

package mail;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.URLName;
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;

/**
 * 邮件发送服务
 */
public class SendMailService
{

    
    /**
     * 发送含附件邮件
     * @param smtpHost 邮件服务器
     * @param to 收件人(可以是多个,使用逗号分隔)
     * @param cc 抄送人(可以是多个,使用逗号分隔)
     * @param bcc密送人(可以是多个,使用逗号分隔)
     * @param sender发件人
     * @param title邮件标题
     * @param username邮箱用户名(一般是去掉@之前的那一部分)
     * @param password(邮箱密码)
     * @throws MessagingException
     * @throws IOException 
     * @throws FileNotFoundException 
     */
    public static void sendComplexEmail(String smtpHost,
            String to,
            String cc,
            String bcc,
            String sender,
            String title,
            String username,
            String password) throws MessagingException, FileNotFoundException, IOException
    {
        Properties props = new Properties();
        props.put("mail.host", smtpHost);
        props.put("mail.transport.protocol", "smtp");
        props.put("mail.smtp.auth", "true");
        
        Session session = Session.getDefaultInstance(props);
        session.setDebug(true);
        Transport ts = session.getTransport();
        ts.connect(smtpHost, username, password);
        
        //创建含图片邮件
        MimeMessage msg = new MimeMessage(session);
        msg.setFrom(new InternetAddress(sender));
        msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
        msg.setRecipients(Message.RecipientType.CC, InternetAddress.parse(cc));
        msg.setRecipients(Message.RecipientType.BCC, InternetAddress.parse(bcc));
        msg.setSubject(title);
        msg.setSentDate(new Date());
        
        //邮件正文文本
        MimeBodyPart text = new MimeBodyPart();
        text.setContent("测试<br/><img src='cid:1.PNG'>","text/html;charset=UTF-8");
        
        //图片
        MimeBodyPart image = new MimeBodyPart();
        image.setContentID("1.PNG");
        image.setDataHandler(new DataHandler(new FileDataSource("src\\1.PNG")));
        
        //附件1
        MimeBodyPart attach1 = new MimeBodyPart();
        DataHandler dh = new DataHandler(new FileDataSource("src\\1.rar"));
        attach1.setDataHandler(dh);
        attach1.setFileName(dh.getName());
        
        //附件2  注意附件名是中文名
        MimeBodyPart attach2 = new MimeBodyPart();
        DataHandler dh2 = new DataHandler(new FileDataSource("src\\测试中文附件名.rar"));
        attach2.setDataHandler(dh2);
        attach2.setFileName(MimeUtility.encodeText(dh2.getName()));
        
        //描述关系:正文和图片
        MimeMultipart mp1 = new MimeMultipart();
        mp1.addBodyPart(text);
        mp1.addBodyPart(image);
        mp1.setSubType("related");
        //将正文和图片组合作为一个整体 的正文内容
        MimeBodyPart content = new MimeBodyPart();
        content.setContent(mp1);
        
        //描述关系:正文和附件
        MimeMultipart mp2 = new MimeMultipart();
        mp2.addBodyPart(attach1);
        mp2.addBodyPart(attach2);
        mp2.addBodyPart(content);
        mp2.setSubType("mixed");
        
        //message设置邮件内容
        msg.setContent(mp2);
        msg.saveChanges();
        msg.writeTo(new FileOutputStream("E:\\MixedMail.eml"));
        
        ts.sendMessage(msg, msg.getAllRecipients());
        ts.close();
    }

}

 

 

 

 

四、使用java mail 接收邮件

基本步骤:

1 利用Properties创建一个属性,不需要设置任何属性,之间传递Session使用

2 Session.getDefaultInstance()获取一个邮件会话

3 使用该会话向某种提供者请求一个存储库,ss.getStore("pop3");获取一个Store

4 存储库向指定的邮件服务器建立连接

5 通过getFolder("INBOX"),获取该存储库中INBOX文件夹

6 打开INBOX文件夹

7 消息处理

8 关闭文件夹

9 关闭存储库

 

package mail;

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Enumeration;
import java.util.Properties;

import javax.mail.Folder;
import javax.mail.Header;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeUtility;

public class ReceiveMailService 
{

    public static void receiveMail(String popHost,    String username,String password) throws MessagingException, IOException
    {
        
        //1 利用Properties创建一个属性,不需要设置任何属性,之间传递Session使用
        Properties props = new Properties();
        //props.put("mail.host", smtpHost);
        //props.put("mail.smtp.auth", "true");
        //props.put("mail.transport.protocol", "smtp");
        //props.put("mail.transport.port", "25");
        props.put("mail.store.port", "pop3");
        
        //2 Session.getDefaultInstance()获取一个邮件会话
        Session session = Session.getDefaultInstance(props);
        //3 使用该会话向某种提供者请求一个存储库,ss.getStore("pop3"); 也可以是IMAP 获取一个Store
        Store store = session.getStore("pop3");
        //4 存储库向指定的邮件服务器建立连接
        store.connect(popHost, username, password);
        //5 通过getFolder("INBOX"),获取该存储库中INBOX文件夹
        Folder folder = store.getFolder("INBOX");
        //6 打开INBOX文件夹
        folder.open(Folder.READ_ONLY);
        //7 消息处理
        Message[] messages = folder.getMessages();
        for (int i = 0; i < messages.length; i++) 
        {
            System.out.println("------------Message--" + (i + 1) + "------------");
            // 解析地址为字符串 发件人
            String from = InternetAddress.toString(messages[i].getFrom());
            if (from != null) 
            {
                String cin = getChineseFrom(from);
                System.out.println("From:" + cin);
            }
            //回复给发件人
            String replyTo = InternetAddress.toString(messages[i].getReplyTo());
            if (replyTo != null)
            {
                String rest = getChineseFrom(replyTo);
                System.out.println("Reply To:" + rest);
               }
            //
            String to = InternetAddress.toString(messages[i].getRecipients(Message.RecipientType.TO));
            if (to != null)
            {
                String tos = getChineseFrom(to);
                System.out.println("To:" + tos);
            }
            //邮件主题
            String subject = messages[i].getSubject();
            if (subject != null)
            {
                System.out.println("Subject:" + subject);
            }
            //发送日期 
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Date sent = messages[i].getSentDate();
            if (sent != null)
            {
                System.out.println("Sent Date:" + sdf.format(sent));
            }
            //接收日期
            Date ress = messages[i].getReceivedDate();
            if (ress != null)
            {
                System.out.println("Receive Date:" + sdf.format(ress));
            }
               
            // 显示消息的所有首部信息
            Enumeration<Header> headers = messages[i].getAllHeaders();
            while(headers.hasMoreElements())
            {
                Header h=(Header)headers.nextElement();
                String res=h.getName();
                String val=h.getValue();
                System.out.println(res+":"+val);
            }
             System.out.println();
             //读取消息主题部分
             Object content = messages[i].getContent();
             System.out.println(content);
             //根据指定的编码格式读出内容
             Reader read = new InputStreamReader(messages[i].getInputStream());
             int a=0;
             while((a=read.read())!=-1)
             {
                 System.out.print((char)a);
             }
             //获取该消息的类型
             String type=messages[i].getContentType();
             String sender=InternetAddress.toString(messages[i].getFrom());
             System.out.println("Sender:"+sender);
             System.out.println("Content-type:"+type);
        }
        //8 关闭文件夹但不删除服务器上的消息 false代表不是删除
        folder.close(false);//当为true时会删掉已经标记为删除的邮件
        //9 关闭存储库
        store.close();
    }
    
    // 解决中文乱码问题
    public static String getChineseFrom(String res)
    {
        String from = res;
        try 
        {
            if (from.startsWith("=?GB") || from.startsWith("=?gb") || from.startsWith("=?UTF")) 
            {
                from = MimeUtility.decodeText(from);
            } 
            else 
            {
                from = new String(from.getBytes("ISO8859_1"), "GBK");
            }
        } 
        catch (Exception e) 
        {
            e.printStackTrace();
        }
        
        return from;
    }
    
    public static void main(String[] args)
    {
        try 
        {
            receiveMail("pop3.163.com", "cac2020", "fadgfjkssdfkasjg");
        } 
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

}

 

 

 

参考:

http://blog.csdn.net/ghsau/article/details/17839983

http://www.cnblogs.com/xdp-gacl/p/4216311.html

http://computerdragon.blog.51cto.com/6235984/1197390

http://blog.sina.com.cn/s/blog_67196ddc0101fdrn.html

posted @ 2016-10-25 16:38  cac2020  阅读(548)  评论(0编辑  收藏  举报