邮件的基本信息类
@DatapublicclassJavaMailInfo{/**
* 使用java mail 发送邮件 邮件的协议有SMTP POP IMAP MIME 等 协议具体内容可自行百度 SMTP 为简单邮件传输协议 比较常用
*/// 邮件服务器地址privateString mailSeverHost;// 邮件服务器端口privateString mailServerPort;// 邮件发送者privateString fromAddress;// 发送者用户名privateString userName;// 发送者密码privateString password;// 收件人地址privateString toAddress;// 邮件主题privateString subject;// 邮件内容privateString content;// 图片地址集合privateList photoUrlList;// 附件地址集合privateList attachList;/** * 获取邮件会话属性 ,对邮件Session进行设置 此部分的内容可以通过加载配置文件的方式进行设置 *@return*/publicPropertiesgetProperties(){ Properties properties =newProperties(); properties.put("mail.transport.protocol","smtp");// 连接协议properties.put("mail.smtp.host",this.mailSeverHost);// 主机名properties.put("mail.smtp.port",this.mailServerPort);// 端口号properties.put("mail.smtp.auth","true");//设置smtp是否需要认证properties.put("mail.smtp.ssl.enable","true");// 设置是否使用ssl安全连接 ---一般都使用properties.put("mail.debug","true");// 设置是否显示debug信息 true 会在控制台显示相关信息properties.put("mail.smtp.timeout",20000);// 超时时间returnproperties; }}
权限认证类
@Data@NoArgsConstructor@AllArgsConstructorpublicclassMyJavaMailAuthenticatorextendsAuthenticator{privateString userName =null;privateString password =null;/**
* 此类用于储存授权时使用的用户名和密码 用于构建邮件Session对象 便于需要认证时邮件Session知道需要使用哪个类验证
* 以用户名、密码的方式访问那些受到保护的资源,在这里“资源”就是指邮件服务器
* 自定义的类需要继承Authenticator类 重写getPasswordAuthentication() 方法 注意导包 需要使用javax.mail包下的相关类
*/@OverrideprotectedPasswordAuthenticationgetPasswordAuthentication(){returnnewPasswordAuthentication(this.userName,this.password); }}
发送邮件工具类
publicclassJavaMailSendUtils{/** * 实际使用 *@paramargs */publicstaticvoidmain(String[] args){ JavaMailInfo javaMailInfo =newJavaMailInfo(); javaMailInfo.setMailSeverHost("smtp.qq.com"); javaMailInfo.setMailServerPort("465");// 465或587(使用ssl)javaMailInfo.setFromAddress("发件人"); javaMailInfo.setUserName("您邮箱用户名"); javaMailInfo.setPassword("您邮箱授权码");// 密码需要使用对应邮箱的授权码授权码javaMailInfo.setToAddress("收件人"); javaMailInfo.setSubject("邮件主题"); javaMailInfo.setContent("邮件内容"); List photoUrlList =newArrayList<>(); photoUrlList.add("图片1"); photoUrlList.add("图片2"); javaMailInfo.setPhotoUrlList(photoUrlList); List attachList =newArrayList<>(); attachList.add("附件1"); attachList.add("附件2"); javaMailInfo.setAttachList(attachList); sendJavaMail(javaMailInfo); }/**
* 此工具类可根据邮件基本信息进行邮件的发送
*//** * 发送邮件方法 *@paramjavaMailInfo *@return*/publicstaticbooleansendJavaMail(JavaMailInfo javaMailInfo){// 获取邮件session的相关配置参数Properties properties = javaMailInfo.getProperties();// 创建授权验证类MyJavaMailAuthenticator myJavaMailAuthenticator =newMyJavaMailAuthenticator(); myJavaMailAuthenticator.setUserName(javaMailInfo.getUserName()); myJavaMailAuthenticator.setPassword(javaMailInfo.getPassword());// 构建邮件Session会话对象 带不带default均可 查看源码可知 带default的是获取该类的属性 不带获取的是新创建的Session mailSession = Session.getDefaultInstance(properties, myJavaMailAuthenticator);// 开启debug properties中设置了此处就无须设置// mailSession.setDebug(true);// 邮差对象 也可使用静态方法进行发送Transport transport =null;try{// 获取消息 也就是发送的内容// Message message = createSimpleMail(mailSession, javaMailInfo);// Message message = createImageMail(mailSession, javaMailInfo);// Message message = createAttachMail(mailSession, javaMailInfo);Message message = createPhotoAndAttachMail(mailSession, javaMailInfo);// 设置规范 具体是什么规范呢? 固定写法MailcapCommandMap defaultCommandMap = (MailcapCommandMap) CommandMap.getDefaultCommandMap(); defaultCommandMap.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html"); defaultCommandMap.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml"); defaultCommandMap.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain"); defaultCommandMap.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed"); defaultCommandMap.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822"); CommandMap.setDefaultCommandMap(defaultCommandMap);// 发送邮件 Transport.send(message); 或者获取Transport对象发送transport = mailSession.getTransport(); transport.connect(javaMailInfo.getUserName(), javaMailInfo.getUserName()); transport.sendMessage(message, message.getAllRecipients()); System.out.println("邮件发送成功");returntrue; }catch(MessagingException e) { e.printStackTrace(); System.out.println("邮件发送失败");returnfalse; }finally{if(null!= transport) {try{ transport.close(); }catch(MessagingException e) { e.printStackTrace(); } } } }/** * 根据邮件Session和邮件信息创建邮件内容(文本类 html) *@parammailSession *@paramjavaMailInfo *@return*/privatestaticMessagecreateSimpleMail(Session mailSession, JavaMailInfo javaMailInfo)throwsMessagingException{/**
* Message是一 个抽象类,我们使用MimeMessage这个子类, 该类是使用MIME类型、MIME信息头的 邮箱信息
* 信息头只能使用US-ASCII字符,而非ASCII字符将通过编码转换为ASCII的方式使用
*/// 根据邮件session创建消息对象MimeMessage mimeMessage =newMimeMessage(mailSession);// 设置发件人 setFrom 和 setReplyTo 均可 有多个发件人使用 addFroms(Address[] addresses)mimeMessage.setFrom(newInternetAddress(javaMailInfo.getFromAddress()));// 设置收件人 收件人类型 Message.RecipientType.TO(接受者) Message.RecipientType.CC(抄送着) Message.RecipientType.BCC(密送者)// setRecipients(Message.RecipientType var1, Address[] var2) 设置多个收件人mimeMessage.setRecipient(Message.RecipientType.TO,newInternetAddress(javaMailInfo.getToAddress()));// 设置标题mimeMessage.setSubject(javaMailInfo.getSubject(),"text/plain;charset=utf-8");// 设置内容 是文本可直接使用setText()mimeMessage.setContent(javaMailInfo.getContent(),"text/html;charset=utf-8");// 设置发送时间mimeMessage.setSentDate(newDate()); mimeMessage.saveChanges();returnmimeMessage; }/** * 根据邮件Session和邮件信息创建邮件内容(图片类 可多个图片) *@parammailSession *@paramjavaMailInfo *@return*/privatestaticMessagecreateImageMail(Session mailSession, JavaMailInfo javaMailInfo)throwsMessagingException{/**
* Message表示一个邮件,messgaes.getContent()返回一个Multipart对象。一个Multipart对象包含一个或多个BodyPart对象,来组成邮件的正文部分(包括附件)
* Multipart的content-type
* 总体来说,MIME消息由消息头和消息体两大部分组成。现在我们关注的是MIME邮件,因此在以下的讨论中姑且称“消息”为“邮件”。
* 邮件头包含了发件人、收件人、主题、时间、MIME版本、邮件内容的类型等重要信息。每条信息称为一个域,由域名后加“: ”和信息内容构成,可以是一行,较长的也可以占用多行。
* 域的首行必须“顶头”写,即左边不能有空白字符(空格和制表符);续行则必须以空白字符打头,且第一个空白字符不是信息本身固有的,解码时要过滤掉。
* 邮件体包含邮件的内容,它的类型由邮件头的“Content-Type”域指出。常见的简单类型有text/plain(纯文本)和text/html(超文本)。有时也会出现的multipart类型,是MIME邮件的精髓。
* 邮件体被分为多个段,每个段又包含段头和段体两部分,这两部分之间也以空行分隔。常见的multipart类型有三种:multipart/mixed, multipart/related和multipart/alternative。
* multipart/mixed:附件。
* multipart/related:内嵌资源。
* multipart/alternative:纯文本与超文本共存。
*/MimeMessage mimeMessage =newMimeMessage(mailSession); mimeMessage.setFrom(newInternetAddress(javaMailInfo.getFromAddress())); mimeMessage.setRecipient(Message.RecipientType.TO,newInternetAddress(javaMailInfo.getToAddress())); mimeMessage.setSubject(javaMailInfo.getSubject(),"text/plain;charset=utf-8"); List photoUrlList = javaMailInfo.getPhotoUrlList();// 创建消息体 以下方式每个图片都有一个标题MimeMultipart mimeMultipart =newMimeMultipart();if(!CollectionUtils.isEmpty(photoUrlList)) {for(String photoUrl : photoUrlList) { MimeBodyPart text =newMimeBodyPart();// 设置图片标题 注意img标签的引用位置 用cid:开头String cid = UUID.randomUUID().toString(); text.setContent(javaMailInfo.getContent() +"
","text/html;charset=utf-8");// 使用数据处理器处理图片MimeBodyPart image =newMimeBodyPart(); image.setDataHandler(newDataHandler(newFileDataSource(photoUrl))); image.setContentID(cid);// 描述正文和图片的关系MimeMultipart photo =newMimeMultipart(); photo.addBodyPart(text); photo.addBodyPart(image); photo.setSubType("related"); MimeBodyPart mimeBodyPart =newMimeBodyPart(); mimeBodyPart.setContent(photo);// 将图片放入body中mimeMultipart.addBodyPart(mimeBodyPart); } }/*// 以下方式所有图片公用一个标题
MimeMultipart photo = new MimeMultipart();
MimeBodyPart text = new MimeBodyPart();
photo.addBodyPart(text);
StringBuilder textContent = new StringBuilder(javaMailInfo.getContent());
if (!CollectionUtils.isEmpty(photoUrlList)) {
for (String photoUrl : photoUrlList) {
// 设置图片标题 注意img标签的引用位置 用cid:开头
String cid = UUID.randomUUID().toString();
textContent.append("
");
// 使用数据处理器处理图片
MimeBodyPart image = new MimeBodyPart();
image.setDataHandler(new DataHandler(new FileDataSource(photoUrl)));
image.setContentID(cid);
// 描述正文和图片的关系
photo.addBodyPart(image);
}
photo.setSubType("related");
}
text.setContent(textContent.toString(), "text/html;charset=utf-8");*/// 设置消息体mimeMessage.setContent(mimeMultipart);// mimeMessage.setContent(photo);mimeMessage.setSentDate(newDate()); mimeMessage.saveChanges();returnmimeMessage; }/** * 根据邮件Session和邮件信息创建邮件内容(附件类 可多个附件) *@parammailSession *@paramjavaMailInfo *@return*/privatestaticMessagecreateAttachMail(Session mailSession, JavaMailInfo javaMailInfo)throwsMessagingException{ MimeMessage mimeMessage =newMimeMessage(mailSession); mimeMessage.setFrom(newInternetAddress(javaMailInfo.getFromAddress())); mimeMessage.setRecipient(Message.RecipientType.TO,newInternetAddress(javaMailInfo.getToAddress())); mimeMessage.setSubject(javaMailInfo.getSubject(),"text/plain;charset=utf-8"); List attachList = javaMailInfo.getAttachList();// 创建消息体MimeMultipart mimeMultipart =newMimeMultipart(); MimeBodyPart text =newMimeBodyPart(); text.setContent(javaMailInfo.getSubject(),"text/html;charset=utf-8"); mimeMultipart.addBodyPart(text);if(!CollectionUtils.isEmpty(attachList)) {for(String attach : attachList) {// 创建附件MimeBodyPart mimeBodyPart =newMimeBodyPart(); DataHandler dataHandler =newDataHandler(newFileDataSource(attach)); mimeBodyPart.setDataHandler(dataHandler); mimeBodyPart.setFileName(dataHandler.getName());// 加入最外面的容器mimeMultipart.addBodyPart(mimeBodyPart); }// 描述关系mimeMultipart.setSubType("mixed"); } mimeMessage.setContent(mimeMultipart); mimeMessage.setSentDate(newDate()); mimeMessage.saveChanges();returnmimeMessage; }/** * 根据邮件Session和邮件信息创建邮件内容(多图片 多附件) *@parammailSession *@paramjavaMailInfo *@return*/privatestaticMessagecreatePhotoAndAttachMail(Session mailSession, JavaMailInfo javaMailInfo)throwsMessagingException{ MimeMessage mimeMessage =newMimeMessage(mailSession); mimeMessage.setFrom(newInternetAddress(javaMailInfo.getFromAddress())); mimeMessage.setRecipient(Message.RecipientType.TO,newInternetAddress(javaMailInfo.getToAddress())); List photoUrlList = javaMailInfo.getPhotoUrlList();// 获取所有的图片 公用一个主题MimeMultipart photo =newMimeMultipart(); MimeBodyPart text =newMimeBodyPart(); photo.addBodyPart(text); StringBuilder textContent =newStringBuilder(javaMailInfo.getContent());if(!CollectionUtils.isEmpty(photoUrlList)) {for(String photoUrl : photoUrlList) {// 设置图片标题 注意img标签的引用位置 用cid:开头String cid = UUID.randomUUID().toString(); textContent.append("
");// 使用数据处理器处理图片MimeBodyPart image =newMimeBodyPart(); image.setDataHandler(newDataHandler(newFileDataSource(photoUrl))); image.setContentID(cid);// 描述正文和图片的关系photo.addBodyPart(image); } photo.setSubType("related"); } text.setContent(textContent.toString(),"text/html;charset=utf-8");// 将图片包裹成一个body 作为 其内容MimeBodyPart content =newMimeBodyPart(); content.setContent(photo);// 获取所有的附件List attachList = javaMailInfo.getAttachList(); MimeMultipart attach =newMimeMultipart();if(!CollectionUtils.isEmpty(attachList)) {for(String attachUrl : attachList) {// 创建附件MimeBodyPart mimeBodyPart =newMimeBodyPart(); DataHandler dataHandler =newDataHandler(newFileDataSource(attachUrl)); mimeBodyPart.setDataHandler(dataHandler); mimeBodyPart.setFileName(dataHandler.getName());// 加入最外面的容器attach.addBodyPart(mimeBodyPart); } }// 将图片body 和 附件组合attach.addBodyPart(content); attach.setSubType("mixed"); mimeMessage.setContent(attach); mimeMessage.setSentDate(newDate()); mimeMessage.saveChanges();returnmimeMessage; }}
三、使用spring的JavaMailSender发送邮件(简单,带图片,带附件,带图片和附件,freemarker模板)
spring提供的JavaMailSender是对原始的javax.mail进行了简化
再其使用过程中可以注册到spring容器中,也可不用注册
导入依赖
javax.mail的依赖包org.springframeworkspring-context-support
邮件的基本信息类
@DatapublicclassJavaMailSenderInfo{// 收件人地址privateString toAddress;// 邮件主题privateString subject;// 邮件内容privateString content;// 是否是html 注意字段boolean类型 不要用is开头 idea会生成get,set方法会进行优化 isHtml -> isHtml(),getHtml() -- html -> isHtml(),getHtml()privatebooleanhtml =false;// 图片地址集合privateList photoList;// 附件地址集合privateList attachList;}
准备mail.propertise配置文件(也就是设置会话的属性),文件放在resource目录下
#传输协议mail.transport.protocol=smtp#服务器主机名mail.smtp.host=smtp.qq.com#服务器端口号 465或587(使用ssl)mail.smtp.port=465#是否进行用户名密码校验 配置了否 就不能配置 用户名和密码 否则会去获取用户名密码进行验证mail.smtp.auth=true#设置是否使用ssl安全连接 ---一般都使用mail.smtp.ssl.enable=true#设置是否显示debug信息 true 会在控制台显示相关信息mail.debug=true#设置超时时间mail.smtp.timeout=20000#编码格式mail.smtp.defaultEncoding=utf-8#你的邮箱地址[email protected]#你的授权码(第三方使用时代替密码)mail.smtp.password=xxxxxx
加载配置文件,初始化JavaMailSender
publicclassInitJavaMailSender{/** * 此类的作用是加载配置文件来创建JavaMailSender对象 JavaMailSenderImpl是该接口的实现类 * 因此我们需要对JavaMailSenderImpl进行配置 在spring的环境下 我们可以使用加载配置文件的方式 或者 * 在spring配置文件中直接配置该bean(由spring托管)使用时@Autowired直接注入即可 * * * * * * * * ${mail.smtp.auth} * ${mail.smtp.timeout} * ... * * * * 本次采用加载配置文件的方式 * 由spring提供 其底层使用的仍然是javax.mail进行邮件的发送 * JavaMailSenderImpl 依赖javax.mail 和 spring-context-support包 */// 传输协议privatestaticString protocol;// 服务器主机名privatestaticString host;// 服务器端口号privatestaticString port;// 是否进行用户名密码校验privatestaticString auth;// 设置是否使用ssl安全连接privatestaticString enableSSL;// 设置是否显示debug信息privatestaticString debug;// 超时时间privatestaticString timeout;// 编码格式privatestaticString defaultEncoding;// 邮箱地址publicstaticString username;// 授权码privatestaticString password;privatestaticJavaMailSenderImpl javaMailSenderImpl;static{ init(); }privatestaticvoidinit(){// 加载配置文件Properties properties =newProperties(); InputStream resourceAsStream = JavaMailSender.class.getClassLoader().getResourceAsStream("mail.properties");try{ properties.load(resourceAsStream); protocol = properties.getProperty("mail.transport.protocol"); host = properties.getProperty("mail.smtp.host"); port = properties.getProperty("mail.smtp.port"); auth = properties.getProperty("mail.smtp.auth"); enableSSL = properties.getProperty("mail.smtp.ssl.enable"); debug = properties.getProperty("mail.debug"); timeout = properties.getProperty("mail.smtp.timeout"); defaultEncoding = properties.getProperty("mail.smtp.defaultEncoding"); username = properties.getProperty("mail.smtp.username"); password = properties.getProperty("mail.smtp.password"); System.out.println("mail.properties加载成功"); }catch(IOException e) { e.printStackTrace(); System.out.println("mail.properties加载失败"); }finally{if(null!= resourceAsStream) {try{ resourceAsStream.close(); }catch(IOException e) { e.printStackTrace(); } } } }/** * 使用单例获取JavaMailSender 双重检查既保证的线程安全 又保证了效率 又能起到延迟加载的作用 *@return*/publicstaticJavaMailSendergetJavaMailSender(){if(null== javaMailSenderImpl) {synchronized(InitJavaMailSender.class) {if(null== javaMailSenderImpl) { javaMailSenderImpl =newJavaMailSenderImpl(); javaMailSenderImpl.setProtocol(protocol); javaMailSenderImpl.setHost(host); javaMailSenderImpl.setPort(Integer.parseInt(port)); javaMailSenderImpl.setDefaultEncoding(defaultEncoding); javaMailSenderImpl.setUsername(username); javaMailSenderImpl.setPassword(password); Properties properties =newProperties(); properties.setProperty("mail.smtp.auth", auth); properties.setProperty("mail.smtp.ssl.enable", enableSSL); properties.setProperty("mail.debug", debug); properties.setProperty("mail.smtp.timeout", timeout); javaMailSenderImpl.setJavaMailProperties(properties); } } }returnjavaMailSenderImpl; }}
邮件发送工具类
publicclassJavaMailSenderUtils{/** * 测试发送邮件 实际中可以在service中使用(若使用的spring配置的方式创建JavaMailSender,则需注入使用) * 此处为方便使用main方法 *@paramargs */publicstaticvoidmain(String[] args){ JavaMailSenderInfo javaMailSenderInfo =newJavaMailSenderInfo(); javaMailSenderInfo.setToAddress("发件人"); javaMailSenderInfo.setSubject("邮件主题"); javaMailSenderInfo.setContent("邮件内容"); javaMailSenderInfo.setHtml(true); List list =newArrayList<>(); list.add("图片1");// list.add("图片2");// list.add("图片3");// list.add("图片4");javaMailSenderInfo.setPhotoList(list); javaMailSenderInfo.setAttachList(list);// JavaMailSenderUtils.sendSimpleMail(javaMailSenderInfo);JavaMailSenderUtils.sendPhotoMail(javaMailSenderInfo);// JavaMailSenderUtils.sendAttacheMail(javaMailSenderInfo);// JavaMailSenderUtils.sendPhotoAndAttacheMail(javaMailSenderInfo);}privatestaticfinalJavaMailSender javaMailSender = InitJavaMailSender.getJavaMailSender();privatestaticfinalString htmlStartStr ="
";privatestaticfinalString htmlEndStr ="";/** * 发送简单邮件 文本 html *@paramjavaMailSenderInfo *@return*/publicstaticbooleansendSimpleMail(JavaMailSenderInfo javaMailSenderInfo){// 创建邮件消息 简单邮件可直接使用SimpleMailMessageMimeMessage mimeMessage = javaMailSender.createMimeMessage(); MimeMessageHelper mimeMessageHelper =null;try{// 创建消息辅助器 参数二 为true时为多组件 html 等mimeMessageHelper =newMimeMessageHelper(mimeMessage,true,"utf-8");// 设置公共字段setMailCommonField(mimeMessageHelper, javaMailSenderInfo);// 文本内容 可指定是否是htmlmimeMessageHelper.setText(javaMailSenderInfo.getContent(), javaMailSenderInfo.isHtml()); javaMailSender.send(mimeMessage); System.out.println("简单邮件发送成功");returntrue; }catch(MessagingException e) { e.printStackTrace(); System.out.println("简单邮件发送失败");returnfalse; } }/** * 发送带图片的邮件 *@paramjavaMailSenderInfo *@return*/publicstaticbooleansendPhotoMail(JavaMailSenderInfo javaMailSenderInfo){// 创建邮件消息 简单邮件可直接使用SimpleMailMessageMimeMessage mimeMessage = javaMailSender.createMimeMessage(); MimeMessageHelper mimeMessageHelper =null;try{ mimeMessageHelper =newMimeMessageHelper(mimeMessage,true,"utf-8"); setMailCommonField(mimeMessageHelper, javaMailSenderInfo); List photoList = javaMailSenderInfo.getPhotoList();// html内容StringBuilder text =newStringBuilder(htmlStartStr); text.append(javaMailSenderInfo.getContent());if(!CollectionUtils.isEmpty(photoList)) {for(String photo : photoList) {// 每个图片创建一个标题吧 每个图片关联一个cidString cid = UUID.randomUUID().toString(); text.append(""+ javaMailSenderInfo.getSubject() +"
"); mimeMessageHelper.addInline(cid,newFile(photo)); } }// 为什么会有最后一个图片图裂不显示的问题(求大佬指点)// String cid = UUID.randomUUID().toString();// mimeMessageHelper.addInline(cid, new File(""));text.append(htmlEndStr); mimeMessageHelper.setText(text.toString(),true); javaMailSender.send(mimeMessage); System.out.println("带图片的邮件发送成功");returntrue; }catch(MessagingException e) { e.printStackTrace(); System.out.println("带图片的邮件发送失败");returnfalse; } }/** * 发送带附件的邮件 *@paramjavaMailSenderInfo *@return*/publicstaticbooleansendAttacheMail(JavaMailSenderInfo javaMailSenderInfo){// 创建邮件消息 简单邮件可直接使用SimpleMailMessageMimeMessage mimeMessage = javaMailSender.createMimeMessage(); MimeMessageHelper mimeMessageHelper =null;try{ mimeMessageHelper =newMimeMessageHelper(mimeMessage,true,"utf-8"); setMailCommonField(mimeMessageHelper, javaMailSenderInfo); List attachList = javaMailSenderInfo.getAttachList();// 邮件文本mimeMessageHelper.setText(javaMailSenderInfo.getContent(), javaMailSenderInfo.isHtml());if(!CollectionUtils.isEmpty(attachList)) {for(String attach : attachList) {// 添加附件(最后一个附件是图片也存在图裂的问题,但可下载使用,求大佬指点)FileSystemResource fileSystemResource =newFileSystemResource(attach);// 参数一为附件名称mimeMessageHelper.addAttachment(fileSystemResource.getFilename(), fileSystemResource); } } javaMailSender.send(mimeMessage); System.out.println("带附件的邮件发送成功");returntrue; }catch(MessagingException e) { e.printStackTrace(); System.out.println("带附件的邮件发送失败");returnfalse; } }/** * 发送带图片和附件的邮件 *@paramjavaMailSenderInfo *@return*/publicstaticbooleansendPhotoAndAttacheMail(JavaMailSenderInfo javaMailSenderInfo){// 创建邮件消息 简单邮件可直接使用SimpleMailMessageMimeMessage mimeMessage = javaMailSender.createMimeMessage(); MimeMessageHelper mimeMessageHelper =null;try{ mimeMessageHelper =newMimeMessageHelper(mimeMessage,true,"utf-8"); setMailCommonField(mimeMessageHelper, javaMailSenderInfo); List photoList = javaMailSenderInfo.getPhotoList();// 放入图片和内容StringBuilder text =newStringBuilder(htmlStartStr + javaMailSenderInfo.getContent());if(!CollectionUtils.isEmpty(photoList)) {for(String photo : photoList) { String cid = UUID.randomUUID().toString(); text.append("
"); mimeMessageHelper.addInline(cid,newFile(photo)); } } text.append(htmlEndStr); mimeMessageHelper.setText(text.toString(),true);// 放入附件List attachList = javaMailSenderInfo.getAttachList();if(!CollectionUtils.isEmpty(attachList)) {for(String attach : attachList) {// 添加附件FileSystemResource fileSystemResource =newFileSystemResource(attach);// 参数一为附件名称mimeMessageHelper.addAttachment(fileSystemResource.getFilename(), fileSystemResource); } } javaMailSender.send(mimeMessage); System.out.println("带图片和附件的邮件发送成功");returntrue; }catch(MessagingException e) { e.printStackTrace(); System.out.println("带图片和附件邮件发送失败");returnfalse; } }/** * 发送由freemarker模板技术生成的邮件 *@paramjavaMailSenderInfo *@return*/publicstaticbooleansendFreemarkerMail(JavaMailSenderInfo javaMailSenderInfo){// 创建邮件消息 简单邮件可直接使用SimpleMailMessageMimeMessage mimeMessage = javaMailSender.createMimeMessage(); MimeMessageHelper mimeMessageHelper =null;try{ mimeMessageHelper =newMimeMessageHelper(mimeMessage,true,"utf-8"); setMailCommonField(mimeMessageHelper, javaMailSenderInfo);/**
* 此处没有实现采用模板技术(可自行探索)
* 封装模板所需要的数据
* 读取freemarker的模板文件 xxx.ftl 进行静态化,生成html形式的字符串
* 将生成好的html字符串设置到邮件的正文中
*/javaMailSender.send(mimeMessage); System.out.println("freemarker模板技术生成的邮件发送成功");returntrue; }catch(MessagingException e) { e.printStackTrace(); System.out.println("freemarker模板技术生成的邮件发送失败");returnfalse; } }/** * 设置邮件的公共字段 *@parammimeMessageHelper *@paramjavaMailSenderInfo *@throwsMessagingException */privatestaticvoidsetMailCommonField(MimeMessageHelper mimeMessageHelper, JavaMailSenderInfo javaMailSenderInfo)throwsMessagingException{// 发件人mimeMessageHelper.setFrom(InitJavaMailSender.username);// 收件人 多人用数组mimeMessageHelper.setTo(javaMailSenderInfo.getToAddress());// 主题mimeMessageHelper.setSubject(javaMailSenderInfo.getSubject());// 日期mimeMessageHelper.setSentDate(newDate()); }}
四、使用springboot发送邮件
使用springboot发送邮件和使用spring提供的JavaMailSender发送邮件的方式一样
在yml配置文件中配置相关的会话信息后
在service层中直接注入使用即可
导入依赖
org.springframework.bootspring-boot-starter-mail
修改配置
# 邮件的设置 导入mail启动包 使用时注入直接JavaMailSender即可spring:mail:protocol:smtphost:smtp.qq.comport:465default-encoding:utf-8username:邮箱用户名password:邮箱授权码test-connection:trueproperties:mail:debug:truesmtp:auth:truetimeout:20000ssl:enable:true
直接在service层中使用即可
publicMailServiceImpl {@AutowiredprivateJavaMailSender javaMailSender;// 以下代码使用即可...}
亚马逊测评 www.yisuping.com