javaMail

            javaMail

   要自己写程序发送和接收邮件,可以直接采用Socket编程连接上远程的邮件服务器,然后按照邮件协议与邮件服务器进行交互,涉及较多细节。另外,要想自己编程创建出复杂的MIME格式的邮件,是一件非常困难和麻烦的事情。JavaMail 是Sun公司为方便Java开发人员在应用程序中实现邮件发送和接收功能而提供的一套标准开发包,它支持一些常用的邮件协议,如SMTP、POP3、IMAP。
开发人员使用JavaMail API编写邮件处理软件时,无须考虑邮件协议的底层实施细节,只要调用JavaMail开发包中相应的API类就可以了。
JavaMail 也提供了能够创建出各种复杂MIME格式的邮件内容的相关API.

JavaMail API按其功能划分通常可分为如下三大类:
创建和解析邮件内容的API :Message类是创建和解析邮件的核心API,它的实例对象代表一封电子邮件。
发送邮件的API:Transport类是发送邮件的核心API类,它的实例对象代表实现了某个邮件发送协议的邮件发送对象,例如SMTP协议。
接收邮件的API:Store类是接收邮件的核心API类,它的实例对象代表实现了某个邮件接收协议的邮件接收对象,例如POP3协议。
Session类
Session类用于定义整个应用程序所需的环境信息,以及收集客户端与邮件服务器建立网络连接的会话信息,如邮件服务器的主机名、端口号、采用的邮件发送和接收协议等。Session对象根据这些信息构建用于邮件收发的Transport和Store对象,以及为客户端创建Message对象时提供信息支持。

使用JavaMail发送一封简单的邮件:
创建包含邮件服务器的网络连接信息的Session对象。
创建代表邮件内容的Message对象。
创建Transport对象、连接服务器、发送Message、关闭连接。

复杂邮件内容的组织结构:

RFC822邮件格式:
MIME协议----MIME,英文全称为“Multipurpose Internet Mail Extensions”,即多用途互联网邮件扩展,是目前互联网电子邮件普遍遵循的邮件技术规范,在MIME出现之前,互联网电子邮件主要遵循由RFC 822所制定的标准,电子邮件一般只用来传递基本的ASCII码文本信息,MIME在 RFC 822的基础上对电子邮件规范做了大量的扩展,引入了新的格式规范和编码方式,在MIME的支持下,图像、声音、动画等二进制文件都可方便的通过电子邮件来进行传递,极大地丰富了电子邮件的功能。目前互联网上使用的基本都是遵循MIME规范的电子邮件。  

 

multipart/mixed类型
     如果一封邮件中含有附件,那邮件的Content-Type域中必须定义multipart/mixed类型,邮件通过multipart/mixed类型中定义的boundary标识将附件内容同邮件其它内容分成不同的段。基本格式如下:
     Content-Type: multipart/mixed;
                   boundary="{分段标识}"
  * multipart/alternative类型
     MIME邮件可以传送超文本内容,但出于兼容性的考虑,一般在发送超文本格式内容的同时会同时发送一个纯文本内容的副本,如果邮件中同时存在纯文本和超文本内容,则邮件需要在Content-Type域中定义multipart/alternative类型,邮件通过其boundary中的分段标识将纯文本、超文本和邮件的其它内容分成不同的段。基本格式如下:
      Content-Type: multipart/alternative;
                   boundary="{分段标识}"
multipart/related类型
    MIME邮件中除了可以携带各种附件外,还可以将其它内容以内嵌资源的方式存储在邮件中。比如我们在发送html格式的邮件内容时,可能使用图像作为html的背景,html文本会被存储在alternative段中,而作为背景的图像则会存储在multipart/related类型定义的段中。基本格式如下:
     Content-Type: multipart/related;
                   type="multipart/alternative";
                   boundary="{分段标识}"
MimeMessage类表示整封邮件。
MimeBodyPart类表示邮件的一个MIME消息。
MimeMultipart类表示一个由多个MIME消息组合成的组合MIME消息。

 

邮件结构

 

package cn.itcast.mail;

import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.Date;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Authenticator;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
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;
import javax.mail.internet.MimeMessage.RecipientType;

public class Mail2 {

    // 邮件发送参数信息
    static Properties prop = new Properties();
    
    static String user = "itcast";
    static String pwd = "888";
    
    // 初始化参数
    static {
        // 协议
        prop.put("mail.transport.protocol", "smtp");
        // 端口
        prop.put("mail.smtp.port", "25");
        // 主机
        prop.put("mail.smtp.host", "localhost");
        // 认证
        prop.put("mail.smtp.auth", "true");
        // 调试
        prop.put("mail.debug", "true");
    }
    
