javamail模拟邮箱功能发送电子邮件-中级实战篇【新增附件发送方法】(javamail API电子邮件实例)

来源:互联网 发布:你的网络被运营商劫持 编辑:程序博客网 时间:2024/05/21 06:43

JavaMail jar包下载地址:http://java.sun.com/products/javamail/downloads/index.html

  此篇是紧随上篇文章而封装出来的,阅读本篇章建议先阅读上一篇 –> javamail模拟邮箱功能发送电子邮件-基础实战篇

  上一篇章简单讲解了javamail发送邮件的基本基础和用到的几个类,并且所有初始化和发送方法都封装在一个类里面(为了代码方便演示),本章节将对各个模块进行拆分和优化,并且引入附件发送的方法

  要想邮件发送附件,就要引入两个新类 Multipart 和 BodyPart 两类

Multipart(报文部件容器) 实则为一个报文容器,而邮件消息 Msage 是由各个子报文 BdyPart(报文单元部件) 类组成

  由此可见所有邮件消息都可由这两类来实现,接下来的演示发送HTML(兼并了普通Text格式)内容方法是所谓的简单的模式,因为他只有正文部分,无需多个部件来组合,而附件采纳了这两类,我们可以把包涵附件的邮件拆分为两个部件来理解,即:正文(邮件内容)部件、附件(邮件附加文件)两个部件。

示例结构:

  本篇示例代码分了3类(其实可以说是2类,因为测试test类只有一个main方法来调用邮件发送方法)

EmailEntity 类 邮件基础父类,两个私有属性(发件地址,发件密码),继承了Authenticator自动校验类(方便自动校验) 
EmailServiceEnity 类 邮件服务支持类,继承邮件基础父类,并声明其他必要的私有属性,封装邮件发送方法
TestEmailFunction 类 邮件测试发送类,简单的main方法里面初始化一个服务支持类,并调用两个发送方法


实例代码演示:

  ****复制此三个类可直接跑测试****注释部分我尽可能详细讲解每个方法的作用****

EmailEntity 类

package com.cplatform.movie.back.javamail;import javax.mail.Authenticator;import javax.mail.PasswordAuthentication;/** * 邮件基础实体类 */public class EmailEntity extends Authenticator {    /**     * 用户名(登录邮箱)     */    protected static String username;    /**     * 密码     */    protected static String password;    /**     * 初始化邮箱地址和密码     * @param username 邮箱     * @param password 密码     */    public EmailEntity(String username, String password) {        EmailEntity.username = "这里填写发件箱地址";        EmailEntity.password = "这里填写发件箱密码";    }    /**     * 重写自我检验方法     */    @Override    protected PasswordAuthentication getPasswordAuthentication() {        return new PasswordAuthentication(username, password);    }    String getPassword() {        return password;    }    String getUsername() {        return username;    }    public void setPassword(String password) {        EmailEntity.password = password;    }    public void setUsername(String username) {        EmailEntity.username = username;    }}

EmailServiceEnity 类

