其实想写JavaMail这一系列的博客已经有一个月之久了,缘起是某次乱逛传智播客官网浏览到相关的视频教程,想起大学时代学过的计算机网络提到邮件相关的协议,但遗憾的是到目前为止还没有接触计算机网络编程,尤其搞Java EE开发之后,底层的网络细节都已经封装好了,并没有接触多少底层的细节,一直以来以为只要与网络协议相关的编程都是C/C++家族特有的功能。看了张孝祥老师的视频之后,发现C/C++能干的事,Java也能干出来,并且一下子就对邮件开发有点兴趣起来。当然看了视频之后还只是懵懵懂懂不能理解透彻,毕竟很有很多细节值得下去咀嚼。于是又买了张孝祥老师的《Java邮件开发详解》来,这才对JavaMail理解明朗起来。

在这感谢张孝祥老师,老师虽然已经辞世,但其技术书籍却普惠了后来人。本系列教程知识点提炼自张孝祥老师的JavaMail视频教程和《Java邮件开发详解》书籍,以及来自JavaMail官方的API文档,是对上诉系列文档的归纳、升华和总结。本系列博客适合刚学完了Java SE的初学者,和正在学习计算机网络编程的在校生,以及已经有工作经验的Java EE开发提供JavaMail方面的参考资料。

本系列博客教程内容大致分为:邮件协议相关协议讲解,JavaMail邮件的发送,电子邮件的组织结构,使用JavaMail生成复杂结构的电子邮件,邮件的接收和解析等。并最总能够向好友发送一封复杂邮件,这封邮件应该包含附件、超链接、HTML格式文本以及内嵌图片,并且邮件的抄送人,密送人也能够正常接收到邮件的内容。

基本概念

邮件服务器

电子邮件的系统抽象简单概括如下图:

从图中可以看出,电子邮件服务器主要有一下功能:

  1. 接收用户投递的邮件;
  2. 将用户投递进来的邮件转发给目标邮件服务器;
  3. 接收其他邮件服务器转发来的邮件,并把邮件存储到其他管理的用户邮箱中;
  4. 为前来读取邮件的用户提供读取服务。

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开山篇的更多相关文章

  1. Android快乐贪吃蛇游戏实战项目开发教程-01项目概述与目录

    一.项目简介 贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏. 我已经将做好的案例上传到了应用宝,无病毒.无广告,大家可以放心下载下来把玩一下.应用宝 ...

  2. [051] 微信公众平台开发教程第22篇-怎样保证access_token长期有效

    为了使第三方开发人员能够为用户提供很多其它更有价值的个性化服务,微信公众平台开放了很多接口,包含自己定义菜单接口.客服接口.获取用户信息接口.用户分组接口.群发接口等,开发人员在调用这些接口时.都须要 ...

  3. EnjoyingSoft之Mule ESB开发教程第三篇:Mule message structure - Mule message结构

    目录 1. 探索Mule Message结构 2. Mule Message的Payload 3. Mule Message的Property 4. Mule Message的Attachment 5 ...

  4. EnjoyingSoft之Mule ESB开发教程第四篇:Mule Expression Language - MEL表达式

    目录 1. MEL的优势 2. MEL的使用场景 3. MEL的示例 4. MEL的上下文对象 5. MEL的Variable 6. MEL访问属性 7. MEL操作符 本篇主要介绍Mule表达式语言 ...

  5. EnjoyingSoft之Mule ESB开发教程第六篇:Data Transform - 数据转换

    目录 1. 数据转换概念 2. 数据智能感知 - DataSense 3. 简单数据转换组件 3.1 Object to JSON 3.2 JSON to XML 3.3 JSON to Object ...

  6. [039] 微信公众帐号开发教程第15篇-自定义菜单的view类型(访问网页)

    引言及内容概要 距离写上一篇文章<自定义菜单的创建及菜单事件响应>整整过了两个月的时间,那时公众平台还没有开放view类型的菜单.在不久前,微信公众平台悄悄开放了view类型的菜单,却没有 ...

  7. 谷歌浏览器web开发教程之开始篇:使用sublime

    你的代码编辑器是主要的开发工具:你使用它去编辑和保存代码段.你可以通过学习编辑器快捷键和以及安装关键插件来好而快的写出代码. 目录 安装sublime文本编辑器 为什么使用包管理器? 安装插件 摘要 ...

  8. JNI/NDK开发指南(开山篇)

    转载请注明出处:http://blog.csdn.net/xyang81/article/details/41759643 相信很多做过Java或Android开发的朋友经常会接触到JNI方面的技术, ...

  9. [033] 微信公众帐号开发教程第9篇-QQ表情的发送与接收(转)

    我想大家对QQ表情一定不会陌生,一个个小头像极大丰富了聊天的乐趣,使得聊天不再是简单的文字叙述,还能够配上喜.怒.哀.乐等表达人物心情的小图片.本文重点要介绍的内容就是怎样在微信公众平台使用QQ表情, ...

随机推荐

  1. mybatis延迟加载一对多

    1.实体类 package cn.bdqn.bean; import java.util.Set; /** *国家的实体类 */ public class Country { private Inte ...

  2. java基础解析系列(十一)---equals、==和hashcode方法

    java基础解析系列(十一)---equals.==和hashcode方法 目录 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析系 ...

  3. (二)—Linux远程连接与常用命令

    要学linux ,一定得用命令界面的,怎么也得是shell语言,用就最难最原始的,用的人都是专家,历史最少也得30年,不管有三七二十一上来就敲ls ,先看看当前目录都有什么.一口专业的linux范儿, ...

  4. 掌握sklearn系列——1 学会加载数据

    我们直接看代码: from sklearn import datasets #读取三组数据,前两个用于分类,第三个用于回归 iris = datasets.load_iris() digits = d ...

  5. vim配置分享(持续更新中)

    作者:zhanhailiang 日期:2014-10-24 set nocompatible set nu   "" 自己主动缩进 syntax on set autoindent ...

  6. 机器学习——深度学习(Deep Learning)

    Deep Learning是机器学习中一个非常接近AI的领域,其动机在于建立.模拟人脑进行分析学习的神经网络,近期研究了机器学习中一些深度学习的相关知识,本文给出一些非常实用的资料和心得. Key W ...

  7. java.util.ConcurrentModificationException异常排查

      java.util.ConcurrentModificationException对于这个异常我们一般会认为是在遍历list的时候对这个list做了add,remove等修改操作造成的,最近在线上 ...

  8. css经典布局—stick footer布局

    html部分 <div id="wrap"> <div id="main" class="clearfix"> &l ...

  9. Pycharm配置(二)

    1.主题 这部分教程主要介绍如何创建一个Python工程并使其具有Pycharm的代码风格.你将会看到Pycharm使你的源码变得非常简洁美观,带有合适的缩进.空格等等,因此Pycharm也是一款代码 ...

  10. 环境变量配置文件,本地登录前提示信息/etc/issue

    让配置文件立即生效:source 配置文件 或 . 配置文件 /etc/profile 例:定义了HISTSIZE=1000 /etc/profile.d/*.sh /etc/bashrc ~/.ba ...