邮件的使用大多数使用者是在各类APP上实现的,而在Java中也可实现类似功能
邮件的发送过程与快递的发送十分相似,都是通过中转来完成的例如从A软件发送到B软件,则是从A的服务器中转到B的服务器的,最终才到用户手里中
我们把发送接受邮件的APP称为:MUA 处理邮件的中转服务器称为MTA 最终到达的服务器成为叫做MDA
在网络中邮件的常用协议有POP3 SMTP IMAP
POP3:
是英特网第一个离线协议标准,POP3允许用户从服务上把邮件下载到本地主机上,同时删除保存在服务器的邮件,而POP3服务器则遵循POP3协议
SMTP:
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式
IMAP:
因特网邮件访问协议,版本4rev1(IMAP4rev1)允许一个客户端访问和操作在一个服务器上的电子邮件。IMAP4rev1允许,以一 种功能上等效于本地文件夹的方式,操作邮箱(远程邮件文件夹)。IMAP4rev1也提供这样一个功能,一个离线客户端与服务器异步(交互)。
接下来我们以自己的邮箱给”猫人“发邮件为例 我们需要知道自己与对方的邮箱地址,首先要确定作为MTA邮件服务地址与端口号;
准备工作
我们通过Javamail API连接到SMTP服务器上:需要准备一个Propreties对象,填入相关信息。最后获取Session实例时,打开调试模式可以看到SMTP通信的详细内容,便于调试。
具体代码如下:
public class javaSession {
public static Session creatsession() {
//stmp服务器的地址
String smtp = "smtp.126.com";
//邮箱账户和密码
String usename = "cccxxx12@126.com";
String password = "***ILVGQRZAZADGR";
//stmp服务器的连接信息
Properties propes = new Properties();
propes.put("mail.smtp.host", smtp);//主机号
propes.put("mail.smtp.prot","25");//主机端口
propes.put("mail.smtp.auth", "true");//是否需要主机认证
propes.put("mail.smtp.starttls.enable", "true");//启用tls加密
//创建seesion
//参数一stmp服务器的连接信息
//参数二用户认证对象
Session session = Session.getInstance(propes, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(usename, password);
}
});
session.setDebug(true);
return session;
}
}
发送文件:
发送时需要构建一个Mssage 对象,然后调用Transport.send()即可完成发送:
具体代码如下:
public class email1 {
public static void main(String[] args) {
try {
Session session = javaSession .creatsession();
MimeMessage msg = new MimeMessage(session);
msg.setFrom(new InternetAddress("cccxxx12@126.com"));
//接收用户
msg.setRecipient(RecipientType.TO, new InternetAddress("843503190@qq.com"));
//文件标题
msg.setSubject("这是一封离别信","utf-8");
//邮件正文包含标签(控制文本的格式)
msg.setText("<b>写下我该</b>离开的原因","utf-8","html");
Transport.send(msg);
} catch (AddressException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
下面我们来查看运行结果:
发送附件:
要在邮件中发送附件就不能直接调用message.setText()方法,而是要创建一个Multipart对象:
代码实现如下:
public class email2 {
public static void main(String[] args) throws IOException {
try {
Session session = javaSession .creatsession();
MimeMessage msg = new MimeMessage(session);
//发送方
msg.setFrom(new InternetAddress("cccxxx12@126.com"));
//接受方
msg.setRecipient(RecipientType.TO, new InternetAddress("843503190@qq.com"));
//邮件标题
msg.setSubject("网易邮箱中信,","utf-8");
//邮件正文复合内容
Multipart multipart = new MimeMultipart();
//正文
BodyPart textpart = new MimeBodyPart();
//参数一:正文内容
//参数二:内容类型;字符编码集
StringBuffer dody = new StringBuffer();
dody.append("<b>写下我该</b>离开的原因");
dody.append("<img src=\"cid:gangzi \"/>");
textpart.setContent(dody.toString(),"text/html;charset=utf-8");
//附件
BodyPart imagePart = new MimeBodyPart();
imagePart.setFileName("bb.jpg");//设置附件显示名称
//数据处理对象(读取附件文件从本地磁盘进行读取)
imagePart.setDataHandler(
new DataHandler(
new ByteArrayDataSource(
Files.readAllBytes(Paths.get("F:\\陈嘻嘻\\新建文件夹\\555.jpg")),
"application/octet-stream")));
imagePart.setHeader("Content-ID", "<gangzi>");
//添加至邮件
multipart.addBodyPart(textpart);//添加正文
multipart.addBodyPart(imagePart);//添加附件
//设置邮件内容
msg.setContent(multipart);
Transport.send(msg);
} catch (AddressException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
结果如下:
到此程序结束:
使用javamail发送邮件是一个MUA软件通过SMTP协议发送邮件至MTA服务器
某些邮件服务商需要开启SMTP,并需要独立的登陆密码;