邮件发送工具类,这里使用了多个发送者进行轮询,每次选择发送频次最低的发送者进行发送,目的是为了防止同一发送方发送的过于频繁被屏蔽。使用的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开发从基础知识到高级应用各个层面的大量实例及源代码,共有600个左右,每个实例及源代码按实例说明、关键技术、设计过程、详尽注释、秘笈心法的顺序进行了分析...
Java Web开发实例大全(提高卷)筛选、汇集了Java Web开发从基础知识到高级应用各个层面的大量实例及源代码,共有600个左右,每个实例及源代码按实例说明、关键技术、设计过程、详尽注释、秘笈心法的顺序进行了分析...
Java邮件发送是一个常见的任务,尤其在开发Web应用或者自动化任务时。这个实例向我们展示了如何使用JavaMail API发送一封简单的HTML格式的邮件。下面将详细解释这个实例中的关键知识点。 首先,我们需要导入必要的...
7. **JavaMail API**:JavaMail API允许在Java应用程序中发送和接收电子邮件。理解SMTP协议,使用JavaMail发送HTML邮件、附件,以及处理邮件验证和错误处理。 8. **Filter与Listener**:在Java Web中,Filter用于...
5. 发送邮件:使用EmailMessage的send方法将邮件发送出去。 接收邮件部分,主要涉及到查询和处理邮箱中的邮件: 1. 获取Folder对象:通过ExchangeService对象获取Inbox或Drafts等特定文件夹的引用。 2. 查询邮件:...
Java Web定时任务是Web应用程序中实现周期性操作的关键技术,例如数据备份、清理过期记录、发送邮件通知等。在本实例中,我们将探讨如何在Java Web环境中设置和执行定时任务,以及涉及到的相关技术和工具。 首先,...
8. **异步处理**:对于一些耗时的操作,如发送邮件通知,可以使用异步处理,提高系统的并发能力。 9. **AJAX**:为了提供更好的用户体验,论坛的某些功能如无刷新加载新帖,可以利用AJAX技术实现。 10. **移动适配...
在Java编程语言中,发送...总的来说,Java邮件发送是一个实用且基础的技能,理解其工作原理和实现方式对提升开发者在Web应用开发中的能力大有裨益。通过学习和实践,我们可以轻松地实现在各种场景下的邮件通信功能。
本实例聚焦于如何在Java Web应用中实现邮件发送,帮助开发者理解并应用相关技术。下面将详细介绍这个过程。 首先,我们需要了解JavaMail API,这是Java平台用来处理邮件的接口。它提供了创建、配置和发送电子邮件的...
【描述】:“自己开发的JAVA Web Email邮件系统 自己开发的JAVA Web Email邮件系统 自己开发的JAVA Web Email邮件系统 自己开发的JAVA Web Email邮件系统” 描述中的重复强调表明这个项目的核心在于构建一个基于...
在IT行业中,邮件服务是企业或个人...在Java Web邮件开发中,熟悉JavaMail API、HTTP协议和Web应用部署环境是非常重要的。同时,对于SMTP服务器的配置和安全策略也应有所了解,因为这可能直接影响到邮件的发送和接收。
邮件发送的逻辑可能会封装在一个Servlet或监听器中,这样当达到预设的发送时间时,Servlet或监听器会被触发执行发送邮件的代码。 总结一下,这个Java定时发送邮件的例子涵盖了以下几个主要技术点: 1. JavaMail ...
结合"TestMail"项目,你可以学习如何在Java程序中集成邮件发送和接收的功能,这对于构建实际的Web应用非常有用。尽管该项目的界面设计可能不吸引人,但它提供了实际操作的基础,有助于理解JavaMail API的使用和邮件...
这个示例中展示了一个基于Servlet的简单邮件发送系统,通过配置`web.xml`文件来初始化参数,并使用`MailSenderServlet`进行邮件发送。 1. **web.xml配置**: `web.xml`文件是Java Web应用的部署描述符,它包含了...
同时,对于SMTP(Simple Mail Transfer Protocol),Mail Web开源版也进行了良好的支持,实现了邮件的发送功能。 在源码层面,Mail Web开源版的开放性为开发者提供了深入学习的机会。开发者可以通过阅读和分析源码...
本文将深入探讨如何使用JavaMail API在Java应用程序中实现发送邮件的功能,同时也会涉及验证码验证以及网页版邮件发送的实现。 首先,要发送邮件,我们需要引入JavaMail的相关库。通常,这包括`javax.mail`和`javax...
Java 组播组中发送和接受数据实例 3个目标文件。 Java读写文本文件的示例代码 1个目标文件。 java俄罗斯方块 一个目标文件。 Java非对称加密源码实例 1个目标文件 摘要:Java源码,算法相关,非对称加密 Java非...
JavaMail API是处理邮件的关键,同时,可能使用SMTP服务器进行邮件发送。系统还需要处理邮件的存储,可能涉及SQLite或MySQL数据库。此外,可能需要实现邮件的过滤和分类功能,这就需要理解正则表达式和数据挖掘的...
在IT行业中,Exchange Web Services (EWS) API 是一种用于与Microsoft Exchange Server进行通信的编程接口,它允许开发者通过各种编程语言(如Java)来执行邮件管理、日历操作、联系人同步等任务。本教程将详细介绍...
Java Web定时器主要指的是在Java Web应用程序中实现定时任务的功能,这在许多业务场景中都是必要的,例如数据备份、报表生成、邮件发送等。在Java中,我们可以利用内置的`java.util.Timer`类或者Spring框架的`@...