JavaMail

JavaMail学习

发送文本、发送html模板、群发、发送附件

预备

POM

<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>mail</artifactId>
    <version>1.4.7</version>
</dependency>

开始

javax.mail.Session:上下文环境信息,如服务器的主机名、端口号、协议名称等  
javax.mail.Message:邮件模型,发送邮件和接收邮件的媒介,封装了邮件的信息,如发件人、收件人、邮件标题、邮件内容等  
javax.mail.Transport:连接邮件SMTP服务器,发送邮件  
javax.mail.Store:连接邮件POP3、IMAP服务器,收取邮件  

定义发送者信息mail.properties

#Sender Auth
username=发送者邮箱账户
password=发送者邮箱密码

#Sender Info
from.address=发送者邮箱地址

#Sender Server(这里测试发送者使用QQ邮箱)
mail.smtp.host=smtp.qq.com
mail.smtp.auth=true
mail.smtp.port=587

定义配置读取类MailConfig.java

package com;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class MailConfig {

    private static Properties properties;

    public static Properties getProperties() {
        if (null == properties) {
            properties = new Properties();
            InputStream stream = MailDemo.class.getClassLoader().getResourceAsStream("mail.properties");
            try {
                properties.load(stream);
                stream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return properties;
    }

    public static String getHost() {
        return getProperties().getProperty("mail.smtp.host");
    }

    public static String getPort() {
        return getProperties().getProperty("mail.smtp.port");
    }

    public static String getUserName() {
        return getProperties().getProperty("username");
    }

    public static String getPassword() {
        return getProperties().getProperty("password");
    }

    public static String getFromAddress() {
        return getProperties().getProperty("from.address");
    }

    public static boolean getAuth() {
        return "true".equalsIgnoreCase(getProperties().getProperty("mail.smtp.auth"));
    }

}

定义认证类DemoAuthenticator.java

/**
 * 认证信息
 */
package com;

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

public class DemoAuthenticator extends Authenticator {
    
    //用户名
    private String userName ;
    //用户密码
    private String password ;

    public DemoAuthenticator() {
    }

    public DemoAuthenticator(String username, String password) {
        this.userName = username;
        this.password = password;
    }

    @Override
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(userName, 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;
    }
}

定义邮件内容类MailDetail.java

/***
 * 邮件详情
 */

package com;

public class MailDetail {

    // 邮件接收者的地址
    private String toAddress;
    // 邮件主题
    private String subject;
    // 邮件的文本内容
    private String content;
    // 邮件附件的文件名
    private String[] attachFileNames;

    public String getToAddress() {
        return toAddress;
    }

    public void setToAddress(String toAddress) {
        this.toAddress = toAddress;
    }

    public String getSubject() {
        return subject;
    }

    public void setSubject(String subject) {
        this.subject = subject;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public String[] getAttachFileNames() {
        return attachFileNames;
    }

    public void setAttachFileNames(String[] attachFileNames) {
        this.attachFileNames = attachFileNames;
    }
}

定义发送器类

package com;

import java.io.IOException;
import java.util.Date;
import java.util.Properties;

import javax.mail.Address;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
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;

/**
 * 简单邮件(不带附件的邮件)发送器
 */
public class SimpleMailSender {

    /**
     * 以文本格式发送邮件
     * 
     * @param detail
     *            待发送的邮件的信息
     */
    public static boolean sendTextMail(MailDetail detail) {
        // 判断是否需要身份认证
        DemoAuthenticator authenticator = null;
        Properties pro = MailConfig.getProperties();
        System.out.println("是否需要验证:" + (MailConfig.getAuth() == true));
        if (MailConfig.getAuth()) {
            // 如果需要身份认证,则创建一个密码验证器
            authenticator = new DemoAuthenticator(MailConfig.getUserName(), MailConfig.getPassword());
        }
        // 根据邮件会话属性和密码验证器构造一个发送邮件的session
        Session sendMailSession = Session.getDefaultInstance(pro, authenticator);
        try {
            // 根据session创建一个邮件消息
            Message mailMessage = new MimeMessage(sendMailSession);
            // 创建邮件发送者地址
            Address from = new InternetAddress(MailConfig.getFromAddress());
            // 设置邮件消息的发送者
            mailMessage.setFrom(from);
            // 创建邮件的接收者地址,并设置到邮件消息中
            Address to = new InternetAddress(detail.getToAddress());
            mailMessage.setRecipient(Message.RecipientType.TO, to);
            //循环add可以实现群发
            //mailMessage.addRecipient(Message.RecipientType.TO, to);
            // 设置邮件消息的主题
            mailMessage.setSubject(detail.getSubject());
            // 设置邮件消息发送的时间
            mailMessage.setSentDate(new Date());
            // 设置邮件消息的主要内容
            String mailContent = detail.getContent();

            mailMessage.setText(mailContent);
            mailMessage.saveChanges();
            // 发送邮件方式一
            /*
             * mailMessage.saveChanges(); // implicit with send() Transport
             * transport = sendMailSession.getTransport("smtp");
             * transport.connect(MailProperties.getHost(),
             * MailProperties.getUserName(), MailProperties.getPassword());
             * transport.sendMessage(mailMessage,
             * mailMessage.getAllRecipients()); transport.close();
             */
            // 发送邮件方式二
            Transport.send(mailMessage);
            return true;
        } catch (MessagingException ex) {
            ex.printStackTrace();
        }
        return false;
    }

    /**
     * 以HTML格式发送邮件
     * 
     * @param detail
     *            待发送的邮件信息
     */
    public static boolean sendHtmlMail(MailDetail detail) {
        // 判断是否需要身份认证
        DemoAuthenticator authenticator = null;
        Properties pro = MailConfig.getProperties();
        // 如果需要身份认证,则创建一个密码验证器
        if (MailConfig.getAuth()) {
            authenticator = new DemoAuthenticator(MailConfig.getUserName(), MailConfig.getPassword());
        }
        // 根据邮件会话属性和密码验证器构造一个发送邮件的session
        Session sendMailSession = Session.getDefaultInstance(pro, authenticator);
        try {
            // 根据session创建一个邮件消息
            Message mailMessage = new MimeMessage(sendMailSession);
            // 创建邮件发送者地址
            Address from = new InternetAddress(MailConfig.getFromAddress());
            // 设置邮件消息的发送者
            mailMessage.setFrom(from);
            // 创建邮件的接收者地址,并设置到邮件消息中
            Address to = new InternetAddress(detail.getToAddress());
            // Message.RecipientType.TO属性表示接收者的类型为TO
            mailMessage.setRecipient(Message.RecipientType.TO, to);
            // 设置邮件消息的主题
            mailMessage.setSubject(detail.getSubject());
            // 设置邮件消息发送的时间
            mailMessage.setSentDate(new Date());
            // MiniMultipart类是一个容器类,包含MimeBodyPart类型的对象
            Multipart mainPart = new MimeMultipart();
            // 创建一个包含HTML内容的MimeBodyPart
            BodyPart html = new MimeBodyPart();
            // 设置HTML内容
            html.setContent(detail.getContent(), "text/html; charset=utf-8");
            mainPart.addBodyPart(html);
            // 添加附件
            MimeBodyPart mimeBodyPart = new MimeBodyPart();
            mimeBodyPart.attachFile("C:\\Apps\\QQ\\Plugin\\Com.Tencent.QQVip\\Misc\\CustomFont\\101\\qie17b.png");
            mimeBodyPart.setFileName(MimeUtility.encodeWord("测试附件.png"));
            mainPart.addBodyPart(mimeBodyPart);
            // 将MiniMultipart对象设置为邮件内容
            mailMessage.setContent(mainPart);
            mailMessage.saveChanges();
            // 发送邮件
            Transport.send(mailMessage);
            return true;
        } catch (MessagingException ex) {
            ex.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return false;
    }
}

测试Demo

public static void main(String[] args) {

        MailDetail detail = new MailDetail();
        detail.setToAddress(接收者邮箱地址);
        detail.setSubject("测试邮箱标题WithHtml");
        detail.setContent(readTemplate());

        //发送文本
        boolean result = SimpleMailSender.sendTextMail(detail);
        //发送html格式
        //boolean result = SimpleMailSender.sendHtmlMail(detail);
        // 发送文体格式
        if(result){
            System.out.println("发送成功...");
        }else{
            System.out.println("发送失败...");
        }
    }

附加(读取文本)

    private static String readTemplate() {
        StringBuilder builder = new StringBuilder();
        String encoding = "UTF-8";
        InputStreamReader read = null;
        try {
            read = new InputStreamReader(MailDemo.class.getClassLoader().getResourceAsStream("temp.html"), encoding); 
            BufferedReader bufferedReader = new BufferedReader(read);
            String lineTxt = null;
            while ((lineTxt = bufferedReader.readLine()) != null) {
                builder.append(lineTxt);
            }
            read.close();
        } catch (Exception e) {
            System.out.println("读取文件内容出错");
            e.printStackTrace();
        }
        return builder.toString();
    }

posted @ 2018-04-06 20:04  HugoRun  阅读(170)  评论(0编辑  收藏  举报