Java发送邮件工具类

这是从根据从码云上找到的一个邮件发送开源项目进行了一定的修改后

这里用的是Spring Boot项目进行的测试

项目结构:

pom文件需要引入以下三个jar包:

        <dependency>
            <groupId>commons-beanutils</groupId>
            <artifactId>commons-beanutils</artifactId>
            <version>1.9.3</version>
        </dependency>

        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/javax.mail/mail -->
        <dependency>
            <groupId>javax.mail</groupId>
            <artifactId>mail</artifactId>
            <version>1.4.6</version>
        </dependency>

邮件类:

package com.jiangwenzhang.dto;

import java.util.Date;


/**
 * 上午9:29:51
 * 
 * @version V1.0
 */
public class MimeMessageDTO {
    /**   
     * 变量名 subject: TODO 邮件标题
     */   
    private String subject;
    
    /**   
     * 变量名 sentDate: TODO 邮件日期
     */   
    private Date sentDate;
    
    /**   
     * 变量名 text: TODO 邮件内容
     */   
    private String text;

    /** 
     * 方法名: initMimeMessage 
     * 功能描述: TODO 初始化
     * @param: @param subject
     * @param: @param date
     * @param: @param text
     * @param: @return  
     * @return: MimeMessageDTO 
     */
    public MimeMessageDTO initMimeMessage(String subject, Date date, String text) {
        return new MimeMessageDTO(subject, date, text);
    }
    
    public MimeMessageDTO() {
        super();
    }

    public MimeMessageDTO(String subject, Date sentDate, String text) {
        super();
        this.subject = subject;
        this.sentDate = sentDate;
        this.text = text;
    }

    public String getSubject() {
        return subject;
    }

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

    public Date getSentDate() {
        return sentDate;
    }

    public void setSentDate(Date sentDate) {
        this.sentDate = sentDate;
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

}

邮件发送工具类:

package com.jiangwenzhang.util;

import com.jiangwenzhang.dto.MimeMessageDTO;

import java.util.List;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
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;


/**
 * 类名称:  mailUtil
 * 功能描述: TODO 邮件发送例子
 * 创建人:  Gavin-Nie 
 * 创建时间: 2014-12-4 上午9:20:16 
 * @version  V1.0  
 */
public class MailUtil {
    
    /**   
     * 变量名 userName: TODO 邮箱用户名
     */   
    private String userName;
    
    /**   
     * 变量名 password: TODO 邮箱地址
     */   
    private String password;
    
    /**   
     * 变量名 smtpHost: TODO 邮箱smtp地址,发送地址
     */   
    private String smtpHost;
    
    /**   
     * 变量名 targetAddress: TODO 目标邮箱地址
     */   
    private String targetAddress;
    
    /**
     *  发送单邮件
     * @param userName
     * @param password
     * @param targetAddress
     * @param mimeDTO
     * @return
     */
    public  static boolean sendEmail(String userName,String password,String targetAddress,
            MimeMessageDTO mimeDTO){
        return publicsendEmail(userName,password,targetAddress,mimeDTO,false,null);
    }
    /**
     * 发送单邮件(附件)
     * @param userName
     * @param password
     * @param targetAddress
     * @param mimeDTO
     * @param filepath        文件本地绝对路径
     * @return
     */
    public  static boolean sendEmailByFile(String userName,String password,String targetAddress,
            MimeMessageDTO mimeDTO,List<String> filepath){
        return publicsendEmail(userName,password,targetAddress,mimeDTO,true,filepath);
    }
    /**
     * 群发邮件 
     * @param userName
     * @param password
     * @param targetAddress   多个邮件发送地址,以,分隔
     * @param mimeDTO
     * @return
     */
    public  static boolean sendGroupEmail(String userName,String password,String targetAddress,
            MimeMessageDTO mimeDTO){
        return publicsendEmail(userName,password,targetAddress,mimeDTO,true,null);
    }
    /**
     * 群发邮件 (附件)
     * @param userName
     * @param password
     * @param targetAddress 多个邮件发送地址,以,分隔
     * @param mimeDTO
     * @param filepath      文件本地绝对路径
     * @return
     */
    public  static boolean sendGroupEmailByFile(String userName,String password,String targetAddress,
            MimeMessageDTO mimeDTO,List<String> filepath){
        return publicsendEmail(userName,password,targetAddress,mimeDTO,true,filepath);
    }
    
    
    
