通过对计算机网络的学习我可以知道,在发送电子邮件的时候使用的协议为smtp协议,接受电子邮件使用的协议为pop3协议,而这两个协议都是位于五层模型的应用层。
SMTP是一种提供可靠且有效的电子邮件传输的协议。SMTP是建立在FTP文件传输服务上的一种邮件服务,主要用于系统之间的邮件信息传递,并提供有关来信的通知。SMTP独立于特定的传输子系统,且只需要可靠有序的数据流信道支持,SMTP的重要特性之一是其能跨越网络传输邮件,即“SMTP邮件中继”。使用SMTP,可实现相同网络处理进程之间的邮件传输,也可通过中继器或网关实现某处理进程与其他网络之间的邮件传输。
POP3,全名为“Post Office Protocol - Version 3”,即“邮局协议版本3”。是TCP/IP协议族中的一员,由RFC1939 定义。本协议主要用于支持使用客户端远程管理在服务器上的电子邮件。提供了SSL加密的POP3协议被称为POP3S。
下面我们使用Java发送邮件
一、准备工作
1、需要导入javax.mail-1.6.2.jar包;
2、准备smtp登录信息:准备一个公共的类用来连接smtp服务并且创建Session 例如
public final class JavaMainUtils {
private JavaMainUtils() {
}
public static Session createSession() {
// 邮箱账号信息
String userName = "用户名";// 用户名
String password = "EEZSLUTYCFKKGEDY";// 账号授权密码
Properties props = new Properties();
props.put("mail.smtp.host", "smtp.163.com"); // 主机名
props.put("mail.smtp.port", "25");// 主机端口号
props.put("mail.smtp.auth", "true");// 是否需要用户认证
props.put("mail.smtp.starttls.enable", "true"); // 启用TLS加密
// 创建Sessoion
// 参数1:smtp服务器连接参数
// 参数2:账号和密码授权认证对象
Session session = Session.getInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(userName, password);
}
});
session.setDebug(true);
return session;
}
}
注意:
1、使用私有的构造方法是为了防止该类被外部实例化;
2、账号的授权秘密需要在邮箱中设置,并且通过手机扫码的方式获取;
3、通过Authenticator创建的对象是账号和密码授权认证对象;
4、session.setDebug(true)的作用是获取发送电子邮件的调试信息;
获取授权密码方法(以网易邮箱为例)
二、发送普通邮件
public static void main(String[] args) {
try {
// 1、创建session会话
Session session = JavaMainUtils.createSession();
// 2、创建邮件对象
MimeMessage message = new MimeMessage(session);
message.setSubject("我是你"); // 设置邮件标题
message.setText("我是你");// 设置邮件正文
message.setFrom(new InternetAddress("设置发件人@163.com"));// 设置发件人
message.setRecipient(RecipientType.TO, new InternetAddress("设置收件人@qq.com"));// 设置收件人
// 发送
Transport.send(message);
} catch (MessagingException e) {
e.printStackTrace();
}
}
发送邮件的时候我们需要构造一个MimeMessage对象,然后调用Transport.send(message)即可完成发送,绝大多数的邮件服务器要求发送方地址和登录用户名完全一致,否则会发送失败。
1、setSubject是用来设置邮件标题;
2、setText是用来设置邮件正文;
3、setFrom需要传入一个InternetAddress对象,表示发件人的邮箱地址;
4、setRecipient用来设置收件人的邮箱地址。
三、发送HTML邮件
发送HTML邮件的时候我们只需把在上述代码中加入一个参数即可:
message.setText("我是你");// 设置邮件正文
改为:
message.setText("我是你", "utf-8", "html");// 设置邮件正文
四、发送附件
public static void main(String[] args) {
try {
Session session = JavaMainUtils.createSession();
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress("@163.com"));
message.setRecipient(RecipientType.TO, new InternetAddress("@qq.com"));
message.setRecipients(RecipientType.CC, new InternetAddress[] { new InternetAddress("@qq.com"),
new InternetAddress("@qq.com") }); // 设置抄送
message.setSubject("hi");
// 邮件正文设置包含html标签
// message.setText("我是你<b>爷</b>", "utf-8", "html");
// 正文
BodyPart textPart = new MimeBodyPart();
textPart.setContent("我是<b>你<b>", "text/html;charset=utf-8");
// 附件
BodyPart filePart = new MimeBodyPart();
filePart.setFileName("我是你");// 附件文件名称
// 上传附件
filePart.setDataHandler(new DataHandler(new ByteArrayDataSource(
Files.readAllBytes(Paths.get("D:\\java\\ddc.jpg")), "application/octet-stream")));
// 将正文和附件组装为Multipart对象
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(textPart);
multipart.addBodyPart(filePart);
// 将Multipart对象加入message
message.setContent(multipart);
Transport.send(message);
} catch (MessagingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
一个 Multipart 对象可以添加若干个 BodyPart ,其中第一个BodyPart 是文本,即邮件正文,后面的BodyPart是附件。BodyPart依靠setContent() 决定添加的内容,如果添加文本,用 setContent("...", "t ext/plain;charset=utf-8") 添加纯文本,或者用setContent("...", "text/html;charset=utf-8") 添加 HTML 文本。如果添加附件,需要设置文 件名(不一定和真实文件名一致),并且添加一个 DataHandler() ,传入文件的MIME 类型。二进制文件可以用 application/octet-stream ,Word文档则是 application/msword 。最后,通过setContent() 把 Multipart 添加到 Message 中,即可发送。
RecipientType.CC的含义是可以进行抄送,将一封邮件同时发送给多个邮箱
五、发送内嵌图片的HTML邮件
public static void main(String[] args) {
try {
Session session = JavaMainUtils.createSession();
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress("@163.com"));
message.setRecipient(RecipientType.TO, new InternetAddress("@qq.com"));
message.setRecipients(RecipientType.CC, new InternetAddress[] { new InternetAddress("@qq.com"),
new InternetAddress("@qq.com") }); // 设置抄送
message.setSubject("hi");
BodyPart textPart = new MimeBodyPart();
StringBuilder content = new StringBuilder();
content.append("<h1>我是你</h1>");
content.append("<h2>yes</h2>");
content.append("<img src=\"cid:ddc\"/>");
textPart.setContent(content.toString(), "text/html;charset=utf-8");
BodyPart imagePart = new MimeBodyPart();
imagePart.setDataHandler(new DataHandler(new ByteArrayDataSource(
Files.readAllBytes(Paths.get("D:\\java\\fpf.jpg")), "application/octet-stream")));
imagePart.setHeader("Content-ID", "ddc");
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(textPart);
multipart.addBodyPart(imagePart);
message.setContent(multipart);
Transport.send(message);
} catch (MessagingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
设置当前image为内嵌图片
这个ID和HTML中引用的ID对应起来,邮件客户端就可以正常显示内嵌图片
imagePart.setHeader("Content-ID", "ddc");
content.append("<img src=\"cid:ddc\"/>");