`

java web邮件发送实例

阅读更多

        邮件发送工具类,这里使用了多个发送者进行轮询,每次选择发送频次最低的发送者进行发送,目的是为了防止同一发送方发送的过于频繁被屏蔽。使用的java mail版本是1.4.7

        maven配置如下:

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

        发送方封装类

 

package com.special.utils.mail;

/**
 * file MailInfo
 * 邮件发送者的模型,实现comparable接口,根据发送次数比较大小
 *
 * @author ds
 * @version 1.0 2015
 *          date 15-3-9
 */
public class MailInfo implements Comparable<MailInfo> {
    /**
     * 发送的主机地址
     */
    String hostName;
    /**
     * 发送人邮箱
     */
    String userName;
    /**
     * 发送人邮箱密码
     */
    String password;
    /**
     * 该发送方发送邮件次数
     */
    Integer count = 0;

    public int compareTo(MailInfo other) {
        int o = other.getCount() == null ? 0 : other.getCount();
        return count - o;
    }

    /**
     * 邮件发送类型
     */
    enum MailType {
        HTML,
        TEXT
    }

    /**
     * 无参构造函数
     */
    public MailInfo() {
    }

    /**
     * 含参数构造函数
     *
     * @param hostName 服务器主机SMTP地址
     * @param userName 发送者邮箱
     * @param password 发送者邮箱密码
     */
    public MailInfo(String hostName, String userName, String password) {
        this.hostName = hostName;
        this.userName = userName;
        this.password = password;
    }

    public String getHostName() {
        return hostName;
    }

    public void setHostName(String hostName) {
        this.hostName = hostName;
    }

    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 Integer getCount() {
        return count;
    }

    public void setCount(Integer count) {
        this.count = count;
    }

    public String toString() {
        return hostName + ":" + userName + ":" + count;
    }

}

          邮件发送类

package com.special.utils.mail;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import java.util.*;

/**
 * file MailUtil
 * 使用JAVA mail进行邮件发送的工具类
 *
 * @author ds
 * @version 1.0 2015
 *          date 15-3-9
 */
public class MailUtil {
    protected static Log logger = LogFactory.getLog("com.special.utils.mail.MailUtil");
    /**
     * 存放发送方信息
     */
    private static List<MailInfo> mailFromList = new ArrayList<MailInfo>();

    /**
     * 标记初始化发送方信息
     */
    private static boolean flag = true;
    /**
     * 邮件发送发生异常后重复发送的次数
     */
    private static Integer exceptionCount = 5;

    /**
     * 初始化发送方信息
     *
     * @param list 发送方列表
     */
    public static void init(List<MailInfo> list) {
        if (flag) {
            mailFromList = list;
            flag = false;
        }
    }

    /**
     * 发送邮件
     *
     * @param subject 邮件主题
     * @param type    邮件类型,html或者文本
     * @param content 邮件内容
     * @param to      收件人,有逗号隔开
     * @param cc      抄送,逗号隔开
     * @param bcc     暗送,逗号隔开
     * @return boolean true 发送成功 false 发送失败
     */
    public static boolean send(String subject, MailInfo.MailType type, String content, String to, String cc, String bcc) {
        boolean result = true;
        //首先列表排序
        Collections.sort(mailFromList);
        //获取发送频率最小的一个值
        final MailInfo mailInfo = mailFromList.get(0) == null ? new MailInfo() : mailFromList.get(0);
        logger.info(mailInfo.toString());
        /**
         * 每使用一次mail服务器就递增一次发送次数,而不是发送成功之后才递增,
         * 这样做的目的是避免某一台mail服务器故障后无法发送邮件但永远频次最低,
         * 故永远选择这台故障机发送,所带来的问题
         */
        mailInfo.setCount(mailInfo.getCount() + 1);
        // 以下为发送程序,用户无需改动
        Properties props = new Properties();
        props.put("mail.smtp.host", mailInfo.getHostName());
        //身份验证,一般邮件服务器都需要身份验证
        props.put("mail.smtp.auth", "true");
        Session ssn = Session.getInstance(props, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(mailInfo.getUserName(), mailInfo.getPassword());    //To change body of overridden methods use File | Settings | File Templates.
            }

        });
        MimeMessage message = new MimeMessage(ssn);
        InternetAddress fromAddress;
        try {
            fromAddress = new InternetAddress(mailInfo.getUserName());
            message.setFrom(fromAddress);
            //收件人,以逗号隔开
            message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to, false));
            //抄送,以逗号隔开
            if (null != cc && !"".equals(cc)) {
                message.setRecipients(Message.RecipientType.CC, InternetAddress.parse(cc));
            }
            //暗送,逗号隔开
            if (null != bcc && !"".equals(bcc)) {
                message.setRecipients(Message.RecipientType.BCC, InternetAddress.parse(bcc));
            }
            message.setSubject(subject);
            switch (type) {
                case HTML:
                    MimeBodyPart mbp = new MimeBodyPart();
                    // 设定邮件内容的类型为 text/plain 或 text/html
                    mbp.setContent(content, "text/html;charset=UTF-8");
                    Multipart mp = new MimeMultipart();
                    mp.addBodyPart(mbp);
                    message.setContent(mp);
                    break;
                case TEXT:
                    //发送文本邮件
                    message.setText(content);
                    break;
            }
            message.setSentDate(new Date());
            //发送邮件,还有另外一种写法
            /*Transport transport = ssn.getTransport("smtp");
            transport.connect(mailInfo.getHostName(), mailInfo.getUserName(), mailInfo.getPassword());
            transport.sendMessage(message, message.getAllRecipients());
            transport.close();*/
            Transport.send(message);
            logger.info("mail send successfully from " + mailInfo.getUserName() + " to " + to + " and cc to " + cc);
        } catch (Exception e) {
            result = false;
            synchronized (exceptionCount) {
                if (exceptionCount <= 0) {
                    exceptionCount = 5;
                } else {
                    exceptionCount--;
                    if (send(subject, type, content, to, cc, bcc)) {
                        result = true;
                        exceptionCount = 5;
                    }
                    logger.info("mail send failure ,from " + mailInfo.getUserName() + " to " + to);
                }
            }
            e.printStackTrace();
        }

        return result;
    }

    public boolean test() {
        boolean r = true;
        try {
            logger.info(1 / 0);
        } catch (Exception e) {
            r = false;
            e.printStackTrace();
        }
        return r;
    }

    public static void main(String[] args) {
        MailInfo info;
        String hostName = "mail.sino****.com.cn";
        info = new MailInfo(hostName, "ds1@mail.com.cn", "pwd1");
        mailFromList.add(info);
        info = new MailInfo(hostName, "ds@mail.com.cn", "pwd");
        mailFromList.add(info);


        boolean r = MailUtil.send("test", MailInfo.MailType.HTML, "<div style=\"color:red\">from new mail test</div>", "8****@qq.com", "", "");
        logger.info(r);
    }
}

 

分享到:
评论

相关推荐

    Java Web开发实例大全

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

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

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

    Java邮件发送实例

    Java邮件发送是一个常见的任务,尤其在开发Web应用或者自动化任务时。这个实例向我们展示了如何使用JavaMail API发送一封简单的HTML格式的邮件。下面将详细解释这个实例中的关键知识点。 首先,我们需要导入必要的...

    Java Web 整合开发 完全自学手册 源代码

    7. **JavaMail API**:JavaMail API允许在Java应用程序中发送和接收电子邮件。理解SMTP协议,使用JavaMail发送HTML邮件、附件,以及处理邮件验证和错误处理。 8. **Filter与Listener**:在Java Web中,Filter用于...

    Java通过Exchange协议发送和接收邮件

    5. 发送邮件:使用EmailMessage的send方法将邮件发送出去。 接收邮件部分,主要涉及到查询和处理邮箱中的邮件: 1. 获取Folder对象:通过ExchangeService对象获取Inbox或Drafts等特定文件夹的引用。 2. 查询邮件:...

    java web定时任务 实例

    Java Web定时任务是Web应用程序中实现周期性操作的关键技术,例如数据备份、清理过期记录、发送邮件通知等。在本实例中,我们将探讨如何在Java Web环境中设置和执行定时任务,以及涉及到的相关技术和工具。 首先,...

    BBS论坛系统 java web应用开发实例

    8. **异步处理**:对于一些耗时的操作,如发送邮件通知,可以使用异步处理,提高系统的并发能力。 9. **AJAX**:为了提供更好的用户体验,论坛的某些功能如无刷新加载新帖,可以利用AJAX技术实现。 10. **移动适配...

    java发送邮件的小例子

    在Java编程语言中,发送...总的来说,Java邮件发送是一个实用且基础的技能,理解其工作原理和实现方式对提升开发者在Web应用开发中的能力大有裨益。通过学习和实践,我们可以轻松地实现在各种场景下的邮件通信功能。

    web系统发送邮件

    本实例聚焦于如何在Java Web应用中实现邮件发送,帮助开发者理解并应用相关技术。下面将详细介绍这个过程。 首先,我们需要了解JavaMail API,这是Java平台用来处理邮件的接口。它提供了创建、配置和发送电子邮件的...

    自己开发的JAVA Web Email邮件系统

    【描述】:“自己开发的JAVA Web Email邮件系统 自己开发的JAVA Web Email邮件系统 自己开发的JAVA Web Email邮件系统 自己开发的JAVA Web Email邮件系统” 描述中的重复强调表明这个项目的核心在于构建一个基于...

    web版邮件接收发送问题

    在IT行业中,邮件服务是企业或个人...在Java Web邮件开发中,熟悉JavaMail API、HTTP协议和Web应用部署环境是非常重要的。同时,对于SMTP服务器的配置和安全策略也应有所了解,因为这可能直接影响到邮件的发送和接收。

    java定时发送邮件

    邮件发送的逻辑可能会封装在一个Servlet或监听器中,这样当达到预设的发送时间时,Servlet或监听器会被触发执行发送邮件的代码。 总结一下,这个Java定时发送邮件的例子涵盖了以下几个主要技术点: 1. JavaMail ...

    Java邮件发送示例

    结合"TestMail"项目,你可以学习如何在Java程序中集成邮件发送和接收的功能,这对于构建实际的Web应用非常有用。尽管该项目的界面设计可能不吸引人,但它提供了实际操作的基础,有助于理解JavaMail API的使用和邮件...

    java自动发邮件

    这个示例中展示了一个基于Servlet的简单邮件发送系统,通过配置`web.xml`文件来初始化参数,并使用`MailSenderServlet`进行邮件发送。 1. **web.xml配置**: `web.xml`文件是Java Web应用的部署描述符,它包含了...

    Mail Web开源版(邮件系统客户端)

    同时,对于SMTP(Simple Mail Transfer Protocol),Mail Web开源版也进行了良好的支持,实现了邮件的发送功能。 在源码层面,Mail Web开源版的开放性为开发者提供了深入学习的机会。开发者可以通过阅读和分析源码...

    java实现发送邮件功能demo

    本文将深入探讨如何使用JavaMail API在Java应用程序中实现发送邮件的功能,同时也会涉及验证码验证以及网页版邮件发送的实现。 首先,要发送邮件,我们需要引入JavaMail的相关库。通常,这包括`javax.mail`和`javax...

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

    Java 组播组中发送和接受数据实例 3个目标文件。 Java读写文本文件的示例代码 1个目标文件。 java俄罗斯方块 一个目标文件。 Java非对称加密源码实例 1个目标文件 摘要:Java源码,算法相关,非对称加密  Java非...

    Java项目开发全程实例

    JavaMail API是处理邮件的关键,同时,可能使用SMTP服务器进行邮件发送。系统还需要处理邮件的存储,可能涉及SQLite或MySQL数据库。此外,可能需要实现邮件的过滤和分类功能,这就需要理解正则表达式和数据挖掘的...

    用EWSAPI在Java中发送Exchange邮件

    在IT行业中,Exchange Web Services (EWS) API 是一种用于与Microsoft Exchange Server进行通信的编程接口,它允许开发者通过各种编程语言(如Java)来执行邮件管理、日历操作、联系人同步等任务。本教程将详细介绍...

    java web定时器例子

    Java Web定时器主要指的是在Java Web应用程序中实现定时任务的功能,这在许多业务场景中都是必要的,例如数据备份、报表生成、邮件发送等。在Java中,我们可以利用内置的`java.util.Timer`类或者Spring框架的`@...

Global site tag (gtag.js) - Google Analytics