Email就是电子邮件。当然,使用Java程序也可以收发电子邮件。

一、邮件协议

常见的邮件协议有:POP3、SMTP、IMAP。

1.POP3

POP3是Post Office Protocol 3的简称,即邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议。它是因特网电子邮件的第一个离线协议标准,POP3允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在邮件服务器上的邮件,而POP3服务器则是遵循POP3协议的接收邮件服务器,用来接收电子邮件的。

2.SMTP

SMTP 的全称是“Simple Mail Transfer Protocol”,即简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。SMTP 服务器就是遵循 SMTP 协议的发送邮件服务器。SMTP 认证,简单地说就是要求必须在提供了账户名和密码之后才可以登录 SMTP 服务器,这就使得那些垃圾邮件的散播者无可乘之机。增加 SMTP 认证的目的是为了使用户避免受到垃圾邮件的侵扰。

3.IMAP

IMAP全称是Internet Mail Access Protocol,即交互式邮件存取协议,它是跟POP3类似邮件访问标准协议之一。不同的是,开启了IMAP后,您在电子邮件客户端收取的邮件仍然保留 在服务器上,同时在客户端上的操作都会反馈到服务器上,如:删除邮件,标记已读等,服务器上的邮件也会做相应的动作。所以无论从浏览器登录邮箱或者客户端 软件登录邮箱,看到的邮件以及状态都是一致的。

IMAP和POP3有什么区别?

POP3协议允许电子邮件客户端下载服务器上的邮件,但是在客户端的操作(如移动邮件、标记已读等),不会反馈到服务器上,比如通过客户端收取了邮箱中的3封邮件并移动到其他文件夹,邮箱服务器上的这些邮件是没有同时被移动的 。IMAP提供webmail 与电子邮件客户端之间的双向通信,客户端的操作都会反馈到服务器上,对邮件进行的操作,服务器上的邮件也会做相应的动作。

二、准备SMTP登陆信息

连接SMTP服务器时,需要准备一个Properties对象,填入相关信息。最后获取Session实例时,如果服务器需要认证,还需要传入一个Authenticator对象,并返回指定的用户名和口令。当我们获取到Session实例后,打开调试模式可以看到SMTP通信的详细内容,便于调试。

