Java封装好的mail包发送电子邮件的类

时间:2021-05-20

下面代码是利用Java mail包封装了一个发送邮件的类

import java.io.File;import java.util.ArrayList;import java.util.Date;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.AddressException;import javax.mail.internet.InternetAddress;import javax.mail.internet.MimeBodyPart;import javax.mail.internet.MimeMessage;import javax.mail.internet.MimeMultipart;public class SendMail { private static final String MAIL_ADDRESS_REGEX = "^[\\w\\.=-]+@[\\w\\.-]+\\.[\\w]{2,3}$"; private String mailServer; private String sender; private String[] receiver; public SendMail(){ } public void setMailBasicInfo(String mailServer,String sender,String receiver){ this.mailServer = mailServer; this.sender = sender; this.receiver =receiver.split(","); } public void setMailBasicInfo(String mailServer,String sender,String[] users){ this.mailServer = mailServer; this.sender = sender; this.receiver = users; } public void setMailBasicInfo(String mailServer,String sender,List<String> users){ this.mailServer = mailServer; this.sender = sender; this.receiver = new String[users.size()]; users.toArray(this.receiver); } public boolean send(String subject, String content, List<String> fileNames) { subject = subject==null?"":subject; content = content==null?"":content; Properties props = new Properties(); props.put("mail.smtp.host", mailServer); Session session = Session.getInstance(props, null); try { InternetAddress[] receiver = getReceiverList(); if (receiver.length == 0) { System.out.println("receiver is null"); return false; } MimeMessage msg = new MimeMessage(session); msg.setFrom(new InternetAddress(sender)); msg.setRecipients(Message.RecipientType.TO, receiver); msg.setSubject(subject); msg.setSentDate(new Date()); Multipart container = new MimeMultipart(); MimeBodyPart textBodyPart = new MimeBodyPart(); textBodyPart.setContent(content.toString(), "text/html;charset=gbk"); container.addBodyPart(textBodyPart); doAttachFile(container,fileNames); msg.setContent(container); System.out.println("begin send mail"); Transport.send(msg); System.out.println("send mail success"); } catch (MessagingException e) { System.out.println("send mail fail"); System.out.println(e); return false; } catch(Exception e){ return false; } return true; } public boolean send(String subject, String content){ return send(subject,content,null); } public boolean send(String subject){ return send(subject,null); } private void doAttachFile(Multipart container, List<String> fileNames) throws MessagingException{ if(fileNames==null || fileNames.size()==0) return; for(String filename:fileNames){ File f = new File(filename); if(!f.isFile()) continue; System.out.println("the attach file is:"+filename); MimeBodyPart fileBodyPart = new MimeBodyPart(); FileDataSource fds = new FileDataSource(f);// 要发送的附件地址 fileBodyPart.setDataHandler(new DataHandler(fds)); fileBodyPart.setFileName(fds.getName());// 设置附件的名称 container.addBodyPart(fileBodyPart); } } private InternetAddress[] getReceiverList() throws AddressException { ArrayList<InternetAddress> toList = new ArrayList<InternetAddress>(); for (int i = 0; i < receiver.length; ++i) { if (receiver[i].matches(MAIL_ADDRESS_REGEX)) { toList.add(new InternetAddress(receiver[i])); } } return (InternetAddress[]) toList.toArray(new InternetAddress[toList.size()]); }}

使用举例

String host = "168.xx.xx.xx"; //邮件服务器的地址String subject = "发送邮件的主题";String sender = "test@gmail.com";List<String> receivers = new ArrayList<String>();receivers.add("user1@263.com");receivers.add("user2@263.com");String content = "邮件主题";SendMail sendMail = new SendMail();sendMail.setMailBasicInfo(host, sender, receivers);sendMail.send(subject, content, null); //没有附件

正文也可以是html内容,如

String content = "<html>详细信息:<a href='xxxx'>请点击查看!</a></html>";

我们再来看一个封装好的类

package com.message.base.email; import com.message.base.spring.ApplicationHelper;import com.message.base.utils.StringUtils;import com.message.base.utils.ValidateUtils;import org.slf4j.Logger;import org.slf4j.LoggerFactory; import javax.mail.*;import javax.mail.internet.InternetAddress;import javax.mail.internet.MimeMessage;import java.util.Collections;import java.util.Date;import java.util.List;import java.util.Properties; /** * 发送邮件服务器. * * @author sunhao(sunhao.java@gmail.com) * @version V1.0, 13-3-25 上午6:19 */public class EmailServer { private static final Logger logger = LoggerFactory.getLogger(EmailServer.class); //spring中配置 /**邮箱服务器配置**/ private List<EmailConfig> config; /**是否开启debug调试模式**/ private boolean isDebug = false; /**是否启用身份验证**/ private boolean isAuth = true; /**验证类型**/ private String authType = "auth"; /** * 私有化默认构造器,使外部不可实例化 */ private EmailServer(){} /** * 单例,保证上下文中只有一个EmailServer * * @return EmailServer */ public static EmailServer getInstance(){ return ApplicationHelper.getInstance().getBean(EmailServer.class); } /** * 发送普通邮件(单个接收人) * * @param username 发件人用户名 * @param password 发件人密码 * @param title 邮件标题 * @param content 邮件正文 * @param receiver 单个接收人 * @return */ public boolean sendTextMail(String username, String password, String title, String content, String receiver){ return this.sendTextMail(username, password, title, content, Collections.singletonList(receiver)); } /** * 发送普通邮件(多个接收人) * * @param username 发件人用户名 * @param password 发件人密码 * @param title 邮件标题 * @param content 邮件正文 * @param receivers 多个接收人 * @return */ public boolean sendTextMail(String username, String password, String title, String content, List<String> receivers){ Authentication auth = null; if(this.isAuth()){ //如果需要身份认证,则创建一个密码验证器 auth = new Authentication(username, password); } Properties props = new Properties(); props.setProperty("mail.smtp.auth", this.isAuth() ? "true" : "false"); props.setProperty("mail.transport.protocol", "auth"); EmailConfig config = this.getEmailConfig(username); props.setProperty("mail.smtp.host", config.getSmtp()); props.setProperty("mail.smtp.port", config.getPort() + ""); // 根据邮件会话属性和密码验证器构造一个发送邮件的session Session session = Session.getDefaultInstance(props, auth); session.setDebug(this.isDebug); Message message = this.makeTextMail(session, title, content, username, receivers, false); try { Transport.send(message); return true; } catch (MessagingException e) { logger.error(e.getMessage(), e); return false; } } /** * 发送HTML邮件(单个接收人) * * @param username 发件人用户名 * @param password 发件人密码 * @param title 邮件标题 * @param content 邮件正文 * @param receiver 单个接收人 * @return */ public boolean sendHtmlMail(String username, String password, String title, String content, String receiver){ return this.sendHtmlMail(username, password, title, content, Collections.singletonList(receiver)); } /** * 发送HTML邮件(多个接收人) * * @param username 发件人用户名 * @param password 发件人密码 * @param title 邮件标题 * @param content 邮件正文 * @param receivers 多个接收人 * @return */ public boolean sendHtmlMail(String username, String password, String title, String content, List<String> receivers){ Authentication auth = null; if(this.isAuth()){ //如果需要身份认证,则创建一个密码验证器 auth = new Authentication(username, password); } Properties props = new Properties(); props.setProperty("mail.smtp.auth", this.isAuth() ? "true" : "false"); props.setProperty("mail.transport.protocol", "auth"); EmailConfig config = this.getEmailConfig(username); props.setProperty("mail.smtp.host", config.getSmtp()); props.setProperty("mail.smtp.port", config.getPort() + ""); // 根据邮件会话属性和密码验证器构造一个发送邮件的session Session session = Session.getDefaultInstance(props, auth); session.setDebug(this.isDebug); Message message = this.makeTextMail(session, title, content, username, receivers, true); try { Transport.send(message); return true; } catch (MessagingException e) { logger.error(e.getMessage(), e); return false; } } /** * 获取邮件服务器配置 * * @param email 邮箱地址 * @return */ private EmailConfig getEmailConfig(String email){ String mailServiceDomainName = this.getMailServiceDomainName(email); for(EmailConfig config : this.config) { if(config.getName().equals(mailServiceDomainName)){ return config; } } return null; } /** * 创建邮件message * * @param session 根据配置获得的session * @param title 邮件主题 * @param content 邮件的内容 * @param from 发件者 * @param receivers 收件者 * @param isHtmlMail 是否是html邮件 */ private Message makeTextMail(Session session, String title, String content, String from, List<String> receivers, boolean isHtmlMail){ Message message = new MimeMessage(session); try { /**标题**/ logger.info("this mail's title is {}", title); message.setSubject(title); /**内容**/ logger.info("this mail's content is {}", content); if(isHtmlMail){ //是html邮件 message.setContent(content, "text/html;charset=utf-8"); } else { //普通邮件 message.setText(content); } /**发件者地址**/ logger.info("this mail's sender is {}", from); Address fromAddress = new InternetAddress(from); message.setFrom(fromAddress); /**接收者地址**/ Address[] tos = new InternetAddress[receivers.size()]; for(int i = 0; i < receivers.size(); i++){ String receiver = receivers.get(i); if(ValidateUtils.isEmail(receiver)){ tos[i] = new InternetAddress(receiver); } } /**发件时间**/ message.setSentDate(new Date()); message.setRecipients(Message.RecipientType.TO, tos); } catch (MessagingException e) { logger.error(e.getMessage(), e); e.printStackTrace(); } return message; } /** * 获取邮箱域名 * * @param email 邮箱 * @return */ private String getMailServiceDomainName(String email){ if(StringUtils.isEmpty(email)){ return ""; } else { int firstIndex = StringUtils.indexOf(email, "@"); int secondIndex = StringUtils.lastIndexOf(email, "."); return StringUtils.substring(email, firstIndex + 1, secondIndex); } } public List<EmailConfig> getConfig() { return config; } public void setConfig(List<EmailConfig> config) { this.config = config; } public boolean isDebug() { return isDebug; } public void setDebug(boolean debug) { isDebug = debug; } public boolean isAuth() { return isAuth; } public void setAuth(boolean auth) { isAuth = auth; } public String getAuthType() { return authType; } public void setAuthType(String authType) { this.authType = authType; }}

调用方式如下

public boolean sendMail() throws Exception { List<String> receivers = new ArrayList<String>(); receivers.add("sunhao0550@163.com"); receivers.add("sunhao0550@sina.cn"); EmailServer.getInstance().sendHtmlMail("message_admin@163.com", "这里是密码", "测试发送HTML邮件", "<span style='color: red;font-size: 20pt'>测试发送HTML邮件</span><a href='http://", "这里是密码", "测试发送文本邮件", "测试发送文本邮件测试发送文本邮件测试发送文本邮件", receivers);}

PS:正在考虑扩展,如果把这几个类封在jar包中,如何进行邮件服务器配置的扩展.

如有不好之处,欢迎拍砖.

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章