    //1. 发送邮件
    public static void sendEmail() throws Exception {
        //创建会话对象
        Session session = Session.getDefaultInstance(prop, new MyAuthenticator(user,pwd));
        //邮件对象
        MimeMessage message = new MimeMessage(session);
        message.setFrom(new InternetAddress("itcast@it.com"));
        message.setRecipient(RecipientType.CC, new InternetAddress("yuanjie@it.com"));
        message.setSentDate(new Date());
        message.setSubject("踢足球..............");
        message.setText("那些人去???");
        message.saveChanges();
        
        // 发送
        Transport.send(message);
    }
    //2. 发送html邮件
    public static void sendHtmlEmail() throws Exception {
        //创建会话对象
        Session session = Session.getDefaultInstance(prop, new MyAuthenticator(user,pwd));
        //邮件对象
        MimeMessage message = new MimeMessage(session);
        message.setFrom(new InternetAddress("itcast@it.com"));
        message.setRecipient(RecipientType.CC, new InternetAddress("yuanjie@it.com"));
        message.setSentDate(new Date());
        message.setSubject("踢足球..............");
        message.setContent("<a href='http://www.baidu.com'>度娘</a>", "text/html;charset=GBK");
        message.saveChanges();
        // 发送
        Transport.send(message);
    }
    //3. 发送html + img 邮件
    public static void sendHtmlAndImgEmail() throws Exception {
        // 会话对象
        Session session = Session.getDefaultInstance(prop, new MyAuthenticator(user, pwd));
        // 邮件对象
        MimeMessage message = new MimeMessage(session);
        message.setFrom(new InternetAddress("itcast@it.com"));
        message.setRecipient(RecipientType.TO, new InternetAddress("yuanjie@it.com"));
        message.setSubject("图片");
        message.setSentDate(new Date());
        
        // 设置多功能邮件
        MimeMultipart multipart = new MimeMultipart("related");
        message.setContent(multipart);
        
        // 邮件内容: html + 文本
        MimeBodyPart body = new MimeBodyPart();
        // 邮件“内嵌资源”
        MimeBodyPart source = new MimeBodyPart();
        
        // 添加邮件内容,到多功能用途邮件
        multipart.addBodyPart(body);
        multipart.addBodyPart(source);
        
        // 设置资源
        DataSource ds = new FileDataSource(Mail2.class.getResource("1.jpg").getPath());
        DataHandler handler = new DataHandler(ds);
        source.setDataHandler(handler);
        // 设置资源id,供邮件内容引用
        source.setContentID("1.jpg");
        
        // 设置内容
        body.setContent("<img src='cid:1.jpg' />好好好", "text/html;charset=UTF-8");
        
        // 保存邮件、发送
        message.saveChanges();
        Transport.send(message);
    }
    
    //4. 发送html + img + 附件邮件
    public static void sendHtmlWithImgAndAttacheEmail() throws Exception {
        // 会话对象
        Session session = Session.getDefaultInstance(prop, new MyAuthenticator(user, pwd));
        // 邮件对象
        MimeMessage message = new MimeMessage(session);
        message.setFrom(new InternetAddress("itcast@it.com"));
        message.setRecipient(RecipientType.TO, new InternetAddress("yuanjie@it.com"));
        message.setSubject("图片");
        message.setSentDate(new Date());
        
        /*********设置总邮件块***********/
        MimeMultipart mix = new MimeMultipart("mixed");
        message.setContent(mix);
        // 左右快
        MimeBodyPart left = new MimeBodyPart();
        MimeBodyPart right = new MimeBodyPart();
        // 添加
        mix.addBodyPart(left);
        mix.addBodyPart(right);
        
        // 设置右边: 附件(中文:1. 路径解码; 2. 通过setFileName设置文件编码为gbk)
        DataSource fileDs = new FileDataSource(URLDecoder.decode(Mail2.class.getResource("用户须知.doc").getPath(), "UTF-8"));
        DataHandler fileHandler = new DataHandler(fileDs);
        right.setDataHandler(fileHandler);
        // 设置文件
        right.setFileName(MimeUtility.encodeText("用户须知.doc"));
        
        
        // 设置多功能邮件
        MimeMultipart multipart = new MimeMultipart("related");
        // 设置左边块: html + 文本 + 资源
        left.setContent(multipart);
        
        // 邮件内容: html + 文本
        MimeBodyPart body = new MimeBodyPart();
        // 邮件“内嵌资源”
        MimeBodyPart source = new MimeBodyPart();
        
        // 添加邮件内容,到多功能用途邮件
        multipart.addBodyPart(body);
        multipart.addBodyPart(source);
        
        // 设置资源
        DataSource ds = new FileDataSource(Mail2.class.getResource("1.jpg").getPath());
        DataHandler handler = new DataHandler(ds);
        source.setDataHandler(handler);
        // 设置资源id,供邮件内容引用
        source.setContentID("1.jpg");
        
        // 设置内容
        body.setContent("<img src='cid:1.jpg' />好好好", "text/html;charset=UTF-8");
        
        // 保存邮件、发送
        message.saveChanges();
        Transport.send(message);
    }
    
    
    // 认证
    static class MyAuthenticator extends Authenticator{
        private String user;
        private String pwd;
        public MyAuthenticator(String user, String pwd) {
            super();
            this.user = user;
            this.pwd = pwd;
        }
        public MyAuthenticator() {}
        
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(user, pwd);
        }
    }
    
    
    public static void main(String[] args) throws Exception {
//        sendEmail();
//        sendHtmlEmail();
//        sendHtmlAndImgEmail();
        sendHtmlWithImgAndAttacheEmail();
    }
}


















 

 

 




 

posted @ 2017-11-09 16:04  minqing456  阅读(121)  评论(0)    收藏  举报