java方式邮件整体流程(最新最详细版)

xiaoxiao2025-06-01  33

邮件作为较正式的沟通方式,在项目中会经常用到,无论是通知或者是审批功能,邮件都是义不容辞.

那么项目中是发邮件的流程是什么呢?过程如下

一,项目说明:java语言. Maven项目.SSM框架:Spring+SpringMvc+Mybatis

首先需要在配置文件pom.xml中添加以下依赖

<!-- 发送邮件依赖 --> <dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4.1</version> </dependency> <!-- 读取邮件模板 --> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.19</version> </dependency>

二,整体流程

1,创建邮件基本信息类MailMessage

import java.util.List; import java.util.Map; /** * @author 李光光(编码小王子) * @date 2018年10月24日 上午10:18:17 * @version 1.0 */ public class MailMessage { private String server;// 邮件类型,eg,163邮箱还是qq邮箱 private String username;// 发件箱的用户名 private String password;// 发件箱的邮箱密码 private String nickname;// 发件箱的昵称 private String sender;// 发件箱的邮箱账号 private String receiver;// 收件人的邮箱账号 private List<String> receiverList;// 收件人的邮箱账号的列表 private String subject;// 邮件主题 private Map<String, String> map;// 邮件内容 private String templateName;// 邮件模板 //get和set方法 }

2,创建邮件基本信息类MailSender

import java.io.UnsupportedEncodingException; import java.util.List; import java.util.Properties; import javax.mail.BodyPart; 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; import javax.mail.internet.MimeUtility; /** * @author 李光光(编码小王子) * @date 2018年10月24日 上午10:21:43 * @version 1.0 */ public class MailSender { private MimeMessage mimeMsg;// 邮件对象 private Session session; // 邮件会话对象 private Properties props; // 系统属性 private Multipart mp; // Multipart对象,邮件内容,标题,附件等内容均添加到其中后再生成 private String username;// 发件人的用户名 private String password;// 发件人的密码 private String nickname;// 发件人的昵称 public MailSender(String smtpHost) { setSmtpHost(smtpHost); createMimeMessage(); } public void setSmtpHost(String hostName) { if (props == null) { props = System.getProperties(); props.put("mail.smtp.host", hostName); } } public void createMimeMessage() { // 获得邮件会话对象 session = Session.getDefaultInstance(props, null); // 创建MIME邮件对象 mimeMsg = new MimeMessage(session); mp = new MimeMultipart(); } // 设置是否身份认证 public void setNeedAuth(boolean isAuth) { if (isAuth) { props.put("mail.smtp.auth", "true"); } else { props.put("mail.smtp.auth", "false"); } } // 设置令牌口令 public void setNamePass(String userName, String password, String nickname) { this.username = userName; this.password = password; this.nickname = nickname; } // 设置主题 public void setSubject(String subject) throws UnsupportedEncodingException,MessagingException { mimeMsg.setSubject(MimeUtility.encodeText(subject, "utf-8", "B")); } // 设置内容 public void setBody(String mailBody) throws MessagingException { BodyPart bp = new MimeBodyPart(); bp.setContent("" + mailBody, "text/html;charset=utf-8"); mp.addBodyPart(bp); } // 邮件接收人 public void setReceivers(List<String> receivers) throws AddressException, MessagingException { InternetAddress[] address = new InternetAddress[receivers.size()]; for (int i = 0; i < receivers.size(); i++) { address[i] = new InternetAddress(receivers.get(i)); } mimeMsg.setRecipients(Message.RecipientType.TO, address); } // 发件人 public void setSender(String sender) throws UnsupportedEncodingException,AddressException, MessagingException { nickname = MimeUtility.encodeText(nickname, "utf-8", "B"); mimeMsg.setFrom(new InternetAddress(nickname + " <" + sender + ">")); } public void sendout() throws MessagingException { mimeMsg.setContent(mp); mimeMsg.saveChanges(); Session mailSession = Session.getInstance(props, null); Transport transport = mailSession.getTransport("smtp"); transport.connect((String) props.get("mail.smtp.host"), username,password); transport.sendMessage(mimeMsg,mimeMsg.getRecipients(Message.RecipientType.TO)); transport.close(); } }

3,创建邮件发送的工具类MailUtils

import java.io.IOException; import javax.mail.MessagingException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import freemarker.template.TemplateException; /** * @author 李光光(编码小王子) * @date 2018年10月24日 上午10:11:50 * @version 1.0 */ public class MailUtils { private static Logger logger =LoggerFactory.getLogger(MailUtils.class); public static void sendMail(MailMessage mailMessage) throws IOException, TemplateException,MessagingException { String mailBody = ""; MailSender mail = new MailSender(mailMessage.getServer()); mail.setNeedAuth(true); mail.setNamePass(mailMessage.getUsername(), mailMessage.getPassword(), mailMessage.getNickname()); // 获取邮件发送内容 mailBody = TemplateFactory.getHtmlFromFtl(mailMessage.getTemplateName(), mailMessage.getMap()); // 设置邮件发送参数 mail.setSubject(mailMessage.getSubject()); mail.setBody(mailBody); mail.setReceivers(mailMessage.getReceiverList()); mail.setSender(mailMessage.getSender()); // 发送邮件 try { mail.sendout(); logger.error("发送人" + mailMessage.getSender() + "接收人" + mailMessage.getReceiverList() + "内容" + mailBody); } catch (Exception e) { logger.error("发送邮件失败原因" + e.getMessage()); e.printStackTrace(); } } }

4,创建邮件模板,模板在项目中的位置如下:

模板具体内如如下:大家可以根据需要自行修改模板内如,模板是使用如下格式接收传值的${参数名}

<html> <head> <meta http-equiv="Content-type" content="text/html; charset=UTF-8"> <title>访客通知</title> </head> <body> <br/> <p>您好</p> <p>您为访客${visitorName}等${visitorNum}人开通了${visitTime}日预约。</p> <p>以上为系统邮件,请勿回复,谢谢.</p> <p>===================================================</p> </body> </html>

5,创建获取模板内容的工具类 TemplateFactory

import java.io.BufferedWriter; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.util.HashMap; import java.util.Map; import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException; /** * @author 李光光(编码小王子) * @date 2018年10月24日 上午10:33:19 * @version 1.0 */ public class TemplateFactory { private static String ENCODING= "UTF-8"; private static String pathPrefix ="/template";//模板路径 private static Configuration conf = new Configuration();//模板配置 static{ conf.setClassForTemplateLoading(TemplateFactory.class, pathPrefix); conf.setDefaultEncoding(ENCODING); } private static Map<String, Template> tempMap = new HashMap<String, Template>();// 邮件模板缓存池 /** *@param templateName 模板名称 *@param param 参数数据模型 */ public static String getHtmlFromFtl(String templateName,Map<String,String> param)throws TemplateException, IOException{ Template templete = null; ByteArrayOutputStream outBytes = new ByteArrayOutputStream(); BufferedWriter out = new BufferedWriter(new OutputStreamWriter(outBytes, ENCODING)); // 获取当前模板 templete = getTemplateByName(templateName); templete.setEncoding(ENCODING); templete.process(param, out); String outStr = new String(outBytes.toByteArray(), ENCODING); return outStr.toString(); } /** * @param templateName 模板名称 * */ private static Template getTemplateByName(String templateName) throws IOException { if (tempMap.containsKey(templateName)) { return tempMap.get(templateName);// 缓存中有该模板直接返回 } // 缓存中没有该模板时,生成新模板并放入缓存中 Template temp = conf.getTemplate(templateName); tempMap.put(templateName, temp); return temp; } }

6,创建发送邮件的service接口SendMailService

import com.jd.am.visit.domain.bespeak.Bespeak; /** * @author 李光光(编码小王子) * @date 2018年10月24日 上午11:22:29 * @version 1.0 */ public interface SendMailService { void sendMail(Bespeak bespeak) throws Exception; }

7,创建service层SendMailService接口的实现类SendMailServiceImpl,并在方法里调用发送邮件工具类里的方法,发送邮件

import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; /** * @author 李光光(编码小王子) * @date 2018年10月24日 上午11:25:55 * @version 1.0 */ @Service public class SendMailServiceImpl implements SendMailService { Logger logger = LoggerFactory.getLogger(this.getClass()); @Autowired private UserinfoService userinfoService; private String smtpHost = "smtp.163.com"; private String username = "邮箱账号"; private String password = "邮箱密码"; private String nickname = "邮箱账号"; private String sender = "邮箱账号"; @Override public void sendMail(Bespeak bespeak) throws Exception { MailMessage mailMessage = new MailMessage(); mailMessage.setServer(smtpHost); mailMessage.setUsername(username); mailMessage.setPassword(password); mailMessage.setNickname(nickname); mailMessage.setSender(sender); List<String> receiverList = new ArrayList<String>(); receiverList.add("接收邮箱账号"); mailMessage.setReceiverList(receiverList); mailMessage.setSubject("访客通知"); mailMessage.setTemplateName("mealEmail.ftl"); Map<String, String> param = getMailContent(); mailMessage.setMap(param); try{ //调用发送邮件的工具类中的方法,发送邮件 MailUtils.sendMail(mailMessage); } catch (Exception ex) { logger.error("发送失败" + ex.getMessage()); ex.printStackTrace(); throw new RuntimeException("邮件发送失败!"); } } private Map getMailContent(){ Map<String, String> param = new HashMap<String, String>(); param.put("visitorName", "张三"); param.put("visitorNum", "1"); return param; } }

 

转载请注明原文地址: https://www.6miu.com/read-5031098.html

最新回复(0)