数年前,邮件的发送是经过人为的运输,从发件人---当地邮局---收件地邮局---收件人,付出的人力物力是非常大的。随着时代的进步,科技的发展,如今我们的生活中出现更高级发送邮件的方式,最常用的就是从(邮箱--邮箱),当然中间会经过多个邮箱服务器的转载,称为电子邮箱。此篇文章的内容就是简单的通过java程序发送邮件。
1.首先我们先了解邮件的协议
POP3
POP3是Post Office Protocol 3的简称,即邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议。它是因特网电子邮件的第一个离线协议标准,POP3允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在邮件服务器上的邮件,而POP3服务器则是遵循POP3协议的接收邮件服务器,用来接收电子邮件的。
SMTP
SMTP 的全称是 “ Simple Mail Transfer Protocoli,即简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP 协议属于 TCP/IP 协议族,它帮助每台计算机在发送或中转信件时找到下一 个目的地。SMTP 服务器就是遵循 SMTP 协议的发送邮件服务器。SMTP 认证,简单地说就是要求必须在提供了账户名和密码之后才可登录 SMTP 服务器,这就使得那些垃圾邮件散播者无可乘之机。增加 SMTP 认证的目的是为了使用户避免受到垃圾邮件的侵扰。
IMAP
IMAP全称是Internet Mail Access Protocol, 即交互式邮件存取协议,它是跟POP3类似邮件访问标准协议之间不同的是,开启了IMAP后,您在电子邮件客户端收取的邮件仍然保留在服务器上,同时在客户端上的操作都会反馈到服务器上,如:删除邮件,标记已读等,服务器上的邮件也会做相应的动作。所以无论从浏览器登录邮箱或者客户端 软件登录邮箱,看到的邮件以及状态都是
一致的。
IMAP和POP3有什么区别?
POP3协议介许电子邮件客户端下载服务器上的邮件,但是在客户端的操作 (如移动邮件、标记已读等),不会反馈到服务器上,比如通过客户端收取了邮箱中的3封邮件并移动到其他文件夹,邮箱服务器上的这些邮件是没有同时被移动的。
IMAP提供webmail 与电子邮件客户端之间的双向通信,客户端的操作都会反馈到服务器上,对邮件进行的操作,服务器上的邮件也会做相应的动作。
当我们了解了邮件协议后,接下来准备发送一个简单的邮件、
1.创建Session,准备STMP登录的信息
(1).创建STMP地址(以126邮箱为例)
(2).设置发件人的帐号和密码(使用授权密码,可在126邮箱中设置,当不需要使用时,删除设备即可)
(3).连接到SMTP服务器(须先创建Proerties对象),调用put()方法添加SMTO主机名,主机端口号,是否需要用户认证,启用TLS加密。
(4).创建Session,调用getInstance()方法,传入SMTP服务器连接信息和Authenticator接口的匿名类,并重写PAsswordAuthentication()方法,传入登陆用户名和登陆密码(授权密码)。
(5).设置debug模式便于调式。实现代码如下。
(6).我们将信息封装在一个方法中,使用时直接调用即可。具体实现如下。
2.创建Session对话
(1). 创建邮件对象 ,MimeMessage对象,调用setFrom()方法,传入发件人的账户名称
(2).调用setFecipient()方法,设置收件类型RecipientType.TO(收件)/RecipientType.CC(抄送),并传入收件人邮箱账户名称,注:如果需要同时发送给收件人并抄送其它收件人,需要调用
setFecipients()方法,创建new InternetAddress[],再让抄送人的地址传入,当然,此时的收件类型是RecipientType.CC。
(3).接下来设置邮件标题,调用setSubject()方法,传入标题,并设置字符编码。
(4).调用setText()方法,输入正文内容,如果正文内容有Html标签,如:<b></b>:则需要传参数"html".
(5).如果需要发送带有附件的邮件,需要创建Multipart的对象,来进行附件的复合,在创建BodyPart对象,调用setFileName()方法,设置附件文件的名称设置,之后调用serDataHandler()方法,传入字节数组,再通过Files工具类的readAllbytes方法读取传入的本地图片,文件路径使用Paths工具类的get()方法获得。最后调用setContent()方法将附加加入邮件内容。
(6).如果要让发送的附件内容显示在正文,则需要再邮件附件部分通过BodyPart对象的setHeader()方法,设置名称,之后再正文部分添加名称。
(7).最后使用Transport的send()方法发送邮件。代码如下。
如上所述,一个简单的邮件就发送好了。