JavaWeb实现邮件发送功能

基于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 myMail, 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, myMail, 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>

发送成功后,收件人的邮件

所需的jar包可以在这个链接里下载,其中还有定时发送邮件所需的jar包:mail.jar

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

时间: 2019-12-18

Java基于JavaMail实现向QQ邮箱发送邮件

最近项目在做新闻爬虫,想实现这个功能:爬虫某个页面失败后,把这个页面的 url 发到邮箱.最终实现的效果图如下,后期可以加上过滤标签.失败状态码等,方便分类搜索异常. 开发人员可以根据邮件里的 url 和堆栈信息,分析爬虫失败的原因. 是不是服务器 down 了? 还是爬虫的 Dom 解析没有解析到内容? 还是正则表达式对于这个页面不适用? 开启SMTP服务 在 QQ 邮箱里的 设置->账户里开启 SMTP 服务 注意开启完之后,QQ 邮箱会生成一个授权码,在代码里连接邮箱使用这个授权码而不是原

java实现基于SMTP发送邮件的方法

本文实例讲述了java实现基于SMTP发送邮件的方法.分享给大家供大家参考.具体实现方法如下: import java.util.Date; import java.util.Properties; import javax.mail.Authenticator; import javax.mail.Message; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Tra

Java邮件发送程序(可以同时发给多个地址、可以带附件)

发送邮件的主程序 import java.util.Properties; import common.util.Email_Autherticatorbean; import javax.mail.Authenticator; import javax.mail.internet.InternetAddress; import org.apache.commons.lang.StringUtils; import javax.mail.internet.MimeBodyPart; import

java中javamail发送带附件的邮件实现方法

本文实例讲述了java中javamail发送带附件的邮件实现方法.分享给大家供大家参考.具体分析如下: JavaMail,顾名思义,提供给开发者处理电子邮件相关的编程接口.它是Sun发布的用来处理email的API.它可以方便地执行一些常用的邮件传输,JavaMail是可选包,因此如果需要使用的话你需要首先从java官网上下载.目前最新版本是JavaMail1.5.0,下面我们来看看javamail发送带附件的邮件实例 mail.java 代码: 复制代码 代码如下: package mail;

java实现163邮箱发送邮件到qq邮箱成功案例

下载和上传附件.发送短信和发送邮件,都算是程序中很常用的功能,之前记录了文件的上传和下载还有发送短信,由于最近比较忙,邮件发送的功能就没有时间去弄,现在终于成功以163邮箱发送邮件到qq邮箱,以下是相关代码,具体解释可以参考代码中注释: package test; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Properties; import java.ut

基于SSM框架+Javamail发送邮件的代码实例

本篇介绍基于SSM框架(Spring4.0+SpringMVC+Mybatis)组合的Javamail应用,邮箱的话基于腾讯的QQ邮箱,其实也是Foxmail邮箱 先要了解一下SMTP协议和SSL加密 SMTP:称为简单邮件传输协议(Simple Mail Transfer Protocal),目标是向用户提供高效.可靠的邮件传输.SMTP是一种请求响应的协议,也就是客户机向远程服务器发送请求,服务器响应,监听端口是25,所以其工作模式有两种:发送SMTP,接收SMTP. SSL加密:用来保障浏

Java HtmlEmail 邮件发送的简单实现代码

Java 项目中常常回遇到发送邮件 Java 发送邮件有几种,今天先给大家介绍用 HtmlEmail 来发送邮件,我这里是用 Maven 来搭建的 HtmlEmail 可以抄带HTML 首先 需要导入jar 包 <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-email</artifactId> <version>1.4</versio

Java程序中使用JavaMail发送带图片和附件的邮件

我们常常在邮件中添加附件,以达到传输较大文件的目的.而上一篇文章只是将本机的一张图片内嵌到邮件的 HTML 格式的正文当中,这样的邮件显得不够丰富多彩.我们想要一封正文部分图文并茂,而游客附带若干附件的邮件. 下面是代码结构中3个重要的方法: MimeBodyPart createAttachment(String fileName) 方法用于创建附件并返回: MimeBodyPart createContent(String body, String fileName) 方法用于创建正文部分并

JavaWeb中使用JavaMail实现发送邮件功能实例详解

现在很多的网站都提供有用户注册功能, 通常我们注册成功之后就会收到一封来自注册网站的邮件.邮件里面的内容可能包含了我们的注册的用户名和密码以及一个激活账户的超链接等信息.今天我们也来实现一个这样的功能,用户注册成功之后,就将用户的注册信息以Email的形式发送到用户的注册邮箱当中,实现发送邮件功能就得借助于JavaMail了. 一.搭建开发环境 1.1.创建Web项目 1.2.用户注册的Jsp页面 register.jsp <%@ page language="java" pag

java编程实现邮件定时发送的方法

