Java发送邮件
来源:互联网 发布:金方 绿方 知乎 编辑:程序博客网 时间:2024/06/05 21:09
Java发送邮件
由于项目需要,在网上找了一些Java发送邮件的帖子进行参考和整合,现将该功能实现的源代码贴出来,Mark!
邮件发送接口
主要有 发送模板邮件(简单)、发送模板邮件(带附件)、群发模板邮件(简单)、群发模板邮件(带附件)、发送简单邮件、群发简单邮件、发送附件邮件、群发附件邮件 的功能,根据需求调用即可;
package com.XXX.service.common;import java.io.File;import java.util.List;import java.util.Map;/** * 邮件发送接口 * * @author gewurong * @date 2016年9月28日 */public interface MailSenderService { /** * 发送模板邮件(简单) * * @param to * 收件人 * @param subject * 邮件主题 * @param templateLocation * 模板路径 * @param model * 数据源 */ void sendMailWithTemplate(String to, String subject, String templateLocation, Map<String, Object> model); /** * 发送模板邮件(带附件) * * @param to * 收件人 * @param subject * 邮件主题 * @param templateLocation * 模板路径 * @param model * 数据源 * @param attachments * 附件集合 */ void sendAttachMailWithTemplate(String to, String subject, String templateLocation, Map<String, Object> model, List<File> attachments); /** * 群发模板邮件(简单) * * @param recipients * 收件人集合 * @param subject * 邮件主题 * @param templateLocation * 模板路径 * @param model * 数据源 */ void sendMailsWithTemplate(List<String> recipients, String subject, String templateLocation, Map<String, Object> model); /** * 群发模板邮件(带附件) * * @param recipients * 收件人集合 * @param subject * 邮件主题 * @param templateLocation * 模板路径 * @param model * 数据源 * @param attachments * 附件集合 */ void sendAttachMailsWithTemplate(List<String> recipients, String subject, String templateLocation, Map<String, Object> model, List<File> attachments); /** * 发送简单邮件 * * @param to * 收件人 * @param subject * 邮件主题 * @param content * 邮件内容 */ void sendSimpleMail(String to, String subject, String content); /** * 群发简单邮件 * * @param recipients * 收件人集合 * @param subject * 邮件主题 * @param content * 邮件内容 */ void sendSimpleMails(List<String> recipients, String subject, String content); /** * 发送附件邮件 * * @param to * 收件人 * @param subject * 邮件主题 * @param content * 邮件内容 * @param attachments * 附件集合 */ void sendAttachMail(String to, String subject, String content, List<File> attachments); /** * 群发附件邮件 * * @param recipients * 收件人集合 * @param subject * 邮件主题 * @param content * 邮件内容 * @param attachments * 附件集合 */ void sendAttachMails(List<String> recipients, String subject, String content, List<File> attachments);}
邮件发送接口具体实现
package com.XXX.service.common.impl;import java.io.File;import java.util.List;import java.util.Map;import javax.annotation.Resource;import org.apache.velocity.app.VelocityEngine;import org.springframework.stereotype.Service;import org.springframework.ui.velocity.VelocityEngineUtils;import com.divingtime.service.common.MailSenderService;import com.divingtime.utilities.EmailUtils;@Servicepublic class MailSenderServiceImpl implements MailSenderService { @Resource private VelocityEngine velocityEngine; @Override public void sendMailWithTemplate(String to, String subject, String templateLocation, Map<String, Object> model) { EmailUtils emailUtils = new EmailUtils(); String mailContent = VelocityEngineUtils.mergeTemplateIntoString( velocityEngine, templateLocation, "utf-8", model); emailUtils.sendEmail(to, subject, mailContent); } @Override public void sendAttachMailWithTemplate(String to, String subject, String templateLocation, Map<String, Object> model, List<File> attachments) { EmailUtils emailUtils = new EmailUtils(); String mailContent = VelocityEngineUtils.mergeTemplateIntoString( velocityEngine, templateLocation, "utf-8", model); emailUtils.sendEmail(to, subject, mailContent, attachments); } @Override public void sendMailsWithTemplate(List<String> recipients, String subject, String templateLocation, Map<String, Object> model) { EmailUtils emailUtils = new EmailUtils(); String mailContent = VelocityEngineUtils.mergeTemplateIntoString( velocityEngine, templateLocation, "utf-8", model); emailUtils.sendEmail(recipients, subject, mailContent); } @Override public void sendAttachMailsWithTemplate(List<String> recipients, String subject, String templateLocation, Map<String, Object> model, List<File> attachments) { EmailUtils emailUtils = new EmailUtils(); String mailContent = VelocityEngineUtils.mergeTemplateIntoString( velocityEngine, templateLocation, "utf-8", model); emailUtils.sendEmail(recipients, subject, mailContent, attachments); } @Override public void sendSimpleMail(String to, String subject, String content) { EmailUtils emailUtils = new EmailUtils(); emailUtils.sendEmail(to, subject, content); } @Override public void sendSimpleMails(List<String> recipients, String subject, String content) { EmailUtils emailUtils = new EmailUtils(); emailUtils.sendEmail(recipients, subject, content); } @Override public void sendAttachMail(String to, String subject, String content, List<File> attachments) { EmailUtils emailUtils = new EmailUtils(); emailUtils.sendEmail(to, subject, content, attachments); } @Override public void sendAttachMails(List<String> recipients, String subject, String content, List<File> attachments) { EmailUtils emailUtils = new EmailUtils(); emailUtils.sendEmail(recipients, subject, content, attachments); }}
发送模板邮件用的是Velocity模板引擎,在Maven的pom.xml引入
<!-- 模板引擎 velocity related dependencies --> <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity</artifactId> <version>1.7</version> </dependency>
具体的模板文件放在resources下的templates目录中
需要了解velocity模板引擎的可百度稍微了解下就行了,.vm后缀文件,让前端写好邮件模板的html文件(尽量使用内联样式),修改后缀为vm,然后嵌套数据即可,如$nickname
邮件发送工具类
package com.XXX.utilities;import java.io.File;import java.io.IOException;import java.io.UnsupportedEncodingException;import java.security.GeneralSecurityException;import java.util.Date;import java.util.List;import java.util.Properties;import javax.activation.DataHandler;import javax.activation.DataSource;import javax.activation.FileDataSource;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.InternetAddress;import javax.mail.internet.MimeBodyPart;import javax.mail.internet.MimeMessage;import javax.mail.internet.MimeMultipart;import javax.mail.internet.MimeUtility;import org.slf4j.LoggerFactory;import ch.qos.logback.classic.Logger;import com.sun.mail.util.MailSSLSocketFactory;/** * 邮箱工具类 * * @author gewurong * @date 2016年9月20日 * */public class EmailUtils { private static String nickname;// 默认帐号昵称 private static String account;// 登录用户帐号 private static String passwd;// 登录帐号密码 private static String from;// 发件地址 private static String protocol;// 协议 private static String host;// 服务器地址 private static String port; // 端口 private static final String KEY_PROTOCOL = "mail.transport.protocol"; private static final String KEY_HOST = "mail.smtp.host"; private static final String KEY_PORT = "mail.smtp.port"; private static final String KEY_AUTH = "mail.smtp.auth"; private static final String KEY_SSL_ENABLE = "mail.smtp.ssl.enable"; private static final String KEY_SSL_SOCKETFACTORY = "mail.smtp.ssl.socketFactory"; // 会话 private Session session; private MimeMessage message; private final Logger logger = (Logger) LoggerFactory.getLogger(getClass()); // 初始化邮件属性 static { // 加载属性文件 Properties props = null; try { props = AppPropertiesUtil.getAppProps(EmailUtils.class, "conf/email.properties"); } catch (IOException e1) { e1.printStackTrace(); System.out.println("Failed:加载邮件属性文件失败!"); } nickname = props.getProperty("email.nickname"); account = props.getProperty("email.account"); passwd = props.getProperty("email.passwd"); from = props.getProperty("email.from"); protocol = props.getProperty("email.protocol"); host = props.getProperty("email.host"); port = props.getProperty("email.port"); } public EmailUtils() { Properties props = new Properties(); // 协议 props.setProperty(EmailUtils.KEY_PROTOCOL, protocol); // 服务器 props.setProperty(EmailUtils.KEY_HOST, host); // 端口 props.setProperty(EmailUtils.KEY_PORT, port); // 使用smtp身份验证 props.setProperty(EmailUtils.KEY_AUTH, "true"); // 使用腾讯企业邮箱,基于SSL // 开启安全协议 MailSSLSocketFactory sf = null; try { sf = new MailSSLSocketFactory(); sf.setTrustAllHosts(true); } catch (GeneralSecurityException e) { e.printStackTrace(); } props.put(EmailUtils.KEY_SSL_ENABLE, "true"); props.put(EmailUtils.KEY_SSL_SOCKETFACTORY, sf); session = Session.getDefaultInstance(props, new MyAuthericator(account, passwd)); session.setDebug(true);// 启动打印调试信息 message = new MimeMessage(session); } /** * 用户名密码验证, 实现抽象类Authenticator的抽象方法PasswordAuthentication */ static class MyAuthericator extends Authenticator { String user = null; String password = null; public MyAuthericator(String user, String password) { this.user = user; this.password = password; } @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(user, password); } } /** * 发送简单邮件 * * @param to * 收件人邮箱 * @param subject * 邮件主题 * @param content * 邮件内容 */ public void sendEmail(String to, String subject, String content) { try { // 发件人 message.setFrom(new InternetAddress(from, nickname));// 邮箱地址,默认帐号昵称 // 收件人 message.addRecipient(Message.RecipientType.TO, new InternetAddress( to)); // 邮件标题 message.setSubject(subject); // 邮件日期 message.setSentDate(new Date()); // 邮件内容 message.setContent(content, "text/html;charset=UTF-8"); message.saveChanges(); Transport.send(message); logger.info("发送成功: 发件人:{}|收件人:{}", from, to); } catch (UnsupportedEncodingException | MessagingException e) { e.printStackTrace(); logger.error("发送失败:{},错误信息:{}", from, e.getMessage()); } } /** * 简单邮件群发 * * @param recipients * 收件人集合 * @param subject * 邮件主题 * @param content * 邮件内容 */ public void sendEmail(List<String> recipients, String subject, String content) { try { // 发件人 message.setFrom(new InternetAddress(from, nickname));// 邮箱地址,默认帐号昵称 // 收件人 InternetAddress[] addresses = new InternetAddress[recipients.size()]; for (int i = 0; i < addresses.length; i++) { addresses[i] = new InternetAddress(recipients.get(i)); } message.addRecipients(Message.RecipientType.TO, addresses); // 邮件标题 message.setSubject(subject); // 邮件日期 message.setSentDate(new Date()); // 邮件内容 message.setContent(content, "text/html;charset=UTF-8"); message.saveChanges(); Transport.send(message); logger.info("发送成功: 发件人:{}|收件人:{}", from, addresses); } catch (UnsupportedEncodingException | MessagingException e) { e.printStackTrace(); logger.error("发送失败:{},错误信息:{}", from, e.getMessage()); } } /** * 发送带附件邮件 * * @param to * 收件人邮箱 * @param subject * 邮件主题 * @param content * 邮件内容 * @param attachments * 附件集合 */ public void sendEmail(String to, String subject, String content, List<File> attachments) { try { // 发件人 message.setFrom(new InternetAddress(from, nickname));// 邮箱地址,默认帐号昵称 // 收件人 message.addRecipient(Message.RecipientType.TO, new InternetAddress( to)); // 邮件标题 message.setSubject(subject); // 邮件日期 message.setSentDate(new Date()); // 邮件内容 Multipart multipart = new MimeMultipart(); // --邮件正文 BodyPart contentPart = new MimeBodyPart(); contentPart.setContent(content, "text/html;charset=UTF-8"); multipart.addBodyPart(contentPart); // --邮件附件 if (attachments != null) { for (File attachment : attachments) { BodyPart attachmentPart = new MimeBodyPart(); DataSource source = new FileDataSource(attachment); attachmentPart.setDataHandler(new DataHandler(source)); // 避免中文乱码 attachmentPart.setFileName(MimeUtility .encodeWord(attachment.getName())); multipart.addBodyPart(attachmentPart); } } message.setContent(multipart); message.saveChanges(); Transport.send(message); logger.info("发送成功: 发件人:{}|收件人:{}", from, to); } catch (UnsupportedEncodingException | MessagingException e) { e.printStackTrace(); logger.error("发送失败:{},错误信息:{}", from, e.getMessage()); } } /** * 群发带附件邮件 * * @param recipients * 收件人集合 * @param subject * 邮件主题 * @param content * 邮件内容 * @param attachments * 附件集合 */ public void sendEmail(List<String> recipients, String subject, String content, List<File> attachments) { try { // 发件人 message.setFrom(new InternetAddress(from, nickname));// 邮箱地址,默认帐号昵称 // 收件人 InternetAddress[] addresses = new InternetAddress[recipients.size()]; for (int i = 0; i < addresses.length; i++) { addresses[i] = new InternetAddress(recipients.get(i)); } message.addRecipients(Message.RecipientType.TO, addresses); // 邮件标题 message.setSubject(subject); // 邮件日期 message.setSentDate(new Date()); // 邮件内容 Multipart multipart = new MimeMultipart(); // --邮件正文 BodyPart contentPart = new MimeBodyPart(); contentPart.setContent(content, "text/html;charset=UTF-8"); multipart.addBodyPart(contentPart); // --邮件附件 if (attachments != null) { for (File attachment : attachments) { BodyPart attachmentPart = new MimeBodyPart(); DataSource source = new FileDataSource(attachment); attachmentPart.setDataHandler(new DataHandler(source)); // 避免中文乱码 attachmentPart.setFileName(MimeUtility .encodeWord(attachment.getName())); multipart.addBodyPart(attachmentPart); } } message.setContent(multipart); message.saveChanges(); Transport.send(message); logger.info("发送成功: 发件人:{}|收件人:{}", from, addresses); } catch (UnsupportedEncodingException | MessagingException e) { e.printStackTrace(); logger.error("发送失败:{},错误信息:{}", from, e.getMessage()); } }}
邮件属性文件email.properties
将对应属性更换为自己的就行了,本人用的是腾讯企业邮箱,另外记得开启对应邮箱的SMTP服务
email.nickname=公司名称/发送人名称、昵称等email.account=发送邮件的邮箱账号email.passwd=邮箱密码email.from=发送邮件的邮箱账号email.host=smtp.exmail.qq.comemail.port=465email.protocol=smtp
使用案例
该例子为发送模板邮件,其他功能以此类推
//嵌套数据Map<String, Object> model = new HashMap<>();model.put("mobile", admin.getMobile());model.put("nickName", admin.getNickname());//附件List<File> attachments = new ArrayList<>();file = new File("文件");attachments.add(file);//发送模板邮件mailSenderService.sendAttachMailWithTemplate("接收邮箱123456@qq.com","邮件标题", "模板路径", model,attachments);
END —我—————是—————有—————底—————线—————的
阅读全文
0 0
- [java]Java发送邮件
- java 邮件发送 --- 简单的邮件发送
- JAVA发送邮件及springboot发送邮件
- 用java发送邮件
- 用Java发送邮件
- java发送邮件源码
- java发送邮件
- Java发送邮件
- Java发送邮件程序
- java发送Email邮件
- 怎样用java发送邮件
- 利用java发送邮件
- java 邮件发送
- java邮件发送
- java邮件发送
- java定时发送邮件
- java发送邮件代码
- Java Mail 发送邮件
- [monitor] 3. Linux内核参数sysctl设置
- Java集合(一)---Java集合框架
- Spring Cloud中Hystrix仪表盘与Turbine集群监控
- javascript中的filter函数
- Spring-WebSocket实现
- Java发送邮件
- HTTP协议详解
- java并发基础(二)--- Java监视器模型、并发容器、同步工具类(闭锁、信号量)
- iOS开发之iOS11、iPhone X、Xcode9 适配指南
- 《C++ Concurrency in Action》笔记29 设计并行代码(1)
- 关于Textview maxline=1 ellipsize="end" 导致中英文数字混合分割错误的问题
- jdk8时间工具类
- BZOJ1054 移动玩具 [BFS][HASH]
- 一些常用Api