目标:实现一个基于Web的可以发送附件的邮件程序。(涉及的知识点:文件上传+邮件发送)

知识点引入:

文件上传:开发的Web应用是基于HTTP协议的,工作在Request/Response模式下。在这种模式下,用户通过浏览器访问Web应用中的内容,都会先通过浏览器给服务器发送一个对资源的请求,服务器接到这个请求后,会把用户所请求的资源返回给浏览器。接下来的一点很少有人会思考到:其实文件上传与浏览器发送请求性质相同,都是向服务器传递信息。一般情况下,浏览器给服务器发送的请求信息都是一些简单的文本信息,而服务器返回给用户的信息是比较复杂的信息,会包括头信息,文本信息,图片文件的内容等。而通过浏览器上传文件给服务器,与正常的访问不同,用户通过浏览器给服务器发送的是比较复杂的信息,而浏览器返回的可能是简单的信息。(这段话没有什么实际的价值,但是本人觉得挺有意思的,可以将文件上传与发送请求联系在一起。)

JavaMail:在javaweb应用中,我们非常需要电子邮件的功能。sun公司已经为我们准备好了JavaMail技术,专门帮助处理邮件相关。使用JavaMail技术需要在本机安装邮件服务器,本篇博客使用的是Apache Commons Email组件编写,所以对JavaMail不做介绍。

关于邮件发送,我们对相关的协议做基本的了解:

  1. SMTP( Simple Mail Transfer Protocol ):电子邮件发送协议。当我们使用客户端程序发送邮件时,客户端程序先把邮件发送给我们设置SMTP服务器,然后SMTP服务器再根据收件人的地址,把邮件中转给接受方的SMTP服务器,以便让邮件收件人最终使用POP3或者IMAP方式收取邮件。JavaMail API不包含SMIP的服务程序,所以使用JavaMail技术发送邮件,需要其他SMTP服务器的支持。
  2. POP3协议(Post Office Protocol V3):是一种收取邮件的协议,通过这个协议,可以让邮件客户端程序把存在POP3服务器上的邮件接收到本机上进行处理。
  3. IMAP协议(Internet Message Access Protocol):IMAP是更加高级的用于接收邮件的协议。
  4. MIME协议(Multipurpose Internet Mail Extensions):它不是邮件传输协议,但对传输内容的文本、附件及其他内容定义了格式。

程序开工:

准备工作:此次程序用到的jar文件上传:https://download.csdn.net/download/tobe_coder/10653981

注册一个新浪邮箱,进入设置,——》客户端POP/imap/smtp——》将POP/smtp服务状态开启。