    /**
     * 邮件发送基础方法
     * @param userName
     * @param password
     * @param targetAddress
     * @param mimeDTO
     * @param isGroup
     * @param filepath
     * @return
     */
    private static boolean publicsendEmail(String userName,String password,String targetAddress,
            MimeMessageDTO mimeDTO,boolean isGroup,List<String> filepath){
        Properties props = makeMailProperties(userName);
        String hostname=SMTPUtil.SimpleMailSender(userName);
        Session session = Session.getInstance(props, new PopupAuthenticator(userName, password));
        session.setDebug(true);
        try {
            Transport ts = session.getTransport();
            ts.connect(hostname,userName,password);
            Message message =!isGroup?createEmail(session,userName,targetAddress,mimeDTO)
                    :createEmailByGroupAndFile(session,userName,
                            targetAddress,mimeDTO,filepath==null?null:filepath);
            ts.sendMessage(message,message.getAllRecipients());
            ts.close();
        } catch (Exception mex) {
            mex.printStackTrace();
            return false;
        }
        return true;
    }
    
    
    
    
    
    /**
     * 创建邮件信息
     * @param userName
     * @return
     */
    private static Properties makeMailProperties(String userName){
        Properties props = new Properties();
        String hostname=SMTPUtil.SimpleMailSender(userName);
        props.put("mail.smtp.host", hostname);
        props.setProperty("mail.smtp.auth", "true");
        props.setProperty("mail.transport.protocol", "smtp");
        if(hostname.indexOf(".qq.com")!=-1){
            props.setProperty("mail.smtp.socketFactory.port", "465");
            props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        }
        return props;
    }
    
    
    
    /**
     * 创建邮件
     * @Author Casper
     * Create_time:2015年10月17日 下午7:45:57
     * description:
     */
    private static Message createEmail(Session session,String userName,String regMail,MimeMessageDTO mimeDTO){
        MimeMessage message = new MimeMessage(session);
        try {
            message.setFrom(new InternetAddress(userName));
            message.setRecipient(Message.RecipientType.TO, new InternetAddress(regMail));
            message.setSubject(mimeDTO.getSubject());
            message.setContent(mimeDTO.getText(),"text/html;charset=UTF-8");
            message.saveChanges();
        } catch (MessagingException e) {
            e.printStackTrace();
        }
        return message;
    }
    /**
     * 创建群发带附件
     * @return
     */
    private static Message createEmailByGroupAndFile(Session session,String userName,
                                String regMail,MimeMessageDTO mimeDTO,List<String> filepath){
        MimeMessage message = new MimeMessage(session);
        try {
            message.setFrom(new InternetAddress(userName));
              // 创建收件人列表  
            if (regMail != null && regMail.trim().length() > 0) {  
                String[] arr = regMail.split(",");  
                int receiverCount = arr.length; 
                if (receiverCount > 0) {
                    InternetAddress[] address = new InternetAddress[receiverCount];  
                    for (int i = 0; i < receiverCount; i++) {  
                        address[i] = new InternetAddress(arr[i]);  
                    }  
                    message.setRecipients(Message.RecipientType.TO, address);
                }
            }
         // 后面的BodyPart将加入到此处创建的Multipart中  
            Multipart mp = new MimeMultipart();  
         // 附件操作  
            if (filepath != null && filepath.size() > 0) {  
                for (String filename : filepath) {  
                    MimeBodyPart mbp = new MimeBodyPart();  
                    // 得到数据源  
                    FileDataSource fds = new FileDataSource(filename);  
                    // 得到附件本身并至入BodyPart  
                    mbp.setDataHandler(new DataHandler(fds));  
                    // 得到文件名同样至入BodyPart  
                    mbp.setFileName(fds.getName());  
                    mp.addBodyPart(mbp);  
                }  
                MimeBodyPart mbp = new MimeBodyPart();  
                mbp.setText(mimeDTO.getText());  
                mp.addBodyPart(mbp);  
                // 移走集合中的所有元素  
                filepath.clear();  
                // Multipart加入到信件  
                message.setContent(mp);  
            } else {  
                // 设置邮件正文  
//                message.setText(mimeDTO.getText());  
                message.setContent(mimeDTO.getText(),"text/html;charset=UTF-8");
            } 
            message.setSubject(mimeDTO.getSubject());
            message.saveChanges();
        } catch (MessagingException e) {
            e.printStackTrace();
        }
        return message;
    }
    
    
    
    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 String getSmtpHost() {
        return smtpHost;
    }
    public void setSmtpHost(String smtpHost) {
        this.smtpHost = smtpHost;
    }
    public String getTargetAddress() {
        return targetAddress;
    }
    public void setTargetAddress(String targetAddress) {
        this.targetAddress = targetAddress;
    }
}

还有PopupAuthenticator类和smtp工具类就不贴了

使用

