专栏首页WebJ2EEJAVA:如何发邮件?

JAVA:如何发邮件?

1. SMTP、POP3、IMAP 啥关系 ?

先看一张比较有年代感的图...

SMTP:

  • 全称 “Simple Mail Transfer Protocol”,简单邮件传输协议;
  • 使用 TCP 可靠数据传输服务;
  • 端口 25;
  • 用于发送邮件;
  • 用于从发送方的邮件服务器发送邮件到接收方的邮件服务器;
  • RFC 2821 -> RFC 5536;

https://datatracker.ietf.org/doc/rfc2821/ https://datatracker.ietf.org/doc/rfc5336/

SMTP 是用来【发】邮件的

POP3:

  • 全称 “Post Office Protocol 3” ,第三版邮局协议;
  • 使用 TCP 可靠数据传输服务;
  • 用于接收邮件;
  • 用于将邮件从邮件服务器拉取到本地用户代理;
  • RFC 1939;

注:POP3 协议很简单,功能也很有限;比如 POP3 虽然允许从邮件服务器上下载邮件,但它不会将客户端的操作(如移动邮件、标记已读等)反馈到服务器上;

POP3 是用来【收】邮件的

IMAP:

  • 全称 “Internet Mail Access Protocol”,因特网邮件访问协议;
  • 与 POP3 类似,也用于邮件,但它比POP3更强大;
  • RFC 3501;

注:IMAP 不仅可以从邮件服务器上下载邮件,而且它可以将客户端上的操作(如移动邮件、标记已读等)都反馈到邮件服务器上;所以无论从浏览器登录邮箱或者客户端软件登录邮箱,看到的邮件以及状态都是一致的。

IMAP 也是用来【收】邮件的

比 POP3 更专业

2. SMTP 通信协议概述

SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)定义了邮件客户端与SMTP服务器之间,以及两台SMTP服务器之间发送邮件的通信规则 。SMTP 协议属于TCP/IP协议族,通信双方采用一问一答的命令/响应形式进行对话,且定了对话的规则和所有命令/响应的语法格式。

—— 抄的

—— 抄的

是时候秀一波操作了

下面演示用 SMTP 命令发一封邮件

场景描述:

工具:Telnet 发件人:<lzx@dareway.com.cn> 收件人:<webj2ee@126.com> 主题:A very important email. 正文:Hello, I am webj2ee, good to see you.

A. 检查是否已安装 Telnet 客户端:

B. 使用 SMTP 命令发送邮件:

3. 使用 Commons Email 发邮件

Java 环境中实现邮件发送功能,常用两种方式:

  • JavaMail;
  • Apache Commons Email;

Apache Commons Email 是基于 JavaMail 的封装,接口更友好,使用更简单;

示例:使用 JavaMail 发送邮件

示例:使用 Apache Commons Email 发送邮件

建议使用

Apache Commons Email

实现邮件收发功能

参考:

http://www.oracle.com/technetwork/java/javamail/index.html https://javaee.github.io/javamail/ http://commons.apache.org/proper/commons-email/

本文分享自微信公众号 - WebJ2EE(WebJ2EE)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-08-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Git的诞生和高并发的演变

    Linus Torvalds,是一个传奇式的人物,他给出了Linux的原型,并一直积极推广Linux。1991年,在网络上发布了源码,从此之后,Lin...

    杨小杰
  • Nginx+Tomcat实现动静分离

    为了提高网站的响应速度,减轻服务器的压力,对于图片、css、js等静态资源文件,我们可以在反向代理服务器中进行缓存,这样浏览器在请求一个静态资源时,代理服务器就...

    秃头哥编程
  • 网页元素竟然无法定位......

    最近接了个项目,网页元素定位比以往的要全乎许多,多种多样的情况都遇到了,初级高级都用到了,最简单的初级比如直接通过id,name,class来定位获取,高级一点...

    软测小生
  • 当你写爬虫遇到APP的请求有加密参数时该怎么办?【初级篇-常规模式】

    嗯,在看完了《当你写爬虫抓不到APP请求包的时候该怎么办?》系列之后,同学们对抓APP的请求包应该已经是轻车熟路了吧。在对想爬的APP抓个包之后你可能会发现,只...

    sergiojune
  • Spring的三大器之监听器

    现在来说说Servlet的监听器Listener,它是实现了javax.servlet.ServletContextListener 接口的服务器端程序,它也是...

    一觉睡到小时候
  • SpringMVC之细说HandlerMapping

    客户端发送请求,web容器接受请求,如果请求与DispatcherServlet的请求映射路径(url-pattern)匹配,web容器将请求交给Dispatc...

    一觉睡到小时候
  • 使用TestNG listener实现Case失败重跑功能

    Case失败了,想自动再跑一遍确认到底是不稳定还是真bug? 这可咋整啊? 使用testng的listener

    软测小生
  • 单例模式-唯一实例

    其实这样写是可以的,但是会影响效率。当一个实例创建之后,再次进行这个方法的调用,会进行加锁,然后返回这个实例

    杨小杰
  • Selenium无法定位元素之切换Iframe和切换窗口

    最近接了个项目,网页元素定位比以往的要全乎许多,多种多样的情况都遇到了,初级高级都用到了,最简单的初级比如直接通过id,name,class来定位获取,高级一点...

    软测小生
  • 迭代器模式

    有两家餐厅,共有两个菜单,两家准备合并,每个餐厅都有一个销售系统,但是内部菜单的组成结构稍有不同,一个是用数组存储菜单对象,一个是用集合存储菜单对象

    杨小杰

扫码关注云+社区

领取腾讯云代金券