Email就是电子邮件。电子邮件的应用已经有几十年的历史了,我们熟悉的邮箱地址比如abc@example.com,邮件软件比如Outlook、网易闪电邮、Foxmail都是用来收发邮件的。当然,使用Java程序也可以收发电子邮件。我们先来看一下传统的邮件是如何发送的:传统的邮件是通过邮局投递,然后从一个邮局到另一个邮局,最终到达用户的邮箱。

电子邮件的发送过程也是类似的,只不过是电子邮件是从用户电脑的邮件软件,例如Outlook,发送到邮件服务器上,可能经过若干个邮件服务器的中转,最终到达对方邮件服务器上,收件方就可以用软件接收邮件:

             ┌─────────┐    ┌─────────┐    ┌─────────┐│░░░░░░░░░│    │░░░░░░░░░│    │░░░░░░░░░│
┌───────┐    ├─────────┤    ├─────────┤    ├─────────┤    ┌───────┐
│░░░░░░░│    │░░░░░░░░░│    │░░░░░░░░░│    │░░░░░░░░░│    │░░░░░░░│
├───────┤    ├─────────┤    ├─────────┤    ├─────────┤    ├───────┤
│       │───>│O ░░░░░░░│───>│O ░░░░░░░│───>│O ░░░░░░░│<───│       │
└───────┘    └─────────┘    └─────────┘    └─────────┘    └───────┘MUA           MTA            MTA            MDA           MUA

我们把类似Outlook这样的邮件软件称为MUA:Mail User Agent,意思是给用户服务的邮件代理;邮件服务器则称为MTA:Mail Transfer Agent,意思是邮件中转的代理;最终到达的邮件服务器称为MDA:Mail Delivery Agent,意思是邮件到达的代理。电子邮件一旦到达MDA,就不再动了。实际上,电子邮件通常就存储在MDA服务器的硬盘上,然后等收件人通过软件或者登陆浏览器查看邮件。

MTA和MDA这样的服务器软件通常是现成的,我们通常不会关心这些邮件服务器的内部是如何运行的。更多的需求场景,是需要发送邮件。例如:促销商品邮件、验证码邮件、消息通知邮件等。常见的邮件协议有:POP3、SMTP、IMAP。

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

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

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

所以,当我们关心的是如何实现邮件发送,其实就是编写一个MUA的软件,把邮件发送到MTA上。MUA到MTA发送邮件的协议就是SMTP协议,它是Simple Mail Transport Protocol的缩写,使用标准端口25,也可以使用加密端口465或587。SMTP协议是一个建立在TCP之上的协议,任何程序发送邮件都必须遵守SMTP协议。使用Java程序发送邮件时,我们无需关心SMTP协议的底层原理,只需要使用JavaMail这个标准API就可以直接发送邮件。

假设我们准备使用自己的邮件地址me@example.com给令狐冲发送邮件,已知令狐冲的邮件地址是xiaoming@somewhere.com,发送邮件前,我们首先要确定作为MTA的邮件服务器地址和端口号。邮件服务器地址通常是smtp.example.com,端口号由邮件服务商确定使用25、465还是587。

常用邮件服务商的SMTP信息:

QQ邮箱:SMTP服务器是smtp.qq.com,端口是465/587

163邮箱:SMTP服务器是smtp.163.com,端口是465

126邮箱:SMTP服务器是smtp.126.com,端口是25

Gmail邮箱:SMTP服务器是smtp.gmail.com,端口是465/587

准备好SMTP登录信息后,我们首先要把JavaMail相关的依赖Jar包javax.mail-1.6.2.jar加入至当前项目。

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

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

发送纯文本邮件代码如下:

