Java Mail 发送邮件

详细Spring如何进行邮件发送

本文由乐字节Java架构课程独家赞助播出

发送普通文本的邮件

package com.xxxx.mail;import javax.activation.DataHandler;import javax.activation.FileDataSource;import javax.mail.*;import javax.mail.internet.*;import java.io.UnsupportedEncodingException;import java.util.Date;import java.util.Properties;/** * 发送普通文本的邮件 */public class MailTest01 {    public static void main(String[] args) throws Exception {        // 定义邮箱服务器配置        Properties prop = new Properties();        // 设置邮件服务器主机名 (163 邮件服务器地址:"mail.smtp.host"  "smtp.163.com")        prop.setProperty("mail.smtp.host", "smtp.163.com");        // 设置邮件服务器的端口        prop.setProperty("mail.smtp.port", "25");        // 设置邮件服务器认证属性 (设置为true表示发送服务器需要身份验证)        prop.setProperty("mail.smtp.auth", "true");        // 某些邮箱服务器要求 SMTP 连接需要使用 SSL 安全认证        // prop.setProperty("mail.smtp.port", "465");        // prop.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");        // prop.setProperty("mail.smtp.socketFactory.fallback", "false");        // prop.setProperty("mail.smtp.socketFactory.port", "465");        // 使用JavaMail发送邮件的5个步骤        // 1. 创建session        Session session = Session.getInstance(prop);        // 开启Session的debug模式,这样就可以查看到程序发送Email的运行状态        session.setDebug(true);        // 2. 通过session得到transport对象        Transport ts = session.getTransport();        // 3. 使用邮箱的用户名和密码连上邮件服务器(用户名只需写@前面的即可,密码是指授权码)        ts.connect("smtp.163.com", "用户名", "密码");        // 4. 创建邮件        // 发送普通文本的邮件        Message message = createSimpleTxtMail(session);                // 5. 发送邮件        ts.sendMessage(message, message.getAllRecipients());        // 关闭transport对象        ts.close();    }    /**     * 普通文本邮件     *      创建一封只包含文本的邮件     * @param session     * @return     */    public static MimeMessage createSimpleTxtMail(Session session) throws MessagingException {        // 创建邮件对象        MimeMessage message = new MimeMessage(session);        // 设置邮件的发件人的邮箱地址        message.setFrom(new InternetAddress("发件人的邮箱地址"));        // 设置邮件的收件人的邮箱地址 (现在发件人和收件人是一样的,那就是自己给自己发)        message.setRecipient(Message.RecipientType.TO, new InternetAddress("收件人的邮箱地址"));        // 发送给多个收件人        // message.setRecipients(Message.RecipientType.TO, new InternetAddress[] {});        // Cc: 抄送(可选)        // message.setRecipient(MimeMessage.RecipientType.CC, new InternetAddress(""));        // Bcc: 密送(可选)        // message.setRecipient(MimeMessage.RecipientType.BCC, new InternetAddress(""));        // 邮件的主题        message.setSubject("测试文本邮件");        // 设置发送日期        message.setSentDate(new Date());        // 邮件的文本内容 (setText():纯文本内容)        message.setText("你好,这是一封测试邮件!");        // 返回创建好的邮件对象        return message;    }}

效果如下:

![]()

发送HTML内容的邮件

package com.xxxx.mail;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.internet.InternetAddress;import javax.mail.internet.MimeBodyPart;import javax.mail.internet.MimeMessage;import javax.mail.internet.MimeMultipart;import java.util.Date;import java.util.Properties;/** * 发送HTML内容的邮件 */public class MailTest02 {    public static void main(String[] args) throws Exception {        // 定义邮箱服务器配置        Properties prop = new Properties();        // 设置邮件服务器主机名 (163 邮件服务器地址:"mail.smtp.host"  "smtp.163.com")        prop.setProperty("mail.smtp.host", "smtp.163.com");        // 设置邮件服务器的端口        prop.setProperty("mail.smtp.port", "25");        // 设置邮件服务器认证属性 (设置为true表示发送服务器需要身份验证)        prop.setProperty("mail.smtp.auth", "true");        // 使用JavaMail发送邮件的5个步骤        // 1. 创建session        Session session = Session.getInstance(prop);        // 开启Session的debug模式,这样就可以查看到程序发送Email的运行状态        session.setDebug(true);        // 2. 通过session得到transport对象        Transport ts = session.getTransport();        // 3. 使用邮箱的用户名和密码连上邮件服务器(用户名只需写@前面的即可,密码是指授权码)        ts.connect("smtp.163.com", "用户名", "密码");        // 4. 创建邮件        // 发送HTML内容的邮件        Message message = createHtmlMail(session);               // 5. 发送邮件        ts.sendMessage(message, message.getAllRecipients());        // 关闭transport对象        ts.close();    }    /**     * HTML内容邮件     *      创建一封包含html内容的邮件     */    public static MimeMessage createHtmlMail(Session session) throws Exception {        // 创建邮件对象        MimeMessage message = new MimeMessage(session);        // 设置邮件的发件人的邮箱地址        message.setFrom(new InternetAddress("发件人的邮箱地址"));        // 设置邮件的收件人的邮箱地址 (现在发件人和收件人是一样的,那就是自己给自己发)        message.setRecipient(Message.RecipientType.TO, new InternetAddress("收件人的邮箱地址"));        // 邮件的主题        message.setSubject("测试HTML邮件");        // 设置发送日期        message.setSentDate(new Date());        // 准备邮件数据        /**         * Message表示一个邮件,messgaes.getContent()返回一个Multipart对象。         * 一个Multipart对象包含一个或多个BodyPart对象,来组成邮件的正文部分(包括附件)。         */        // 创建多媒体对象        MimeMultipart multipart = new MimeMultipart();        // 创建邮件体对象        MimeBodyPart bodyPart = new MimeBodyPart();        // 设置HTML内容        StringBuffer sb = new StringBuffer();        sb.append("<html><body><a href='http://www.baidu.com'>百度一下</a></body></html>");        bodyPart.setContent(sb.toString(), "text/html;charset=UTF-8");        // 将bodyPart对象设置到multipart对象中        multipart.addBodyPart(bodyPart);        // 将multipart对象设置到message对象中 (setContent():)        message.setContent(multipart);        // 返回创建好的邮件对象        return message;    }   }

效果如下:

![]()

发送包含附件的邮件

package com.xxxx.mail;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.internet.InternetAddress;import javax.mail.internet.MimeBodyPart;import javax.mail.internet.MimeMessage;import javax.mail.internet.MimeMultipart;import java.util.Date;import java.util.Properties;/** * 发送包含附件的邮件 */public class MailTest03 {    public static void main(String[] args) throws Exception {        // 定义邮箱服务器配置        Properties prop = new Properties();        // 设置邮件服务器主机名 (163 邮件服务器地址:"mail.smtp.host"  "smtp.163.com")        prop.setProperty("mail.smtp.host", "smtp.163.com");        // 设置邮件服务器的端口        prop.setProperty("mail.smtp.port", "25");        // 设置邮件服务器认证属性 (设置为true表示发送服务器需要身份验证)        prop.setProperty("mail.smtp.auth", "true");        // 使用JavaMail发送邮件的5个步骤        // 1. 创建session        Session session = Session.getInstance(prop);        // 开启Session的debug模式,这样就可以查看到程序发送Email的运行状态        session.setDebug(true);        // 2. 通过session得到transport对象        Transport ts = session.getTransport();        // 3. 使用邮箱的用户名和密码连上邮件服务器(用户名只需写@前面的即可,密码是指授权码)        ts.connect("smtp.163.com", "用户名", "密码");        // 4. 创建邮件        // 发送包含附件的邮件        Message message = createAttachMail(session);                // 5. 发送邮件        ts.sendMessage(message, message.getAllRecipients());        // 关闭transport对象        ts.close();    }    /**     * 包含附件的邮件     *      创建一封包含附件的邮件     * @param session     * @return     * @throws MessagingException     */    public static MimeMessage createAttachMail(Session session) throws MessagingException {        // 创建邮件对象        MimeMessage message = new MimeMessage(session);        // 设置邮件的发件人的邮箱地址        message.setFrom(new InternetAddress("发件人的邮箱地址"));        // 设置邮件的收件人的邮箱地址 (现在发件人和收件人是一样的,那就是自己给自己发)        message.setRecipient(Message.RecipientType.TO, new InternetAddress("收件人的邮箱地址"));        // 邮件的主题        message.setSubject("测试包含附件的邮件");        // 设置发送日期        message.setSentDate(new Date());        // 创建邮件正文        MimeBodyPart bodyPart = new MimeBodyPart();        bodyPart.setContent("使用JavaMail创建的带附件的邮件", "text/html;charset=UTF-8");        // 创建附件        MimeBodyPart attachPart = new MimeBodyPart();        // 本地文件        DataHandler dh = new DataHandler(new FileDataSource("C:\\work\\邮件附件.txt"));        attachPart.setDataHandler(dh);        // 附件名        attachPart.setFileName(dh.getName());        // 创建容器描述数据关系        MimeMultipart multipart = new MimeMultipart();        // 添加正文        multipart.addBodyPart(bodyPart);        // 添加附件        multipart.addBodyPart(attachPart);        // 如果在邮件中要添加附件,设置为mixed;。        multipart.setSubType("mixed");        // 设置邮件的内容        message.setContent(multipart);        // 返回创建好的邮件对象        return message;    }}

效果如下:

![]()

Java Mail 邮件发送封装

创建邮件发送信息类

package com.xxxx.mail;import java.util.List;/** * 邮件发送信息类 *   定义发送邮件时 邮件服务器 端口 发送方用户名 密码等字段 */public class MailSendInfo {    private String serverHost; // 服务器主机    private String serverPort; // 服务器端口    private String fromAddress;// 发送方邮箱地址    private List<String> toAddress; // 接收方邮箱地址    private String userName; // 邮件服务器用户名    private String userPwd; // 邮件服务器密码(授权密码)    private String subject; // 邮件主题    private String content; // 邮件内容    private Boolean flag = true; // 是否需要身份认证    private List<String> attachFileNames; // 附件文件名    public Boolean getFlag() {        return flag;    }    public void setFlag(Boolean flag) {        this.flag = flag;    }    public String getServerHost() {        return serverHost;    }    public void setServerHost(String serverHost) {        this.serverHost = serverHost;    }    public String getServerPort() {        return serverPort;    }    public void setServerPort(String serverPort) {        this.serverPort = serverPort;    }    public String getFromAddress() {        return fromAddress;    }    public void setFromAddress(String fromAddress) {        this.fromAddress = fromAddress;    }    public List<String> getToAddress() {        return toAddress;    }    public void setToAddress(List<String> toAddress) {        this.toAddress = toAddress;    }    public String getUserName() {        return userName;    }    public void setUserName(String userName) {        this.userName = userName;    }    public String getUserPwd() {        return userPwd;    }    public void setUserPwd(String userPwd) {        this.userPwd = userPwd;    }    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 List<String> getAttachFileNames() {        return attachFileNames;    }    public void setAttachFileNames(List<String> attachFileNames) {        this.attachFileNames = attachFileNames;    }}

创建认证类

package com.xxxx.mail;import javax.mail.Authenticator;import javax.mail.PasswordAuthentication;/** * 认证类 */public class MyAuthenticator extends Authenticator {    private String userName; // 邮箱    private String userPwd; // 密码(授权码)    public MyAuthenticator(String userName, String userPwd) {        this.userName = userName;        this.userPwd = userPwd;    }    /**     * 邮件服务器发送邮件时,进行身份验证     * @return     */    @Override    protected PasswordAuthentication getPasswordAuthentication() {        return new PasswordAuthentication(userName, userPwd);    }}

创建邮件发送器

package com.xxxx.mail;import javax.activation.DataHandler;import javax.activation.FileDataSource;import javax.mail.*;import javax.mail.internet.*;import java.io.File;import java.util.Date;import java.util.List;import java.util.Properties;public class MailSender {    public void sendMail(MailSendInfo mailSendInfo){        Message message = null;        Session session = null;        try {            // 定义邮箱服务器配置            Properties props = new Properties();            // 163 邮件服务器地址            props.put("mail.smtp.host", mailSendInfo.getServerHost());            // 163 邮件服务器端口            props.put("mail.smtp.port",mailSendInfo.getServerPort());            // 163 邮件服务器认证属性            props.put("mail.smtp.auth", mailSendInfo.getFlag());            // 身份认证类            MyAuthenticator authenticator = new MyAuthenticator(mailSendInfo.getUserName(), mailSendInfo.getUserPwd());            // 创建session            session = Session.getDefaultInstance(props, authenticator);            // 开启Session的debug模式,这样就可以查看到程序发送Email的运行状态            session.setDebug(true);            // 创建message邮件对象            message = new MimeMessage(session);            // 设置发送方的邮箱地址            Address from = new InternetAddress(mailSendInfo.getFromAddress());            message.setFrom(from);            // 设置发送时间            message.setSentDate(new Date());            // 判断接收方的邮箱地址            if(null != mailSendInfo.getToAddress() && mailSendInfo.getToAddress().size() > 0){                // 定义数组                Address[] addresses = new Address[mailSendInfo.getToAddress().size()];                // 循环获取接收方的邮箱地址,并设置到对应的address数组中                for(int i = 0; i < mailSendInfo.getToAddress().size(); i++){                    Address address = new InternetAddress(mailSendInfo.getToAddress().get(i));                    addresses[i] = address;                }                // 设置接收方的邮箱地址                message.setRecipients(Message.RecipientType.TO, addresses);                // 设置邮件主题                message.setSubject(mailSendInfo.getSubject());                // 创建多媒体对象容器                Multipart multipart = new MimeMultipart();                // 创建正文内容                BodyPart bodyPart =new MimeBodyPart();                bodyPart.setContent(mailSendInfo.getContent(),"text/html;charset=utf-8");                // 添加正文 (将正文内容设置到多媒体对象容器中)                multipart.addBodyPart(bodyPart);                // 获取所有的附件内容                List<String> files = mailSendInfo.getAttachFileNames();                // 判断是否包含附件内容                if(null != files && files.size() > 0){                    for(int i = 0; i < files.size(); i++){                        // 获取对应的附件对象                        File tempFile = new File(files.get(i));                        // 判断附件是否存在                        if(tempFile.exists()){                            // 如果附件存在,创建附件对象                            BodyPart attachPart = new MimeBodyPart();                            attachPart.setDataHandler(new DataHandler(new FileDataSource(tempFile)));                            // 设置文件名 (解决附件名乱码)                            attachPart.setFileName(MimeUtility.encodeText(tempFile.getName()));                            // 添加附件 (将附件内容添加到多媒体对象容器中)                            multipart.addBodyPart(attachPart);                        }                    }                }                // 设置邮件内容                message.setContent(multipart);                // 发送邮件                Transport.send(message);            }        } catch (Exception e) {            e.printStackTrace();        }    }}

邮件发送测试

发送HTML内容的邮件
/**  * 发送HTML内容的邮件  */public static void testHtmlMail() {    MailSendInfo mailSendInfo = new MailSendInfo();    mailSendInfo.setServerHost("smtp.163.com");    mailSendInfo.setServerPort("25");    mailSendInfo.setUserName("邮箱用户名");    mailSendInfo.setUserPwd("密码(授权码)");    mailSendInfo.setSubject("邮件封装");    mailSendInfo.setFromAddress("发件人的邮箱地址");    mailSendInfo.setContent("<h2>这是封装后发送的邮件</h2>");    List<String> users = new ArrayList<>();    users.add("收件人的邮箱地址");    mailSendInfo.setToAddress(users);    MailSender mailSender=new MailSender();    mailSender.sendMail(mailSendInfo);}

效果如下:

![]()

发送包含附件的邮件
/**  * 发送包含附件的邮件  */public static void testAttachMail() {    MailSendInfo mailSendInfo = new MailSendInfo();    mailSendInfo.setServerHost("smtp.163.com");    mailSendInfo.setServerPort("25");    mailSendInfo.setUserName("用户名");    mailSendInfo.setUserPwd("密码(授权码)");    mailSendInfo.setSubject("邮件封装");    mailSendInfo.setFromAddress("发件人的邮箱地址");    mailSendInfo.setContent("<h2>包含附件的邮件</h2>");    List<String> users = new ArrayList<>();    users.add("收件人的邮箱地址");    mailSendInfo.setToAddress(users);    // 添加附件    List<String> files=new ArrayList<String>();    files.add("C:\\work\\邮件附件.txt");    files.add("C:\\work\\名单.xlsx");    mailSendInfo.setAttachFileNames(files);    MailSender mailSender=new MailSender();    mailSender.sendMail(mailSendInfo);}

效果如下:

![]()