import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;public class Demo01 {public static void main(String[] args) {// SMTP服务器地址String smtp = "smtp.163.com";// 邮箱账号和密码(授权密码)String userName = "yummy010419@163.com";String password = "***FMZMCZDECYN";// SMTP服务器的连接信息Properties props = new Properties();props.put("mail.smtp.host", smtp);props.put("mail.smit.port", "25");props.put("mail.smtp.auth", "true");props.put("mail.smtp.starttls.enable", "true");// 创建Session// 参数1:SMTP服务器的连接信息// 参数2:用户认证对象(Authenticator接口的匿名实现类)Session session = Session.getInstance(props, new Authenticator() {@Overrideprotected PasswordAuthentication getPasswordAuthentication() {// TODO Auto-generated method stubreturn super.getPasswordAuthentication();}});session.setDebug(true);System.out.println(session);}
}

三、发送邮件

发送邮件时,我们需要构造一个Message对象,然后调用Transport.send(Message)即可完成发送:绝大多数邮件服务器要求发送方地址和登录用户名必须一致,否则发送将失败。

import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMessage.RecipientType;public class Demo02 {public static void main(String[] args) {// 1.创建Session会话try {Session session = JavaMaikUtils.creSession();// 2.创建邮件对象(Message抽象类的子类对象)MimeMessage msg = new MimeMessage(session);// 传入sessionmsg.setFrom(new InternetAddress("yummy010419@163.com"));// 发件人msg.setRecipient(RecipientType.TO, new InternetAddress("3347995330@qq.com"));msg.setSubject("这是一份测试邮件", "utf-8");//标题// 邮件正文中包含有"html"标签(控制文本的格式)msg.setText("今天<b>开心</b>吗", "utf-8");// 3.发送邮件Transport.send(msg);} catch (MessagingException e) {e.printStackTrace();}}
}

填入真实的地址,运行上述代码,我们可以在控制台看到JavaMail打印的调试信息,邮箱就可以收到消息了。

DEBUG: setDebug: JavaMail version 1.6.2
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle]
DEBUG SMTP: need username and password for authentication
DEBUG SMTP: protocolConnect returning false, host=smtp.163.com, user=lenovo, password=<null>
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: trying to connect to host "smtp.163.com", port 25, isSSL false
220 163.com Anti-spam GT for Coremail System (163com[20141201])
DEBUG SMTP: connected to host "smtp.163.com", port: 25
EHLO LAPTOP-KTOMC7JR
250-mail
250-PIPELINING
250-AUTH LOGIN PLAIN XOAUTH2
250-AUTH=LOGIN PLAIN XOAUTH2
250-coremail 1Uxr2xKj7kG0xkI17xGrU7I0s8FY2U3Uj8Cz28x1UUUUU7Ic2I0Y2UFTa94RUCa0xDrUUUUj
250-STARTTLS
250-ID
250 8BITMIME
DEBUG SMTP: Found extension "PIPELINING", arg ""
DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN XOAUTH2"
DEBUG SMTP: Found extension "AUTH=LOGIN", arg "PLAIN XOAUTH2"
DEBUG SMTP: Found extension "coremail", arg "1Uxr2xKj7kG0xkI17xGrU7I0s8FY2U3Uj8Cz28x1UUUUU7Ic2I0Y2UFTa94RUCa0xDrUUUUj"
DEBUG SMTP: Found extension "STARTTLS", arg ""
DEBUG SMTP: Found extension "ID", arg ""
DEBUG SMTP: Found extension "8BITMIME", arg ""
STARTTLS
220 Ready to start TLS
EHLO LAPTOP-KTOMC7JR
250-mail
250-PIPELINING
250-AUTH LOGIN PLAIN XOAUTH2
250-AUTH=LOGIN PLAIN XOAUTH2
250-coremail 1Uxr2xKj7kG0xkI17xGrU7I0s8FY2U3Uj8Cz28x1UUUUU7Ic2I0Y2UrqWrgsUCa0xDrUUUUj
250-STARTTLS
250-ID
250 8BITMIME
DEBUG SMTP: Found extension "PIPELINING", arg ""
DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN XOAUTH2"
DEBUG SMTP: Found extension "AUTH=LOGIN", arg "PLAIN XOAUTH2"
DEBUG SMTP: Found extension "coremail", arg "1Uxr2xKj7kG0xkI17xGrU7I0s8FY2U3Uj8Cz28x1UUUUU7Ic2I0Y2UrqWrgsUCa0xDrUUUUj"
DEBUG SMTP: Found extension "STARTTLS", arg ""
DEBUG SMTP: Found extension "ID", arg ""
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: protocolConnect login, host=smtp.163.com, user=yummy010419@163.com, password=<non-null>
DEBUG SMTP: Attempt to authenticate using mechanisms: LOGIN PLAIN DIGEST-MD5 NTLM XOAUTH2
DEBUG SMTP: Using mechanism LOGIN
DEBUG SMTP: AUTH LOGIN command trace suppressed
DEBUG SMTP: AUTH LOGIN succeeded
DEBUG SMTP: use8bit false
MAIL FROM:<yummy010419@163.com>
250 Mail OK
RCPT TO:<3347995330@qq.com>
250 Mail OK
DEBUG SMTP: Verified Addresses
DEBUG SMTP:   3347995330@qq.com
DATA
354 End data with <CR><LF>.<CR><LF>
Date: Sun, 17 Jul 2022 17:49:54 +0800 (CST)
From: yummy010419@163.com
To: 3347995330@qq.com
Message-ID: <1028214719.0.1658051394158@LAPTOP-KTOMC7JR>
Subject: =?utf-8?B?6L+Z5piv5LiA5Lu95rWL6K+V6YKu5Lu2?=
MIME-Version: 1.0
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: base645LuK5aSpPGI+5byA5b+DPC9iPuWQlw==
.
250 Mail OK queued as smtp12,EMCowAB3Qq5B29NiuePTCA--.64472S3 1658051403
DEBUG SMTP: message successfully delivered to mail server
QUIT
221 Bye

从上面的调试信息可以看出,SMTP协议是一个请求-响应协议,客户端总是发送命令,然后等待服务器响应。服务器响应总是以数字开头,后面的信息才是用于调试的文本。这些响应码已经被定义在SMTP协议中了,查看具体的响应码就可以知道出错原因。

四·、发送HTML邮件

发送HTML邮件和文本邮件是类似的,只需要把:

message.setText(body, "UTF-8");

改为:

message.setText(body, "UTF-8", "html");

传入的body是类似<h1>Hello</h1><p>Hi, xxx</p>这样的HTML字符串即可。

五、发送附件

要在电子邮件中携带附件,我们就不能直接调用message.setText()方法,而是要构造一个Multipart对象:

// 3.邮件内容"复合"对象Multipart multipart = new MimeMultipart();// 正文BodyPart textPart = new MimeBodyPart();textPart.setContent("等风来不如追风去 <b>追逐</b>的过程就是人生的意义","text/html;charset=utf-8");// 附件BodyPart imagePart = new MimeBodyPart();imagePart.setFileName("young.jpg");// 数据处理对象(读取附件文件从本地磁盘进行读取)imagePart.setDataHandler(new DataHandler(new ByteArrayDataSource(Files.readAllBytes(Paths.get("E:\\test\\gdg.jpg")), "application/octet-stream")));// 添加至邮件内容multipart.addBodyPart(textPart);// 添加正文multipart.addBodyPart(imagePart);// 添加附件

一个Multipart对象可以添加若干个BodyPart,其中第一个BodyPart是文本,即邮件正文,后面的BodyPart是附件。BodyPart依靠setContent()决定添加的内容,如果添加文本,用setContent("...", "text/plain;charset=utf-8")添加纯文本,或者用setContent("...", "text/html;charset=utf-8")添加HTML文本。如果添加附件,需要设置文件名(不一定和真实文件名一致),并且添加一个DataHandler(),传入文件的MIME类型。二进制文件可以用application/octet-stream,Word文档则是application/msword。最后,通过setContent()把Multipart添加到Message中,即可发送。

六、发送内嵌图片的HTML邮件

如果需要在HTML邮件中内嵌图片,可以选择在邮件中加入

<img src="http://example.com/test.jpg">,这样的外部图片链接通常会被邮件客户端过滤,并提示用户显示图片并不安全。只有内嵌的图片才能正常在邮件中显示。所以,这种方式并不推荐。推荐将内嵌图片作为一个附件嵌入邮件,即邮件本身也是Multipart,但需要做一点额外的处理:

// 邮件正文部分BodyPart textBodyPart = new MimeBodyPart();StringBuilder body = new StringBuilder();body.append("<h>郭德纲</h>");body.append("<img src = 'cid:gangzi'/>");// 通过内容ID引用附件照片textBodyPart.setContent(body.toString(),"text/html;charset= utf-8");// 邮件附件部分BodyPart imageBodyPart = new MimeBodyPart();imageBodyPart.setFileName("gdg.jpg");imageBodyPart.setDataHandler(new DataHandler(new ByteArrayDataSource(Files.readAllBytes(Paths.get("E:\\test\\gdg.jpg")),"application/octet-stream")));imageBodyPart.setHeader("Content-ID", "<gangzi>");//设置内容ID// 组合正文和邮件Multipart multipart = new MimeMultipart();multipart.addBodyPart(textBodyPart);multipart.addBodyPart(imageBodyPart);

网络编程——Java Email相关推荐

  1. java获取主机信息大全,网络编程:Java获取网络主机信息

    java.net.InetAddress类表示互联网协议 (IP) 地址. 有两个子类:Inet4Address, Inet6Address 通过 InetAddress可以方便获取一个域名下的IP, ...

  2. 网络编程--JAVA之多线程下载后续:断点续存

    这篇博客就是接在我上篇博客网络编程–JAVA之多线程下载的基础上来实现的. 首先,我来说一下断点续存能解决啥问题: 假如当我们在进行MP4下载时,如果突然出现人为的中断或者意外的中断,那么当我们再次点 ...

  3. 网络编程 -java高级技术

    网络通信的基本概念 /**目标:基本软件结构.通信一定是基于软件结构实现的:1.C/S结构 :全称为Client/Server结构,是指客户端和服务器结构.常见程序有QQ.迅雷,IDEA等软件.2.B ...

  4. TCP网络编程 [Java]

    TCP网络编程 这里我们通过一个例子来了解什么是TCP网络编程: eg: 问题: -> 从客户端发送文件到服务端,服务端将接受到的客户端发来的文件存储到本地之后并返回一个发送成功给客户端,并关闭 ...

  5. 网络编程-java入门

    网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编程是比较复 ...

  6. java推送技术_java网络编程 - java服务器推送技术系列方案实战

    前言 服务器推送技术(又名Comet)是建立在ARP基础之上的一种非常实用的技术,它广泛应用于Web端,手机APP应用端等.具体很多场景都需要此技术的支撑,包括扫码登录.扫码支付.网页支付.端到端消息 ...

  7. java 正则对象_网络编程Java 使用正则表达式对象实现正则的获取功能

    获取需要使用到正则的两个对象: 使用的是用正则对象Pattern 和匹配器Matcher. 用法: 范例: Pattern p = Pattern.compile("a*b"); ...

  8. Python网络编程:E-mail服务(八) 实现抄送和密送功能

    简介 本文介绍如何通过smtp模块实现邮件的抄送和密送功能. 抄送功能实现 在发送邮件时,除了发送给相关的责任人,有时还需要知会某些人.这时就需要在邮件里指定抄送人员列表.相关实现如下: import ...

  9. 迈入JavaWeb第一步,Java网络编程基础,TCP网络编程URL网络编程等

    文章目录 网络编程概述 网络通信要素 要素一IP和端口号 要素二网络协议 TCP网络编程 UDP网络编程 URL网络编程 Java网络编程基础 网络编程概述 Java是Internet上的语言,它从语 ...

  10. 重拾Java基础知识:网络编程

    网络编程 前言 网络体系结构 IP地址 IP地址分类 子网掩码 端口 域名 网络协议 TCP/IP协议 三次握手与四次挥手 为什么要三次握手? 为什么要四次挥手? UDP协议 HTTP协议 Socke ...

最新文章

  1. 科技部向全社会征集颠覆性技术研发方向
  2. 九、序列参数集Sequence Paramater Set(SPS)解析
  3. 【hard】146. LRU Cache
  4. 企业生产经营相关英文及缩写之(11)--Genenic 普通书写
  5. 深入理解InnoDB(2)—页的存储结构
  6. jQuery 中 data 方法的实现原理
  7. Lua 服务器Socket通信实例(转)
  8. C#算法练习,求e,求π
  9. 服务器linux命令aux,Linux查看所有进程ps -aux命令介绍
  10. 高斯烟羽模型matlab程序,高斯烟羽模型的改进及在危化品泄漏事故模拟中的应用...
  11. OI国家集训队论文集1999~2018
  12. 菜菜之路-C语言求阶乘和
  13. UFS Host基础特性分析 -- 硬件部分
  14. webdriver-helper安装说明
  15. 3d建模软件安装教程,游戏建模必备软件推荐(收藏)
  16. 项目遇到的难点、印象深刻点总结
  17. Qt[每日一言|每日诗词]API调用
  18. php 序列化转义冒号,Json数据中有冒号以及其它特殊字符序列化总结
  19. 会计凭证替代BTE增强
  20. 重邮2017年硕士研究生入学考试(《数据结构》802)自己做的部分答案

热门文章

  1. 跟我学c++中级篇——decay
  2. iOS应用内购常见问题及注意事项
  3. 怎么用计算机弹奏忘羡,《忘羡,钢琴谱》魔道祖师 岚之调(五线谱 钢琴曲 指法)-弹吧|蛐蛐钢琴网...
  4. Datagrid 的 deleteRow、insertRow使用
  5. 老徐最近翻译的Mercury“最佳功能测试实践”-第一部分
  6. Solr实现全文检索
  7. Improved Techniques for Training GANs翻译与理解
  8. 读书笔记3|使用Python,networkx对卡勒德胡赛尼三部曲之——《群山回唱》人物关系图谱绘制
  9. [Scala的协变和逆变]
  10. 没所谓移动开发寒冬,不过是大鱼吃小鱼