package com.hpc.wyj01;import javax.mail.Message;
import javax.mail.Message.RecipientType;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;/*** 发送纯文本邮件* @author 我**/
public class Demo02 {public static void main(String[] args) {try {//创建Session会话Session session=Javacreatsession.creatSession();//2.创建邮件对象(Message抽象类的子类对象)MimeMessage msg=new MimeMessage(session);msg.setFrom(new InternetAddress("wyj000716@126.com"));msg.setRecipient(RecipientType.TO, new InternetAddress("464822504@qq.com"));msg.setSubject("魏雨娇发来的邮件","utf-8");msg.setText("他说他自己是个<b>美女</b>","utf-8","html");//3.发送邮件Transport.send(msg);} catch (AddressException e) {e.printStackTrace();} 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.126.com, user=我, password=<null>
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: trying to connect to host "smtp.126.com", port 25, isSSL false
220 126.com Anti-spam GT for Coremail System (126com[20140526])
DEBUG SMTP: connected to host "smtp.126.com", port: 25
EHLO baby
250-mail
250-PIPELINING
250-AUTH LOGIN PLAIN XOAUTH2
250-AUTH=LOGIN PLAIN XOAUTH2
250-coremail 1Uxr2xKj7kG0xkI17xGrU7I0s8FY2U3Uj8Cz28x1UUUUU7Ic2I0Y2UruSlYDUCa0xDrUUUUj
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 "1Uxr2xKj7kG0xkI17xGrU7I0s8FY2U3Uj8Cz28x1UUUUU7Ic2I0Y2UruSlYDUCa0xDrUUUUj"
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 baby
250-mail
250-PIPELINING
250-AUTH LOGIN PLAIN XOAUTH2
250-AUTH=LOGIN PLAIN XOAUTH2
250-coremail 1Uxr2xKj7kG0xkI17xGrU7I0s8FY2U3Uj8Cz28x1UUUUU7Ic2I0Y2UrvvEerUCa0xDrUUUUj
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 "1Uxr2xKj7kG0xkI17xGrU7I0s8FY2U3Uj8Cz28x1UUUUU7Ic2I0Y2UrvvEerUCa0xDrUUUUj"
DEBUG SMTP: Found extension "STARTTLS", arg ""
DEBUG SMTP: Found extension "ID", arg ""
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: protocolConnect login, host=smtp.126.com, user=wyj000716@126.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:<wyj000716@126.com>
250 Mail OK
RCPT TO:<464822504@qq.com>
250 Mail OK
DEBUG SMTP: Verified Addresses
DEBUG SMTP:   464822504@qq.com
DATA
354 End data with <CR><LF>.<CR><LF>
Date: Sun, 17 Jul 2022 18:50:06 +0800 (CST)
From: wyj000716@126.com
To: 464822504@qq.com
Message-ID: <1028214719.0.1658055006791@baby>
Subject: =?utf-8?B?6a2P6Zuo5aiH5Y+R5p2l55qE6YKu5Lu2?=
MIME-Version: 1.0
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: base645LuW6K+05LuW6Ieq5bex5piv5LiqPGI+576O5aWzPC9iPg==
.
250 Mail OK queued as smtp3,DcmowAAHbp5c6dNid4fPFA--.65343S3 1658055005
DEBUG SMTP: message successfully delivered to mail server
QUIT
221 Bye

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

发送HTML邮件和文本邮件是类似的,只需要在参数中加上:

msg.setText("他说他自己是个<b>美女</b>","utf-8","html");

我们要想在电子邮件中携带附件,我们就不能直接调用message.setText()方法,而是要构造一个Multipart对象。一个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中,即可发送。

具体实现代码如下:

package com.hpc.wyj01;import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;import javax.activation.DataHandler;
import javax.mail.BodyPart;
import javax.mail.Message.RecipientType;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.util.ByteArrayDataSource;public class Demo03 {public static void main(String[] args) {try {//1.创建Session会话Session session=Javacreatsession.creatSession();//2.创建邮件对象(Message抽象类的子类对象)MimeMessage msg=new MimeMessage(session);msg.setFrom(new InternetAddress("wyj000716@126.com"));msg.setRecipient(RecipientType.TO, new InternetAddress("464822504@qq.com"));msg.setSubject("魏雨娇那个傻子发来的邮件","utf-8");//msg.setText("他说他自己是个<b>傻子</b>","utf-8","html");//3.邮件内容“复合”对象Multipart multipart=new MimeMultipart();//正文//参数1:正文内容//参数2:内容类型;字符编码集BodyPart textpart=new MimeBodyPart();textpart.setContent("爱你孤身走<b>暗巷</b>","text/html;charset=utf-8");//附件BodyPart imagepart=new MimeBodyPart();imagepart.setFileName("sb.jpg");    //设置附件文件的显示名称//数据处理对象(读取附件文件从本地磁盘进行读取)imagepart.setDataHandler(new DataHandler(new ByteArrayDataSource(Files.readAllBytes(Paths.get("c:\\hpc\\QQ图片20220220101644.jpg")), "application/octet-stream")));//添加至邮件内容multipart.addBodyPart(textpart);   //添加正文 multipart.addBodyPart(imagepart);   //添加附件//设置邮件内容msg.setContent(multipart);//发送邮件Transport.send(msg);} catch (AddressException e) {e.printStackTrace();} catch (MessagingException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}

如果我们需要将附件中的图片在正文中显示,则需要用Bodypart对象通过setHeader( )方法把Multipart添加到Message中,具体实现代码如下:

package com.hpc.wyj01;import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;import javax.activation.DataHandler;
import javax.mail.BodyPart;
import javax.mail.Message.RecipientType;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.util.ByteArrayDataSource;import com.sun.mail.handlers.multipart_mixed;public class Demo04 {public static void main(String[] args) {try {Session session=Javacreatsession.creatSession();MimeMessage message=new MimeMessage(session);message.setFrom(new InternetAddress("wyj000716@126.com"));message.setRecipient(RecipientType.TO, new InternetAddress("464822504@qq.com"));message.setRecipient(RecipientType.CC, new InternetAddress("2858192496@qq.com"));message.setSubject("魏雨娇");Multipart multipart=new MimeMultipart();//2.2设置邮件内容//2.2.1//邮件正文部分BodyPart textpart=new MimeBodyPart();StringBuilder sb=new StringBuilder();sb.append("<h1>魏雨娇</h1>");//通过内容ID引用附件图片sb.append("<img src=\"cid:jiaozi.jpg\"/>");textpart.setContent(sb.toString(),"text/html;charset=utf-8");//邮件附件部分BodyPart imagepart=new MimeBodyPart();imagepart.setFileName("wyj.jpg");   //附件名称imagepart.setDataHandler(    //读取附件内容new DataHandler(new ByteArrayDataSource(Files.readAllBytes(Paths.get("c:\\hpc\\QQ图片20220220101644.jpg")),"application/octet-stream")));imagepart.setHeader("Content-ID", "<jiaozi>");    //设置内容ID//组合正文+附件multipart.addBodyPart(textpart);    //添加正文部分multipart.addBodyPart(imagepart);   //添加附件部分message.setContent(multipart);Transport.send(message);} catch (AddressException e) {e.printStackTrace();} catch (MessagingException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}

Java Email——使用Java程序收发电子邮件相关推荐

  1. JAVA Email——利用java完成发送电子邮件(包括附件)

    考虑这个问题之前我们先来看一下传统的邮件是如何发送的.传统的邮件是通过邮局投递,然后从一个邮局到另一个邮局,最终到达用户的邮箱.电子邮件的发送过程也是类似 的,只不过是电子邮件是从用户电脑的邮件软件, ...

  2. 网络编程----基于Java Email的电子邮件发送

    前言 电子邮件(electronic mail,简称E-mail,标志:@)又称电子信箱.电子邮政,它是-种用电子手段提供信息交换的通信方式.电子邮件指用电子手段传送信件.单据.资料等信息的通信方法. ...

  3. java applet 在线demo_编写可在线收发E-mail的Java Applet

    编写可在线收发E-mail的Java Applet 作者:未知    文章来源:www.jspcn.net 发布日期:2005年01月19日 说起Java,有些人可能会想到一些用于修饰主页的Apple ...

  4. java毕业设计——基于java+Java Swing+jsp的企业快信系统设计与实现(毕业论文+程序源码)——企业快信系统

    基于java+Java Swing+jsp的企业快信系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+Java Swing+jsp的企业快信系统设计与实现,文章末尾附有本毕业设 ...

  5. 基于JSP的JAVA email邮件系统研发

    欢迎添加微信互相交流学习哦! 项目源码:https://gitee.com/oklongmm/biye2 摘 要 由于网络中邮件管理系统繁多.业务需求多变,基于各邮件服务器的邮件管理系统的维护和业务变 ...

  6. 使用Java Email发送邮件

    前言Email就是电子邮件.电子邮件的应用已经有几十年的历史了,我们熟悉的邮箱地址比如abc@example.com,邮件软件比如Outlook.网易闪电邮.Foxmail都是用来收发邮件的.当然,使 ...

  7. Java 使用JavaMail通过Gmail发送电子邮件

    JavaMail提供给开发者处理电子邮件相关的编程接口.它是Sun发布的用来处理email的API可以方便地执行一些常用的邮件传输.可以基于JavaMail开发出类似于Microsoft Outloo ...

  8. java毕业设计——基于java+Socket+sqlserver的办公自动化系统设计与实现(毕业论文+程序源码)——办公自动化系统

    基于java+Socket+sqlserver的办公自动化系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+Socket+sqlserver的办公自动化系统设计与实现,文章末尾 ...

  9. Java Email 发HTML邮件工具 采用 freemarker模板引擎渲染

    Java Email 发HTML邮件工具 采用 freemarker模板引擎 1.常用方式对比 Java发送邮件有很多的实现方式 第一种:Java 原生发邮件mail.jar和activation.j ...

  10. java email qq邮箱 与 阿里企业邮箱/个人邮箱

    贴一个例子仅供参考  QQ邮箱 import org.apache.commons.mail.DefaultAuthenticator; import org.apache.commons.mail. ...

最新文章

  1. C语言的HashTable简单实现
  2. 在Mac OS X上安装 Ruby运行环境
  3. Aooms_基于SpringCloud的微服务基础开发平台实战_002_工程构建
  4. 内嵌在客户端的网页出现刷新问题
  5. python 爬取今日头条热点新闻
  6. 虎牙李萌:网络视听内容的工业化生产正在提速
  7. 中科院计算机学院研究生招生名额,中科院研究生招生
  8. creo5.0安装教程(图文详解)
  9. Securing Gateways with HTTPS(0.8)
  10. 英语之---动名词做定语
  11. VS Code 下载、下载慢、更新(适用于压缩包下载)
  12. 采写编杂志采写编杂志社采写编编辑部2022年第11期目录
  13. 记录毕设做小程序的坑(微信小程序体验版wx.request无法获取用户的openid)
  14. WEB安全 TCP协议安全 应用安全 信息安全 业务安全 SDK嵌入式防护 等保 攻击溯源 CDN DCDN
  15. 5.NDK Android jni开发 异常处理 native奔溃解决(相机图片美化)
  16. Python|自制二维码生成器
  17. tomcat安装配置.md
  18. 常见bootloader介绍
  19. 企业即时通讯软件是什么?它有哪些优势呢?
  20. 在css中如何调整字间距?

热门文章

  1. 去除枕头异味的两种方法
  2. Word替换特殊字符
  3. 计算机是好是坏英语作文,电脑游戏是好还是坏英语作文
  4. 微信小程序怎么用? 老徐小程序!
  5. ArcGIS空间统计——点密度计算
  6. fg-bg Assignment Imbalance problem
  7. shrinkwrap-resolver解析pom依赖
  8. 大数据分析服务器硬件配置如何选择
  9. 金凯瑞在马赫西管理大学毕业典礼的演讲
  10. signature=4a882a48c4a4b2b41835e11b6fafa69f,ABB 38SC980002R375