sendAttachmentMail.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>发送邮件</title>
</head>
<body><h3>发送邮件程序</h3>
<%--enctype="multipart/form-data"注意此属性设置,此属性是表单上传文件必不可少的参数--%>
<form action="sendAttachmentMail" method="post" enctype="multipart/form-data">收件人:<input type="text" name="to"/><br>发件人:<input type="text" name="from"/><br>主题:<input type="text" name="topic"><br>添加附件:<input type="file" name="attach"><br>正文:<textarea cols="50" rows="30" name="content"></textarea><br><input type="submit" value="提交"/><input type="reset" value="重置"/>
</form>
</body>
</html>
SendAttachmentMailServlet:
/*** 编写可以发送附件的邮件发送程序* 结合使用邮件发送和文件上传实现*/
@WebServlet(value="/sendAttachmentMail",initParams = {@WebInitParam(name = "savePath",value = "uploads")})
public class SendAttachmentMailServlet extends HttpServlet {private String savePath; //上传文件的存储路径ServletContext application;private Map<String,String> parameters=new HashMap();@Overridepublic void init(ServletConfig config) throws ServletException { //初始化savePath=config.getInitParameter("savePath"); //取到文件的存储路径application=config.getServletContext();//初始化ServletContext}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("utf-8");File file=doAttachment(request);//获取上传的文件try {//此类是能发送带附件邮件的行为MultiPartEmail email=new MultiPartEmail();email.setCharset("utf-8");email.setHostName("smtp.sina.com"); //不要将smtp写成stmpemail.setAuthentication("test@sina.com","123456");email.addTo(parameters.get("to"));email.setFrom(parameters.get("from"));email.setSubject(parameters.get("topic"));email.setMsg(parameters.get("content"));if (file!=null){//如果存在附件EmailAttachment attachment=new EmailAttachment();  //创建一个邮件的附件对象attachment.setPath(file.getPath());   //设置路径到附件attachment.setDescription(EmailAttachment.ATTACHMENT);//附件的描述attachment.setName(file.getName());  //附件的名称email.attach(attachment);  //将附件绑定到邮件上}email.send();//邮件发送} catch (EmailException e) {e.printStackTrace();request.setAttribute("sendmail.message","邮件发送不成功");}request.setAttribute("sendmail.message","邮件发送成功");request.getRequestDispatcher("/sendResult.jsp").forward(request,response);}/***    将文件上传到服务器* @param request* @return*/public File doAttachment(HttpServletRequest request){File file=null;DiskFileItemFactory factory=new DiskFileItemFactory();ServletFileUpload upload=new ServletFileUpload(factory);try {//获取所上传的所有文件和参数的集合对象 from必须要有enctype="multipart/form-data"属性设置,//标记中有"entype"属性,该表单提交之后不能通过request.getParameter("name")取值List items=upload.parseRequest(request);Iterator itr=items.iterator();while(itr.hasNext()){FileItem item= (FileItem) itr.next();if(item.isFormField()){//如果是表单项的情况,将属性和值进行存储parameters.put(item.getFieldName(),item.getString("utf-8"));}else{//如果是file类型的表单if(item.getName()!=null&&!item.getName().equals("")){//item.getName()上传文件在客户端的完整路径名称File tempFile=new File(item.getName());//根据给定的路径名创建一个新的文件实例,ServletContext容器的路径+文件名file=new File(application.getRealPath("/")+savePath,tempFile.getName());item.write(file);}}}} catch (FileUploadException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}return file;}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}
}

邮件发送成功页面sendResult.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>邮件发送成功页面</title>
</head>
<body><p>${requestScope['sendmail.message']}</p>
<p><a href="sendMail">返回</a></p>
</body>
</html>

程序的相关方法查询api文档:http://tool.oschina.net/apidocs/

相关资源:common-email.jar,fileupload.jar,commons-io.jar包在Apache官网下载。

注:学习的初始阶段,博客比较粗糙。以后细节再补充,如有错误或者疑问,欢迎沟通。

