基于JavaWeb的邮件发送功能(多附件),供大家参考,具体内容如下
本次学习主要目的是为了测试由QQ邮箱发送到任意一个有效邮箱的功能实现,附带多个附件。学习者可以借鉴其他邮箱的格式,梳理一下要写的内容。项目把文件内容放到了MimeMessage 邮件对象里,其中包含了如发件人、收件人、抄送人、邮件主题、邮件内容、邮件时间和邮件附件等一些内容。
项目中遇到的问题:
1、在执行到 File file = new File(“D:\Chat_Software\sky.JPG”);时出现错误,之前写的时xlsx文件,测试期间可以对.xls,jpg,文本,.doc文件进行发送。发送xlsx文件时出现报错。
问题解决方案:
.xls文件扩展名对应的是Microsoft Office EXCEL 2003及以前的版本。
.xlsx文件扩展名对应的是Microsoft Office EXCEL 2007及后期的版本。
有可能时你下载的mai不是1.6以上版本的,建议下载1.6以上版本的mail
2、在执行到 message.saveChanges(); 方法报错无法进行保存设置,也有可能时你的mail版本较低造成的。
在书写 File file = new File(); 时注意修改正确的路径,也可以写在form表单里用file进行传值,主题和内容也写在了方法里因人而异如果其他需求可以需改参数进行传值。
本次用到的主要jar包如下:
- javax.mail-1.6.0.jar
- activation.jar
代码如下:
EmailSendController.java
package com.yang.controller; import javax.servlet.http.HttpServletRequest; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import com.yang.util.Email_Send_Util; @Controller @RequestMapping("/email") public class EmailSendController { @RequestMapping(value = "/send.do") @ResponseBody public boolean impotr(HttpServletRequest request) { String toMail = request.getParameter("toMail"); String myMail = request.getParameter("myMail"); String userPwd = request.getParameter("userPwd"); System.out.println( toMail+myMail+userPwd); boolean bool=Email_Send_Util.send( toMail,myMail,userPwd); return bool ; } }
Authentication.java
package com.yang.util; import javax.mail.Authenticator; import javax.mail.PasswordAuthentication; public class Authentication extends Authenticator { String username = null; String password = null; public Authentication() { } public Authentication(String username,String password) { this.username = username; this.password = password; } protected PasswordAuthentication getPasswordAuthentication(){ PasswordAuthentication pa = new PasswordAuthentication(username,password); return pa; } }
CreateMimeMessage.java
package com.yang.util; import java.io.File; import java.util.Date; import javax.activation.DataHandler; import javax.activation.FileDataSource; import javax.mail.Message.RecipientType; import javax.mail.Address; import javax.mail.Message; import javax.mail.Session; 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; /** * 创建一封复杂邮件(文本+图片+附件) */ public class CreateMimeMessage { public static MimeMessage createMimeMessage(Session session,String myMail,String toMail) throws Exception { // 1. 创建邮件对象 MimeMessage message = new MimeMessage(session); // 2. From: 发件人 message.setFrom(new InternetAddress(myMail,"我的测试邮件_发件人昵称","UTF-8")); // 3. To: 收件人(可以增加多个收件人、抄送、密送) message.addRecipient(RecipientType.TO,new InternetAddress(toMail,"我的测试邮件_收件人昵称","UTF-8")); // 4. Subject: 邮件主题 message.setSubject("TEST邮件主题(文本+图片+附件)","UTF-8"); // 抄送人 Address ccAddress = new InternetAddress("*********@qq.com","我的测试邮件_抄送人昵称","UTF-8"); message.addRecipient(Message.RecipientType.CC,ccAddress); /* * 下面是邮件内容的创建: */ // 5. 创建图片“节点” MimeBodyPart image = new MimeBodyPart(); File file = new File("D:\\Chat_Software\\sky.JPG"); DataHandler dh = new DataHandler(new FileDataSource(file)); // 读取本地文件 image.setDataHandler(dh); // 将图片数据添加到“节点” // image.setContentID("image_fairy_tail");// 为“节点”设置一个唯一编号(在文本“节点”将引用该ID) image.setFileName(MimeUtility.encodeText(file.getName())); // 6. 创建文本“节点” MimeBodyPart text = new MimeBodyPart(); // text.setContent("这是一张图片<br/>测试图片<br/><img // src='cid:image_fairy_tail'/>","text/html;charset=UTF-8"); text.setContent("这是一张图片<br/>测试图片","text/html;charset=UTF-8"); // 7. (文本+图片)设置 文本 和 图片 “节点”的关系(将 文本 和 图片 “节点”合成一个混合“节点”) MimeMultipart mm_text_image = new MimeMultipart(); mm_text_image.addBodyPart(text); mm_text_image.addBodyPart(image); mm_text_image.setSubType("related"); // 关联关系 // 8. 将 文本+图片 的混合“节点”封装成一个普通“节点” // 最终添加到邮件的 Content 是由多个 BodyPart 组成的 Multipart,所以我们需要的是 BodyPart,// 上面的 mm_text_image 并非 BodyPart,所有要把 mm_text_image 封装成一个 BodyPart MimeBodyPart text_image = new MimeBodyPart(); text_image.setContent(mm_text_image); // 9. 创建附件“节点” MimeBodyPart attachment = new MimeBodyPart(); File file2 = new File("E:\\boHaiBank\\Test\\test.xlsx"); DataHandler dh2 = new DataHandler(new FileDataSource(file2)); // 读取本地文件 attachment.setDataHandler(dh2); // 将附件数据添加到“节点” attachment.setFileName(MimeUtility.encodeText(dh2.getName())); // 设置附件的文件名 // 10. 设置(文本+图片)和 附件 的关系(合成一个大的混合“节点” / Multipart ) MimeMultipart mm = new MimeMultipart(); mm.addBodyPart(text_image); mm.addBodyPart(attachment); // 如果有多个附件,可以创建多个多次添加 mm.setSubType("mixed"); // 混合关系 // 11. 设置整个邮件的关系(将最终的混合“节点”作为邮件的内容添加到邮件对象) message.setContent(mm); // 12. 设置发件时间 message.setSentDate(new Date()); // 13. 保存上面的所有设置 message.saveChanges(); return message; } }
Email_Send_Util.java
package com.yang.util; import java.util.Properties; import javax.mail.Authenticator; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.MimeMessage; public class Email_Send_Util { public static boolean send(String toMail,String userPwd) { // QQ邮箱发件的服务器和端口 Properties props = new Properties(); props.put("mail.transport.protocol","SMTP");// 设置发送邮件使用的协议 props.put("mail.smtp.host","smtp.qq.com");// 指定邮件发送服务器服务器 "smtp.qq.com" props.put("mail.smtp.port","25"); props.put("mail.smtp.auth","true"); // 设置需要身份验证(不验证会不通过) Authenticator authentication = new Authentication(myMail,"你的邮箱授权码"); Session session = Session.getDefaultInstance(props,authentication); MimeMessage message; try { message = CreateMimeMessage.createMimeMessage(session,toMail); // 获取发送方对象 Transport transport = session.getTransport("smtp"); // 连接邮件服务器,链接您的QQ邮箱,用户名(可以不用带后缀)、密码 transport.connect(myMail,userPwd); // 发送邮件 // 第一个参数:邮件的消息体 // 第二个参数:邮件所有的接收人/抄送人 transport.sendMessage(message,message.getAllRecipients()); transport.close(); return true; } catch (Exception e) { e.printStackTrace(); return false; } } }
测试发送邮箱的jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %> <html> <head> <Meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>邮件发送</title> <script type="text/javascript" src="js/jquery-1.10.2.js"></script> <script type="text/javascript" src="js/jquery-2.1.1.min.js"></script> </head> <body> <div> <form id="login_form" method="post"> <table border="1px" width="750px" height="400px" align="center" cellpadding="0px" cellspacing="0px" bgcolor="white" > <tr height="40px"> <td colspan="2"> <font size="4">邮件发送</font> Email </td> </tr> <tr> <td>收件人</td><td><input type="text" name="toMail" size="34px"/></td> </tr> <tr> <td>邮件发送人</td><td><input type="text" name="myMail" size="34px"/></td> </tr> <tr> <td>密码</td><td><input type="text" name="userPwd" size="34px"/></td> </tr> </table> <input type="button" onclick="emailsend()" value="发送"> </form> </div> <script type="text/javascript"> function emailsend() { $.ajax({ url : "email/send.do",type : "POST",data : $("#login_form").serialize(),beforeSend : function() { console.log("正在进行,请稍候"); },success : function(e) { if (e == true) { alert("发送成功"); } else { alert("发送失败"); } } }); } </script> </body> </html>
发送成功后,收件人的邮件