本文实例讲述了java编程实现邮件定时发送的方法.分享给大家供大家参考,具体如下: 最近做项目时客户提出了一个需求:系统定时发送E-mail到其客户,达到通知的效果.先将实例分享给大家,如果确实有一些帮助的话,请大家来点掌声! 首先介绍java定时器(java.util.Timer)有定时执行计划任务的功能,通过设定定时器的间隔时间,会自动在此间隔时间后执行预先安排好的任务(java.util. TimerTask) 如: 每隔一个小时执行任务 timer.schedule(TimerTask,

JAVA编程实现UDP网络通讯的方法示例

本文实例讲述了JAVA编程实现UDP网络通讯的方法.分享给大家供大家参考,具体如下: UDP协议全称是用户数据报协议,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议. 在OSI模型中,在第四层--传输层,处于IP协议的上一层.UDP有不提供数据包分组.组装和不能对数据包进行排序的缺点: 也就是说,当报文发送之后,是无法得知其是否安全完整到达的.UDP用来支持那些需要在计算机之间传输数据的网络应用. 采用UDP协议要先把数据定义成数据报(Datagram)并在数据报中指明数据所要达到

Java编程获取当前屏幕分辨率的方法示例

本文实例讲述了Java编程获取当前屏幕分辨率的方法.分享给大家供大家参考,具体如下: /** * This class implements the functionality of fetching the size of the screen */ package com.leo.util; /** * @author Leo Share * @since 07/16/2007 * @version 1.0 */ class ScreenSize{ private int screenWid

Java编程获取经纬度之间距离的方法

本文实例讲述了Java编程获取经纬度之间距离的方法.分享给大家供大家参考,具体如下: public class GeoUtil { /** * 根据经纬度和距离返回一个矩形范围 * * @param lng * 经度 * @param lat * 纬度 * @param distance * 距离(单位为米) * @return [lng1,lat1, lng2,lat2] 矩形的左下角(lng1,lat1)和右上角(lng2,lat2) */ public static double[] ge

Java编程调用微信支付功能的方法详解

本文实例讲述了Java编程调用微信支付功能的方法.分享给大家供大家参考,具体如下: 微信开发文档地址:https://mp.weixin.qq.com/wiki/home/ 从调用处开始 我的流程: 1.点击"支付"按钮,去后台 --> 2.后台生成支付所需数据返回页面 --> 3.页面点击"确认支付"调用微信支付js.完成支付功能. 支付按钮 <div class="button" id="pay" onc

Java编程实现调用com操作Word方法实例代码

实例代码如下: import com.jacob.activeX.ActiveXComponent; import com.jacob.com.Dispatch; import com.jacob.com.Variant; /** * jacob操作MSword类 * @author */ public class WordBean { // word文档 private Dispatch doc; // word运行程序对象 private ActiveXComponent word; //

Java编程实现服务器端支持断点续传的方法(可支持快车、迅雷)

本文实例讲述了Java编程实现服务器端支持断点续传的方法.分享给大家供大家参考,具体如下: 大家知道Tomcat之流对静态资源可以实现断点续传支持,但是如果是一个被控制的流,如有权限控制,或下载地址仅是个代理的时候,这时候需要自己实现断点续传的支持,小弟不才,这里提供基本断点续传[a-,-b,a-b]的简单实现,经验证,可支持迅雷7和火狐的多次断点续传.现贴出代码,大家共同分享: Servlet import java.io.BufferedOutputStream; import java.i

JAVA编程实现TCP网络通讯的方法示例

本文实例讲述了JAVA编程实现TCP网络通讯的方法.分享给大家供大家参考,具体如下: TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议. 由IETF的RFC 793定义,在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能. 基于TCP网络通讯实现的类主要有服务器端的ServerSocket用客户端的Socket. 通讯流程: 打开服务器,等待客户端连接-->客户端连接上服务器-->数据通讯. 代码

Android编程实现popupwindow定时消失的方法

本文实例讲述了Android编程实现popupwindow定时消失的方法.分享给大家供大家参考,具体如下: 因为是在其他界面弹出的popupwindow,要在横屏切换回竖屏的时候,让popupwindow自动消失,因为弹出popupwindow是普通的类,没有监听横竖屏的函数,所以想到了使用定时器,定时3秒之后如果用户没有操作就让popupwindow消失,代码如下: // 创建弹出窗口 popupMenu = new PopupWindow(view, sourceView.getWidth(

实例讲解Java编程中数组反射的使用方法

什么是反射 "反射(Reflection)能够让运行于JVM中的程序检测和修改运行时的行为."这个概念常常会和内省(Introspection)混淆,以下是这两个术语在Wikipedia中的解释: 内省用于在运行时检测某个对象的类型和其包含的属性: 反射用于在运行时检测和修改某个对象的结构及其行为. 从它们的定义可以看出,内省是反射的一个子集.有些语言支持内省,但并不支持反射,如C++. 内省示例:instanceof 运算符用于检测某个对象是否属于特定的类. if (obj inst