JavaMail开发教程01开山篇
序
其实想写JavaMail这一系列的博客已经有一个月之久了,缘起是某次乱逛传智播客官网浏览到相关的视频教程,想起大学时代学过的计算机网络提到邮件相关的协议,但遗憾的是到目前为止还没有接触计算机网络编程,尤其搞Java EE开发之后,底层的网络细节都已经封装好了,并没有接触多少底层的细节,一直以来以为只要与网络协议相关的编程都是C/C++家族特有的功能。看了张孝祥老师的视频之后,发现C/C++能干的事,Java也能干出来,并且一下子就对邮件开发有点兴趣起来。当然看了视频之后还只是懵懵懂懂不能理解透彻,毕竟很有很多细节值得下去咀嚼。于是又买了张孝祥老师的《Java邮件开发详解》来,这才对JavaMail理解明朗起来。
在这感谢张孝祥老师,老师虽然已经辞世,但其技术书籍却普惠了后来人。本系列教程知识点提炼自张孝祥老师的JavaMail视频教程和《Java邮件开发详解》书籍,以及来自JavaMail官方的API文档,是对上诉系列文档的归纳、升华和总结。本系列博客适合刚学完了Java SE的初学者,和正在学习计算机网络编程的在校生,以及已经有工作经验的Java EE开发提供JavaMail方面的参考资料。
本系列博客教程内容大致分为:邮件协议相关协议讲解,JavaMail邮件的发送,电子邮件的组织结构,使用JavaMail生成复杂结构的电子邮件,邮件的接收和解析等。并最总能够向好友发送一封复杂邮件,这封邮件应该包含附件、超链接、HTML格式文本以及内嵌图片,并且邮件的抄送人,密送人也能够正常接收到邮件的内容。
基本概念
邮件服务器
电子邮件的系统抽象简单概括如下图:

