1.SMTP协议
用户连上邮件服务器后,要想给它发送一封电子邮件,需要遵循一定的通迅规则,SMTP协议就是用于定义这种通讯规则的。
因而,通常我们也把处理用户smtp请求(邮件发送请求)的邮件服务器称之为SMTP服务器。(25)
2.POP3协议
同样,用户若想从邮件服务器管理的电子邮箱中接收一封电子邮件的话,他连上邮件服务器后,也需要遵循一定的通迅格式,POP3协议用于定义这种通讯格式。
因而,通常我们也把处理用户pop3请求(邮件接收请求)的邮件服务器称之为POP3服务器。(110)
下图用于演示两帐户相互发送邮件的过程
3.1JavaMail API按其功能划分通常可分为如下三大类:
创建和解析邮件内容的API :Message类是创建和解析邮件的核心API,它的实例对象代表一封电子邮件。
3.2发送邮件的API:Transport类是发送邮件的核心API类,它的实例对象代表实现了某个邮件发送协议的邮件发送对象,例如SMTP协议。
接收邮件的API:Store类是接收邮件的核心API类,它的实例对象代表实现了某个邮件接收协议的邮件接收对象,例如POP3协议。
3.3Session类
Session类用于定义整个应用程序所需的环境信息,以及收集客户端与邮件服务器建立网络连接的会话信息,如邮件服务器的主机名、端口号、采用的邮件发送和接收协议等。Session对象根据这些信息构建用于邮件收发的Transport和Store对象,以及为客户端创建Message对象时提供信息支持。
4.邮件组织结构相关的API
MimeMessage类表示整封邮件。
MimeBodyPart类表示邮件的一个MIME消息。
MimeMultipart类表示一个由多个MIME消息组合成的组合MIME消息。
5.具体的例子程序
package cn.edu.dlmu.sendimport java.util.Properties
import javax.activation.DataHandler
import javax.activation.FileDataSource
import javax.mail.Message
import javax.mail.Session
import javax.mail.Transport
import javax.mail.internet.InternetAddress
import javax.mail.internet.MimeBodyPart
import javax.mail.internet.MimeMessage
import javax.mail.internet.MimeMultipart
import javax.mail.internet.MimeUtility
public class SendMail {
public static void main(String[] args) throws Exception {
Properties prop = new Properties()
//连接的邮件服务器的主机名
prop.setProperty("mail.smtp.host", "smtp.sina.com.cn")
//发送邮件的协议
prop.setProperty("mail.transport.protocol", "smtp")
//是否向邮件服务器提交认证
prop.setProperty("mail.smtp.auth", "true")
//创建session
Session session = Session.getInstance(prop)
session.setDebug(true)
//得到transport
Transport ts = session.getTransport()
//连接邮件服务器
ts.connect("smtp.sina.com.cn", "xxxx@sina.com", "xxxxx")
//发送邮件
MimeMessage message = createMessage(session)
ts.sendMessage(message, message.getAllRecipients())
ts.close()
}
public static MimeMessage createMessage(Session session) throws Exception {
MimeMessage message = new MimeMessage(session)
//设置邮件的基本信息
message.setFrom(new InternetAddress("xxxx@sina.com"))
message.setRecipient(Message.RecipientType.TO, new InternetAddress("1219070362@qq.com"))
message.setSubject("test")
//正文
MimeBodyPart text = new MimeBodyPart()
//设置charaset可以解决中文正文的乱码问题,内嵌可下载的图片
text.setContent("你好xxx,<img src='c:/dog.jpg' />测试成功!<br/><img src='cid:aaa.jpg' />", "text/htmlcharset=gbk")
//图片1
MimeBodyPart image = new MimeBodyPart()
image.setDataHandler(new DataHandler(new FileDataSource("src/88.jpg")))
image.setContentID("aaa.jpg")
//附件
MimeBodyPart attach = new MimeBodyPart()
DataHandler dh = new DataHandler(new FileDataSource("src/javamail架包.jar"))
attach.setDataHandler(dh)
//解决文件中文乱码问题
attach.setFileName(MimeUtility.encodeText(dh.getName()))
//描述正文和图片的关系
MimeMultipart mp = new MimeMultipart()
mp.addBodyPart(text)
mp.addBodyPart(image)
mp.setSubType("related")
//描述正文和附件
MimeMultipart mp2 = new MimeMultipart()
mp2.addBodyPart(attach)
//将正文封装为一个body
MimeBodyPart content = new MimeBodyPart()
content.setContent(mp)
mp2.addBodyPart(content)
mp2.setSubType("mixed")
message.setContent(mp2)
message.saveChanges()
return message
}
}
随着移动互联网的普及,邮件服务使用的场景越来越少。但是注册帐号的时候,还是需要邮箱地址。市面上免费的邮箱很多,不过一般需要绑定手机号,如果想在同一个邮箱服务商那注册多个邮箱帐号,需要准备多个手机号,这非常的烦人。接下来我们自己动手搭建邮件服务器吧。
邮件服务器之间采用SMTP协议进行通信,如果我们的云服务器想要接受邮件,需要打开25这个端口,并允许访问25端口。
邮件服务使用的特殊的DNS,需要进行配置。这里涉及到了两次映射,为了方便叙述,假设我的邮箱名字是: abc@example.com 。第一次映射通过添加MX记录类型,将邮箱@后面的主机映射到域名上,如下图所示,添加一个MX的记录类型。
第二次映射将上面的域名映射到我们云主机上的IP上,看过之前文章的朋友应该知道如何配置。
我们将使用postfix作为邮件服务器,因为它的特殊设定,需要先检查云主机的hostname,将hostname设置为邮件服务器的主机名。
安装postfix,执行下面的命令,弹窗会让你选择configuration和你的mail name
安装完成之后,检查一下服务是否启动,如果没有启动,可以执行postfix start。
邮件服务器搭建完毕,学习过计算机网络的同学应该知道,smtp只是邮件服务器之间的传输协议,读取邮件还需要pop3或者imap协议。所以如果还要读取邮件,还需要安装其他软件。需要说明的是:如果你的Ubuntu有user1的用户,那么邮件服务器就有 user1@example.com 的账户。
接下来我们用qq邮箱给刚搭好的邮件服务器发送测试邮件,当在云服务器上执行mail的
时候,提示收到了新邮件,选择1就显示邮件的内容。
细心的小伙伴可能已经发现了,邮件的内容是base64编码后的,并不能直接读取,这个时候执行以下decode,选择消息,就能进行解码啦
postfix还能发送邮件,但是前提是云服务器25端口出的流量是开启的,可以在云服务器上自己进行测试,看端口25是不是通的。对于postfix发送邮件感兴趣的可以自行搜索资料哦~
有了自建的邮件服务器,再也不用担心要多个手机号啦
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)