package com.cplatform.movie.back.javamail;import java.io.File;import java.io.UnsupportedEncodingException;import java.util.Properties;import javax.activation.DataHandler;import javax.activation.FileDataSource;import javax.mail.BodyPart;import javax.mail.Message;import javax.mail.MessagingException;import javax.mail.Multipart;import javax.mail.NoSuchProviderException;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 com.cplatform.movie.back.javamail.SimpleEmailFunction.MyAuthenricator;import com.sun.xml.internal.messaging.saaj.packaging.mime.internet.MimeUtility;/** * 邮件服务支持类 */public class EmailServiceEnity extends EmailEntity{    // java.util.propertis 类    private transient Properties props;    // 一个邮件会话    private transient Session session;    // 邮件消息    private transient MimeMessage message;    // 邮件内容格式    private final String CONTENT_TYPE_HTML = "text/html;charset=utf-8";    // 端口号     private final static int MAIL_PORT = 25;    // 邮箱服务器列表    private String stmpHostPort;    // 邮件传输对象    private Transport transport;    // 邮件发送内容    private String content;    /**     * 实参构造     * @param  mailToaddress  收件人地址,多个以逗号隔开     * @param  content               邮件内容     * @throws MessagingException      * @throws UnsupportedEncodingException      */    public EmailServiceEnity(String mailToaddress, String content) throws UnsupportedEncodingException, MessagingException {        super(username, password);        this.content = content;        this.session = this.initSession();        this.message = this.initMessage(this.getSession(), mailToaddress);        this.transport = this.initTransport(this.getSession());    }    /**     * 根据发件人地址获取邮件服务器主机地址     * @param username    发件人邮件地址     * @return     */    public String getStmpHostP(String username) {        return "smtp." + username.split("@")[1];    }    /**     * 初始化perps文件     * @return     */    public Properties initPrope() {        // 初始化props文件        props = new Properties();        props.setProperty("mail.transport.protocol", "smtp");//发送邮件协议        props.put("mail.smtp.auth", "true");        //需要验证        props.put("mail.smtp.host", this.getStmpHostP(username));    //服务器地址          return props;    }    /**     * 初始化session会话     * @return     */    public Session initSession() {        session = Session.getInstance(this.initPrope(),new MyAuthenricator(username, password));        session.setDebug(true);        return session;    }    /**     * 初始化Message消息     * @param session     * @return     * @throws MessagingException     * @throws UnsupportedEncodingException     */    public MimeMessage initMessage(Session session, String mailToaddress) throws MessagingException, UnsupportedEncodingException {        message = new MimeMessage(session);        // 设置发件人地址        message.setFrom(new InternetAddress(username, "要显示的发件人名称"));        // 设置邮件主题        message.setSubject("主题:默认主题");        // 设置邮件发送内容和内容的content-type        message.setContent(content.toString(),this.CONTENT_TYPE_HTML);        // 设置邮件接收人地址        String [] address = mailToaddress.split(",");        for(int i=0; i<address.length; i++) {            // addRecipient(该方法为添加收件人列表,参数一为类型:TO-收件人,CC-抄送,参数二为一个邮件地址)            message.addRecipient(Message.RecipientType.TO, new InternetAddress(address[i].trim()));            // 下面方法为传递一个收件地址字符串 (二者方法任选其一即可)             message.addRecipients(Message.RecipientType.CC, address[i].trim());        }        return message;    }    /**     * 初始化Transport     * @param session     * @return     * @throws NoSuchProviderException     */    public Transport initTransport(Session session) throws NoSuchProviderException {        transport = session.getTransport();         return transport;    }    /**     * 发送HTML内容邮件 (包括TEXT格式)     * @throws MessagingException      */    public void sendHtmlOrText() throws MessagingException {        this.send();    }    /**     * 附件发送      * @param file        java.io.File     * @param fileName    附件名     * @throws MessagingException     * @throws UnsupportedEncodingException     */    public void sendFile(File file, String fileName) throws MessagingException, UnsupportedEncodingException {        // 获得Message实例        Message message = this.getMessage();        // 创建multipart容器用来容纳bodyPart(部件)        Multipart multipart = new MimeMultipart();        /**         * 创建一个BodyPart内容报文         * 每个消息都有多个部分组成,每个部分是一个BodyPart报文部分,多个BodyPart部分又同时组成一个Multipart的容器         */        BodyPart messageBodyPart = new MimeBodyPart();        // 设置该报文的内容        messageBodyPart.setContent(this.content,this.CONTENT_TYPE_HTML);        // 添加bodyPart报文部分到multiPart容器        multipart.addBodyPart(messageBodyPart);        // 创建一个附件报文        messageBodyPart = new MimeBodyPart();        // 文件源        FileDataSource fds = new FileDataSource(file);        // 设置邮件的内含附件 (设置数据源为复件)        messageBodyPart.setDataHandler(new DataHandler(fds));        // 设置附件的文件名,需进行编码,否则文件名会乱码        messageBodyPart.setFileName(MimeUtility.encodeText(fileName));        // 添加到容器        multipart.addBodyPart(messageBodyPart);        // 添加报文容器到消息实例        message.setContent(multipart);        // 发送消息        this.send();    }    /**     * 发送     * 推荐使用方法一,因为方法二如果收件人为多个的话,会为每个人都打开一个Transport通道再关闭     * 而方法一在发送过程中一直保持连接通常,所有操作完成后才关闭     * @throws MessagingException     */    public void send() throws MessagingException {        // 方法一        this.getTransport().connect();        this.getTransport().sendMessage(message, message.getAllRecipients());        this.getTransport().close();        // 方法二        // Transport.send(this.getMessage());    }    /***************** 提供必要的get set方法支持  ************飘逸的分割线****************/    public Session getSession() {        return session;    }    public void setSession(Session session) {        this.session = session;    }    public MimeMessage getMessage() {        return message;    }    public void setMessage(MimeMessage message) {        this.message = message;    }    public Properties getProps() {        return props;    }    public  String getContentTypeHtml() {        return CONTENT_TYPE_HTML;    }    public static int getMailPort() {        return MAIL_PORT;    }    public String getStmpHostPort() {        return stmpHostPort;    }    public void setStmpHostPort(String stmpHostPort) {        this.stmpHostPort = stmpHostPort;    }    public Transport getTransport() {        return transport;    }    public void setTransport(Transport transport) {        this.transport = transport;    }    public void setProps(Properties props) {        this.props = props;    }    public String getContent() {        return content;    }    public void setContent(String content) {        this.content = content;    }}

TestEmailFunction 类

package com.cplatform.movie.back.javamail;import java.io.File;import java.io.UnsupportedEncodingException;import javax.mail.MessagingException;public class TestEmailFunction {    public static void main(String[] args) {        EmailServiceEnity e;        // 多个收件人中间以逗号间隔        String mailToaddress = "418874847@qq.com,12450374@qq.com";        // 正文(内容)部分        String content = "点击进入» <a href='http://www.cnblogs.com/liuyitian'>刘一天的博客</a>";        try {            e = new EmailServiceEnity(mailToaddress, content);            e.sendHtmlOrText(); // 测试HTML文本            /**             * 切勿使用同一个EmailServiceEnity实例来发送不同内容,如有需要就再初始化一个新实例(否则附件发送失败且乱码)             * 因为每个实例在发送完邮件后就会关闭Transport             */            e = new EmailServiceEnity(mailToaddress, content);            // 传入一个绝对位置的文件路径            File file = new File("d:/data/adimg/20141022/09/ad_20141022094708943.jpg");            e.sendFile(file,"测试复件.jpg"); // 测试复件发送        } catch (UnsupportedEncodingException e1) {            e1.printStackTrace();        } catch (MessagingException e1) {            e1.printStackTrace();        }    }}

本章小结:

对代码进行模块化,分为实体类和业务类
利用继承,来共享父类的属性
简单责任原则,业务类里面能拆分的功能都进行拆分,各负其责,方便调试
复用性,本章体现在邮件的发送功能,真正实现发送功能的是send方法
其他细节:(附件编码问题,正文格式声明,设置收件人方法【多种】)
未涉及:邮件协议

阅读全文
0 0
原创粉丝点击