邮件发送程序(添加附件发送)相关推荐

  1. MATLAB收取邮件,Matlab 程序结束后发送短信或者邮件

    近期,在服务器上运行matlab程序,由于数据比较多,程序比较复杂,运行时间不固定,而且需要经常改变参数,重复运行几次,所以不清楚程序何时结束,以便于修改参数,继续运行.开始有时间就看看程序是否运行结 ...

  2. 如何在公众号文章正文添加附件?本文教你轻松实现

    发表公众号文章时,难免需要在正文或者文末添加文档附件给用户下载.一般而言,在公众号添加附件,有那么几种方式: 第一种,借助附件小程序添加附件. 把文件上传到附件网站,获得文件对应的小程序路径,粘贴到公 ...

  3. 基于python的图形化邮件发送程序(支持添加附件)

    2019独角兽企业重金招聘Python工程师标准>>> 开发环境:centos7 基于:python3.5 调用库:tkinter smtplib email linux中类outl ...

  4. Rails测试《十一》添加邮件发送程序及测试邮件发送程序

    讲到测试邮件发送程序,我们首先要让系统可以发送邮件.我们先来给系统添加发送邮件的功能. Action Mailer in Rails 3是一个不错的视频教程,大家可以参考. 还有就是http://gu ...

  5. java邮件中添加excel_基于javaMail的邮件发送--excel作为附件

    基于JavaMail的Java邮件发送 Author xiuhong.chen@hand-china.com Desc 简单邮件发送 Date 2017/12/8 项目中需要根据物料资质的状况实时给用 ...

  6. C#实现发送QQ邮件并添加附件

    之前在公司遇到一个需求需要发送邮件并需要添加附件,我当时用了QQ的SMTP实现了发送邮件的功能.现在记录一下.并做了简单的封装.有不对的地方,请大家多多包涵,一起交流学习 一.准备工作, 要使用SMT ...

  7. 解决发送添加附件的邮件时,附件名是一个以UTF-8开头的随机乱码

    1.设置系统值 System.setProperty("mail.mime.splitlongparameters", "false"); 2. 在创建对象的时 ...

  8. 用simple mapi 发送一个带附件的邮件

    使用 MAPI 实现邮件发送 原 作:deltacat,修改中 最后更新:2004.09.16 版权声明:随意转载,敬请保持文档及说明完整性 关键字: VC 邮件发送 MAPI 一.简述 实际上,本文 ...

  9. springboot:java实现邮件及附件发送、HTML正文的三种方式(一)【附带源码】

    0. 引言 邮件发送是我们日常开发中比较常见的功能,常用于预警信息提醒.统计数据定期发送等需求.一般该方法会由前人封装好,实际开发时只需要调用即可,但具体怎么实现的,如何从零实现邮件发送,这是我们要掌 ...

最新文章

  1. 部分 II. Network
  2. hicharts Linux服务器导出,中文字体问题
  3. 【收藏】hdfs参数配置详解
  4. leetcode 19. Remove Nth Node From End of List | 19. 删除链表的倒数第 N 个结点(Java)
  5. python语言的数据类型图解_Python基础——数据类型(图解+实例,非常详细!)
  6. stm32F051系列 单片机引脚定时器输出pwm波形控制风扇转速
  7. View not attached to window manager---Android原生开发工作笔记133
  8. php读取西门子plc_AB PLC和西门子PLC之间需要交换数据
  9. oracle 设置会话的编码,在Oracle中使用登录触发器初始化用户会话
  10. qss设置平面按钮_QToolButton设置QSS
  11. HiJson工具(查看Json)
  12. 网络PPTP协议代理加速器的应用
  13. Flash CS6中文版
  14. python编辑数学公式_最好用的文字与公式编辑器,这套数学笔记神器送给你
  15. N阶行列式计算(JAVA)
  16. 使用STWI056WT-01串口屏的医疗笔记
  17. webmagic保存html页面,WebMagic抓取前端Ajax渲染的页面
  18. 开发对接微信卡包会员卡_微信公众号实现会员卡领取功能
  19. 钉钉如何调整组织架构_钉钉组织架构与员工同步指南
  20. 成熟男人与24岁女孩精彩对白(转)

热门文章

  1. 了解Web项目前后端分离开发流程,这一篇就够了
  2. success: function ()和success: res=> ()有什么区别
  3. 手把手教学——记录在Winxp虚拟机上安装Vxworks操作系统及其编译器Tornado的详细过程(1——WinXP操作系统)
  4. 计算机开机长鸣报警,电脑开机报警,详细教您电脑开机一直长鸣报警怎么办
  5. 微信关闭头像昵称接口后,如何根据手机号码返回头像昵称用户信息,API接口
  6. 同账号不同服务器幻化T2,魔兽怀旧服TBC前瞻指南:520前夕开放太重要,千万别出门约会...
  7. 18650电池型充电宝复活记
  8. iPhone4怎样鉴别翻新机
  9. 坠机、亏损、裁员,造飞机的波音未来能否再次造就自己?
  10. 中国将强势反击,或暂停采购波音飞机,波音或因此受重击