从图中可以看出,电子邮件服务器主要有一下功能:
- 接收用户投递的邮件;
- 将用户投递进来的邮件转发给目标邮件服务器;
- 接收其他邮件服务器转发来的邮件,并把邮件存储到其他管理的用户邮箱中;
- 为前来读取邮件的用户提供读取服务。
SMTP协议
如果按照相见的传输方向分类,那么邮件协议大概分为两种:SMTP协议和POP3/IMAP协议。前者主要是推送邮件,后者主要是把邮件从服务器上拉到本地来。
SMTP的全称是Simple Mail Transfer Protocol,简单邮件传输协议,它定义了服务器与服务器之间,已经服务器与客户端之间的通信规则,常用端口号是25。
POP3协议
全程是Post Office Protocol,有据协议,它定义了客户端与服务器通信的规则,常用端口号110。
IMAP协议
它全称为Internet Message Access Protocol,Internet消息访问协议,它是对POP3协议的一中扩展,也是定义了邮件客户端与邮件服务器的通信规则。
用户代理
用户代理俗称就是邮件客户端,或者可以称为邮件阅读器。其作用是方便用户阅读、回复、转发、保存和撰写邮件报文。目前流行的邮件客户端有FoxMail,Outlook,Thunderbird等,由于博主操作系统用的是ubuntu,所以实验环境是建立在Thunderbird上的。
DNS
DNS与上诉协议在TCP/IP协议族中处于位置:应用层。DNS是域名解析系统,它的作用是将域名映射成ip地址,将域名转换为IP地址这一过程我们称之为域名解析,除此之外DNS还有域名反向解析的作用。
DNS的解析过程有点复杂,这里不打算详解介绍,DNS为什么要与邮件开发想关联起来?那是因为SMTP协议既与客户端通信,又与服务器通信,服务器判断发送过来的邮件是通过邮件客户端(用户代理)过来的还是某台SMTP服务器发送过来的,是通过判断其计算机名称是否是注册在DNS系统中的计算机名称。
如果你看到这里已经感觉云里雾里,或是嫌弃介绍的概念太过简单粗糙。别着急,下面的篇章将从实际动手为出发点,带你走近JavaMail开发的殿堂。
JavaMail开发教程01开山篇的更多相关文章
- Android快乐贪吃蛇游戏实战项目开发教程-01项目概述与目录
一.项目简介 贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏. 我已经将做好的案例上传到了应用宝,无病毒.无广告,大家可以放心下载下来把玩一下.应用宝 ...
- [051] 微信公众平台开发教程第22篇-怎样保证access_token长期有效
为了使第三方开发人员能够为用户提供很多其它更有价值的个性化服务,微信公众平台开放了很多接口,包含自己定义菜单接口.客服接口.获取用户信息接口.用户分组接口.群发接口等,开发人员在调用这些接口时.都须要 ...
- EnjoyingSoft之Mule ESB开发教程第三篇:Mule message structure - Mule message结构
目录 1. 探索Mule Message结构 2. Mule Message的Payload 3. Mule Message的Property 4. Mule Message的Attachment 5 ...
- EnjoyingSoft之Mule ESB开发教程第四篇:Mule Expression Language - MEL表达式
目录 1. MEL的优势 2. MEL的使用场景 3. MEL的示例 4. MEL的上下文对象 5. MEL的Variable 6. MEL访问属性 7. MEL操作符 本篇主要介绍Mule表达式语言 ...
- EnjoyingSoft之Mule ESB开发教程第六篇:Data Transform - 数据转换
目录 1. 数据转换概念 2. 数据智能感知 - DataSense 3. 简单数据转换组件 3.1 Object to JSON 3.2 JSON to XML 3.3 JSON to Object ...
- [039] 微信公众帐号开发教程第15篇-自定义菜单的view类型(访问网页)
引言及内容概要 距离写上一篇文章<自定义菜单的创建及菜单事件响应>整整过了两个月的时间,那时公众平台还没有开放view类型的菜单.在不久前,微信公众平台悄悄开放了view类型的菜单,却没有 ...
- 谷歌浏览器web开发教程之开始篇:使用sublime
你的代码编辑器是主要的开发工具:你使用它去编辑和保存代码段.你可以通过学习编辑器快捷键和以及安装关键插件来好而快的写出代码. 目录 安装sublime文本编辑器 为什么使用包管理器? 安装插件 摘要 ...
- JNI/NDK开发指南(开山篇)
转载请注明出处:http://blog.csdn.net/xyang81/article/details/41759643 相信很多做过Java或Android开发的朋友经常会接触到JNI方面的技术, ...
- [033] 微信公众帐号开发教程第9篇-QQ表情的发送与接收(转)
我想大家对QQ表情一定不会陌生,一个个小头像极大丰富了聊天的乐趣,使得聊天不再是简单的文字叙述,还能够配上喜.怒.哀.乐等表达人物心情的小图片.本文重点要介绍的内容就是怎样在微信公众平台使用QQ表情, ...
随机推荐
- 关于Mysql下使用Dapper QueryFirstOrDefault的问题
1.环境 MySql:5.7.20 Dapper:1.50.2 .Net:4.5 2.遇到的问题 在开发中我发现,使用Dapper查询数据时,第一次查询正确,第二次查询就差不出来,或者直接修改数据库后 ...
- Android - shape圆形画法(oval)
shape圆形画法(oval) 本文地址: http://blog.csdn.net/caroline_wendy 1. 创建一个目录drawable, 用于存放xml类型的图片资源; 2. 在dra ...
- 【MySQL】(4)操作数据表中的记录
1. 插入记录INSERT 方法一: INSERT [INTO] tbl_name [(clo_name,...)] {VALUES | VALUE} ({expr | DEFAULT},...),( ...
- windows远程桌面连接的时候不显示本地盘符
近期远程异地pc机部署项目,远程连上后不显示本地盘符,勾选驱动器也无效,试下例如以下方法 在远程主机的文件地址栏里面键入: \\tsclient\D 后面再加入上对应的盘符,你的盘符的名称是什么盘就加 ...
- 如何修改maven默认仓库(即repository)的路径
如何修改maven默认仓库(即repository)的路径 1 在maven的安装目录下,修改Eclipse(或IntelliJ IDEA)的MAVEN的存储位置,点击Browser按钮,选择set ...
- Swagger文档添加file上传参数写法
想在swagger ui的yaml文档里面写一个文件上传的接口,找了半天不知道怎么写,终于搜到了,如下: /tools/upload: post: tags: - "tool" s ...
- Chef 自动化运维:初探 cookbook
cookbook 概述 Chef 意为"厨房",我们要做"菜",自然需要有"菜谱".事实上在 Chef 中分发到各服务器节点的不是" ...
- 《About Face 3:交互设计精髓》【PDF】下载
<About Face 3:交互设计精髓>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230384328 内容简介 全书分成3篇:第1 ...
- Docker容器中开始.NETCore之路
一.引言 开始写这篇博客前,已经尝试练习过好多次Docker环境安装,.Net Core环境安装了,在这里替腾讯云做一个推广,假如我们想学习.练手.net core 或是Docker却苦于没有开发环境 ...
- python的属性(property)使用
在面向对象编程的时候,我们定义一个Person类 class Person: def __init__(self): self.age = 22 这样写法能够方便的访问属性age, p = Perso ...