  @GetMapping("/send")
    public String sendmail() {
        String userName = "**@qq.com";   //用户邮箱地址
        String password = "**";    //密码或者授权码
        String targetAddress = "**@qq.com";     //接受者邮箱地

        // 设置邮件内容
        MimeMessageDTO mimeDTO = new MimeMessageDTO();
        mimeDTO.setSentDate(new Date());
        mimeDTO.setSubject("提醒:还款");
        mimeDTO.setText("您的信用卡还款日到了");
        String str="发送邮件:";
//        // 发送单邮件
        if (MailUtil.sendEmail(userName, password, targetAddress, mimeDTO)) {
            str+="邮件发送成功!";
        } else {
            str+="邮件发送失败!!!";
        }
        return str;
    }

经过测试QQ邮箱可以正常发送邮件。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据结构与算法

codechef September Challenge 2018 Division 2 A-F

最大的是:$2, 3, 4, 5, n / 2, 1, 2 + n / 2, 3 + n / 2, 4 + n  /2 ...$

10130
来自专栏技术记录

前端插件——头像截图上传插件的使用(带后台)

效果图:实现上传头像,右边是预览,有三个大小,可以对头像进行裁剪 ? HTML: toParentData 和 img 返回的是图片裁剪后的base64编码。其...

1.2K50
来自专栏潇涧技术专栏

Pury Project Analysis

Pury的源码:https://github.com/NikitaKozlov/Pury

10120
来自专栏腾讯Bugly的专栏

深入浅出 Retrofit,这么牛逼的框架你们还不来看看?

Android 开发中,从原生的 HttpUrlConnection 到经典的 Apache 的 HttpClient,再到对前面这些网络基础框架的封装,比如 ...

40060
来自专栏腾讯大讲堂的专栏

深入浅出 Retrofit,这么牛逼的框架你们还不来看看?

文章来源:腾讯Bugly Android 开发中,从原生的 HttpUrlConnection 到经典的 Apache 的 HttpClient,再到对前面这些...

37350
来自专栏向治洪

Support Annotation Library使用详解

概述 Support Annotation Library是在Android Support Library19.1版本开始引入的一个全新的函数包,它包含了诸多...

21580
来自专栏刘望舒

Android资源动态加载以及相关原理分析

思考 一般情况下,我们在设计一个插件化框架的时候,要解决的无非是下面几个问题: 四大组件的动态注册 组件相关的类的加载 资源的动态加载 实际上从目前的主流插件...

39880
来自专栏Android开发指南

Android优化指南

56270
来自专栏Java开发者杂谈

XSS事件(一)

​ 最近做的一个项目因为安全审计需要,需要做安全改造。其中自然就包括XSS和CSRF漏洞安全整改。关于这两个网络安全漏洞的详细说明,可以参照我本篇博客最后的参考...

21140
来自专栏移动端开发

Android学习--跨程序共享数据之内容提供其探究

      跨程序共享数据之内容提供器,这是个什么功能?看到这个名称的时候最能给我们提供信息的应该是“跨程序”这个词了,是的重点就是这个词,这个内容提供器的作用...

14030

扫码关注云+社区

领取腾讯云代金券