`
菜鸟级JAVA
  • 浏览: 92373 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

用java代码发送邮件(优化版)

阅读更多
调用代码如下:
if(!StringUtil.isNullOrEmpty(address)){
            SendEmailUtil.sendEmail(globalProperties.getEmailSubject() , noticeMsg.toString() , address , globalProperties.getEmailIsSend(), globalProperties.getEmailAccount()
                    , globalProperties.getEmailPassword() , globalProperties.getEmailFromAddress() , globalProperties.getEmailHost() , globalProperties.getEmailPort());
        }else{
            this.logger.debug("重置密码时,邮件无法发送,原因为:账户邮箱地址为空");
        }


代码如下:
package com.banger.ubip.common.utils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Date;
import java.util.Properties;
import java.util.StringTokenizer;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

import javax.mail.Address;
import javax.mail.Authenticator;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.*;


/**
 * @Author luozx
 * @Date 2016/12/26 10:20.
 */
public class SendEmailUtil extends Authenticator implements Runnable{
    private static final boolean validate = true;
    private String subject;
    private String account;
    private String password;
    private String fromAddress;
    private String msg;
    private String address;
    private Properties pro = new Properties();
    private static Session sendMailSession = null;
    private String emailIsSend;//邮件是否发送的开关 true为发送邮件

    protected Logger logger = LoggerFactory.getLogger(getClass());

    //邮件发送的线程池
    private static ThreadPoolExecutor executor = new ThreadPoolExecutor(10, 10, 200, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));

    public static void sendEmail(String subject , String msg , String address , String emailIsSend ,
                                 String account, String password, String fromAddress, String host, String port) {
        SendEmailUtil set = new SendEmailUtil(subject , msg , address , emailIsSend ,account, password, fromAddress, host, port);
        executor.execute(set);
    }
    public SendEmailUtil(String subject , String msg , String address , String emailIsSend ,
                     String account, String password, String fromAddress, String host, String port) {
        super();
        this.subject = subject;
        this.account = account;
        this.password = password;
        this.fromAddress = fromAddress;
        this.msg = msg;
        this.address = address;
        this.emailIsSend = emailIsSend;
        pro.put("mail.smtp.host",host);
        pro.put("mail.smtp.port",port);
        pro.put("mail.smtp.auth", validate ? "true" : "false");
    }

    @Override
    public void run() {
        if(!StringUtil.isNullOrEmpty(emailIsSend) && "true".equals(emailIsSend)){
            InternetAddress[] ia = parseAddress(address);
            sendTextMail(ia,subject,msg);
            logger.info("邮件发送完成,接收者为:[{}]",address);
        }
    }

    @Override
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(account, password);
    }

    /**
     * 以文本格式发送邮件
     *
     * @param ToAddress
     * @param Subject
     * @param Content
     *            待发送的邮件的信息
     */
    public boolean sendTextMail(InternetAddress[] ToAddress, String Subject,
                                String Content) {
        // 判断是否需要身份认证
        try {
            // 根据邮件会话属性和密码验证器构造一个发送邮件的session
            // Session sendMailSession = Session.getDefaultInstance(pro, this);
            if (sendMailSession == null) {
                sendMailSession = Session.getDefaultInstance(pro, this);
            }
            // 根据session创建一个邮件消息
            Message mailMessage = new MimeMessage(sendMailSession);
            // 创建邮件发送者地址
            Address from = new InternetAddress(fromAddress);
            // 设置邮件消息的发送者
            mailMessage.setFrom(from);
            // 创建邮件的接收者地址,并设置到邮件消息中
            if (ToAddress.length == 1) {
                mailMessage.setRecipients(Message.RecipientType.TO, ToAddress);
            } else {
                mailMessage.setRecipients(Message.RecipientType.BCC, ToAddress);
            }
            // 设置邮件消息的主题
            mailMessage.setSubject(MimeUtility.encodeText(Subject,MimeUtility.mimeCharset("utf-8"), null));
            // 设置邮件消息发送的时间
            mailMessage.setSentDate(new Date());
            // 设置邮件消息的主要内容
           // mailMessage.setText(Content);
            mailMessage.setContent(Content, "text/html;charset=utf-8");
            // 发送邮件
            Transport.send(mailMessage);
            return true;
        } catch (Exception ex) {
            logger.error("邮件发送异常,[{}]",ex);
        }
        return false;
    }

    /**
     * 以HTML格式发送邮件
     *
     * @param ToAddress
     * @param Subject
     * @param Content
     *            待发送的邮件信息
     */
    public boolean sendHtmlMail(InternetAddress[] ToAddress, String Subject,
                                String Content) {
        try {
            // 根据邮件会话属性和密码验证器构造一个发送邮件的session
            // Session sendMailSession = Session.getDefaultInstance(pro, this);
            if (sendMailSession == null) {
                sendMailSession = Session.getDefaultInstance(pro, this);
            }
            // 根据session创建一个邮件消息
            Message mailMessage = new MimeMessage(sendMailSession);
            // 创建邮件发送者地址
            Address from = new InternetAddress(fromAddress);
            // 设置邮件消息的发送者
            mailMessage.setFrom(from);
            // 创建邮件的接收者地址,并设置到邮件消息中
            // Message.RecipientType.TO属性表示接收者的类型为TO
            if (ToAddress.length == 1) {
                mailMessage.setRecipients(Message.RecipientType.TO, ToAddress);
            } else {
                mailMessage.setRecipients(Message.RecipientType.BCC, ToAddress);
            }
            // 设置邮件消息的主题
            mailMessage.setSubject(Subject);
            // 设置邮件消息发送的时间
            mailMessage.setSentDate(new Date());
            // MiniMultipart类是一个容器类,包含MimeBodyPart类型的对象
            Multipart mainPart = new MimeMultipart();
            // 创建一个包含HTML内容的MimeBodyPart
            BodyPart html = new MimeBodyPart();
            // 设置HTML内容
            html.setContent(Content, "text/html; charset=utf-8");
            mainPart.addBodyPart(html);
            // 将MiniMultipart对象设置为邮件内容
            mailMessage.setContent(mainPart);
            // 发送邮件
            Transport.send(mailMessage);
            return true;
        } catch (MessagingException ex) {
            logger.error("邮件发送异常,[{}]",ex);
        }
        return false;
    }

    public InternetAddress[] parseAddress(String addr) {
        StringTokenizer token = new StringTokenizer(addr, ",");
        InternetAddress[] addrArr = new InternetAddress[token.countTokens()];
        int i = 0;
        while (token.hasMoreTokens()) {
            try {
                addrArr[i] = new InternetAddress(token.nextToken().toString());
            } catch (AddressException e1) {
                return null;
            }
            i++;
        }
        return addrArr;
    }

    public static void main(String[] args) {
        String subject = "系统通知邮件";
        String noticeMsg = "这是一封神奇的邮件";
        String address = "7184638022@qq.com";
        String emailIsSend = "true";
        String accountTemp = "123123@qq.com";
        String passwordTemp = "123456";
        String fromAddressTemp = "123123@qq.com";
        String hostTemp = "smtp.exmail.qq.com";
        String portTemp = "25";
        SendEmailUtil set = new SendEmailUtil(subject , noticeMsg , address , emailIsSend , accountTemp , passwordTemp , fromAddressTemp , hostTemp,portTemp);
        set.run();
    }

}

分享到:
评论

相关推荐

    java源码包---java 源码 大量 实例

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    JAVA上百实例源码以及开源项目源代码

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    JAVA上百实例源码以及开源项目

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    java源码包2

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    java源码包4

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    java源码包3

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    Java局域网通信——飞鸽传书源代码 28个目标文件 内容索引:JAVA源码,媒体网络,飞鸽传书 Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    Java局域网通信——飞鸽传书源代码 28个目标文件 内容索引:JAVA源码,媒体网络,飞鸽传书 Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java...

    基于最新的Java 21和SpringBoot 3.2 根据eladmin项目进行改造+源代码+文档说明

    - 使用最新技术栈,社区资源丰富,基于Java 21(Core Module Support 17-21)、Spring Boot 3.2。 (Support Virtual Threads/fibre/loom) - 基于注解的动态查询(Specification),可根据需要扩充查询注解。 - 支持...

    Java Web开发实例大全(基础卷) 完整pdf扫描版[179MB]

    Java Web开发实例大全(提高卷)筛选、汇集了Java Web开发从基础知识到高级应用各个层面的大量实例及源代码,共有600个左右,每个实例及源代码按实例说明、关键技术、设计过程、详尽注释、秘笈心法的顺序进行了分析...

    鑫路在线竞价订单管理系统2.5免费版(带有管理后台,支持短信发送,邮件提醒,订单导出excel)

    2、优化订单页面的发短信及邮件的布局; 3、去除订单搜索页面的条件限制,带来更强的订单搜索过滤管理功能; 4、添加根据下单日期搜索订单; 5、调整页面背景显示,调整后更舒适; 6、内容模板添加分类过滤功能; 7...

    jsp+mysql小型酒吧在线管理系统

    小型酒吧在线管理系统MinibarCMS是使用Java MVC模式 + Mysql数据库开发的一个简单的文章管理系统,代码简单,数据库也非常mini,特别适合初学者研究与学习! V2版本中对前端进行了重构,一个全新的平面化设计的前端...

    Java开源的下一代社区平台Symphony.zip

    万能的 GitHub 上连个能用的 Java 社区系统都找不到,Sym 填补了这个宇宙级空白 做最 NB 的开源社区系统,预计几年以后 82% 的社区都将是 Sym 搭建的 作者技痒,炫技之作,Ruby/Python/Node.js/(特别是)PHP ...

    Android高级编程--源代码

    和任何其他产品早期的发行版一样,Android的软件和开发库还会经历很多正常的改进和完善。本书的内容和示例提供了如何使用当前SDK来编写优秀的移动程序所需要的基础知识,同时也保持了快速适应未来版本...

    传名网络广告联盟系统 v5.2

    优化用户注册部分代码,判断所有表单,加入回答问题,加入取回密码生成新密码发送邮件 后台设置是否开放新用户注册 后台设置支持的银行 IP记录增加对今天来访IP 本周来访IP 本月来访IP的统计功能 清空资料不删除三天...

    libphonenumber:Google的通用Java,C ++和JavaScript库,用于解析,格式化和验证国际电话号码

    Java版本已针对在智能手机上运行进行了优化,并且从4.0开始就被Android框架使用(冰淇淋三明治)。 快速链接 正在报告问题? 要发送拉取请求吗? 见 检查 乐趣! 在与您感兴趣的代码相关目录中查找 。 对于贡献者...

    libphonenumber:Google的通用Java,C ++和JavaScript库,用于解析,格式化和验证国际电话号码

    Java版本针对在智能手机上运行进行了优化,并且从4.0开始就被Android框架使用(冰淇淋三明治)。 快速链接 正在报告问题? 要发送拉取请求吗? 见 检查 乐趣! 在与您感兴趣的代码相关目录中查找 。 对于贡献者和...

    jsp+mysql小型酒吧在线管理系统.zip

    小型酒吧在线管理系统MinibarCMS是使用Java MVC模式 + Mysql数据库开发的一个简单的文章管理系统,代码简单,数据库也非常mini,特别适合初学者研究与学习! V2版本中对前端进行了重构,一个全新的平面化设计的前端...

Global site tag (gtag.js) - Google Analytics