邮件的发送在我们的日常生活中不可或缺,通常情况下我们发送邮件都是直接用网页版的官网,今天主要讲讲如何用JAVA通过编程实现Emile邮件的发送。
1. 准备工作
由于JDK没有给我们提供相应的类,所有我们需要去下载一个JavaMail相关的依赖包
javax.mail-1.6.2.jar
加入至当前项目中。
2.电子邮件的发送过程
电子邮件写好之后,发送到邮件服务器中,通过若干个邮件服务器,最终通过对方的邮件服务器,发送到对方的邮箱APP中。
其中我们需要了解网络中的邮件协议,常见的邮箱协议有POP3, SMTP, IMAP 等,我们用Java发送邮件的时候,主要需要了解SMTP协议。
SMTP协议:SMTP全称是“Simple Mail TRansfer Protocol” , 即简单邮件传输协议,它是一组用于从源地址到目的地传输邮件的规范,通过它来控制邮件的中转方式,它帮助每台计算机在发送或者中转信件时找到下一个目的地。SMTP服务器就是通过SMTP协议发送邮件服务器。
SMTP认证,简单来说就是要求必须提供用户账号和密码之后才可以登录SMTP服务器,避免了垃圾邮件的有效传播。
相关协议的端口:(我们以126邮箱的服务器为例)
服务器名称 | 服务器地址 | SSL协议端口 | SSL协议端口 |
IMAP | imap.126.com | 993 | 143 |
SMTP | smtp.126.com | 465/994 | 25 |
POP3 | pop.126.com | 995 | 110 |
3.一对一发送邮件
在了解到SMTP协议,以及成功导入相关的jar包后,接下来正式进入程序的编写过程。首先我们明确一点,我们是在用自己的126邮箱去给某一个用户发送邮件
(1)准备SMTP登录信息,单独去创建一个类,然后再主程序通过类名去中调用Session,获取Session对象。
//126邮箱的SMTP地址
// 服务器地址:
String smtp = "smtp.126.com";
//自己的登录账号
// 登录用户名:
String username = "xxxxxxx@126.com";
// 登录密码:
String password = "xxxxxxxxx";
// 连接到SMTP服务器25端口:
Properties props = new Properties();
props.put("mail.smtp.host", smtp); // SMTP主机名
props.put("mail.smtp.port", "25"); // 主机端口号
props.put("mail.smtp.auth", "true"); // 是否需要用户认证
props.put("mail.smtp.starttls.enable", "true"); // 启用TLS加密
// 获取Session实例:
Session session = Session.getInstance(props, new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
(2) 发送邮件,我们需要构造一个Message对象,调我们导入的jar中的Transport.send()方法,就可以成功发送邮件。
//用try-catch块来解决程序运行时可能会抛出的(Address,Message)异常
try {
//创建Message对象
MimeMessage message = new MimeMessage(session);
// 设置发送方地址:
message.setFrom(new InternetAddress("xxxxxxxxxx@126.com"));
// 设置接收方地址:
message.setRecipient(Message.RecipientType.TO, neInternetAddress("xxxx@qq.com"));
// 设置邮件主题:
//使用utf-8的编码格式
message.setSubject("Hello", "UTF-8");
// 设置邮件正文:
message.setText("Hi Xiaoming...", "UTF-8");
// 发送:
Transport.send(message);
} catch (AddressException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
}
(3) 如果我们需要发送附件(图片),以作者准备的类Demo01为例,Demo01类中有Session对象,所以接下来直接调用session对象。
public static void main(String[] args) throws IOException {
try {
//创建Session会话
Session session = Demo01.create();
//创建邮件对象(Message抽象类的子类对象)
MimeMessage msg = new MimeMessage(session);
msg.setFrom(new InternetAddress("h13109111703@163.com"));
msg.setRecipient(RecipientType.TO, new InternetAddress("1344204640@qq.com"));
msg.setSubject("测试","UTF-8");
//邮件内容的复合对象
Multipart multiPart = new MimeMultipart();
//正文
BodyPart textPart = new MimeBodyPart();
//参数一: 正文内容
//参数二: 内容类型,字符编码集
StringBuilder body = new StringBuilder();
//设置邮件标题,并加粗显示
body.append("<h1>TM</h1>");
// 通过StringBuilder来拼接正文和附件
body.append("<img src=\"xxxxxxxxxx.jpg\">/");
textPart.setContent(body.toString(),"text/html;charset=utf-8");
//附件
BodyPart imagePart = new MimeBodyPart();
imagePart.setFileName("jay.jpg");//设置附件文件的显示名称
//数据处理对象(读取附件文件从本地磁盘进行读取)
imagePart.setDataHandler(
new DataHandler(
new ByteArrayDataSource(
Files.readAllBytes(Paths.get("C:\\Users\\lenovo\\Pictures\\magick.jpg")),
"application/octet-stream")));
//添加至邮件内容
multiPart.addBodyPart(textPart);
multiPart.addBodyPart(imagePart);
//设置邮件内容
msg.setContent(multiPart);
//发送邮件
Transport.send(msg);
} catch (MessagingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
4.一对多发送邮件
我们也可以用Java来实现把一封邮件同时发送给多个人。只需要在发送对象的基础上,添加抄写者,抄写者可以添加多个人。
try {
//创建Session会话
Session session = Demo01.create();
//创建邮件对象(Message抽象类的子类对象)
//发送给多个人
MimeMessage msg = new MimeMessage(session);
msg.setFrom(new InternetAddress("h13109111703@163.com"));
//发送给一个人
msg.setRecipient(RecipientType.TO, new InternetAddress("xxxxx0@qq.com"));
//通过setRecipients中的抄写者。来实现同时发送给多个人
//把网络邮件地址设置成一个集合,存放多个邮箱地址
msg.setRecipients(RecipientType.CC, new InternetAddress[] {
new InternetAddress("xxxxx@qq.com"),
new InternetAddress("xxxxxxx@qq.com"),
new InternetAddress("xxxxx@qq.com"),
});
msg.setSubject("正文标题","UTF-8");
//邮件正文
BodyPart textBodyPart = new MimeBodyPart();
StringBuilder body = new StringBuilder();
body.append("<h1>TM</h1>");
body.append("<img src=\"cid:tiezi\">/");
textBodyPart.setContent(body.toString(),"text/html;charset=utf-8");
//邮件附件部分
BodyPart imageBodyPart = new MimeBodyPart();
imageBodyPart.setFileName("TMD.jpg");//附件名称
imageBodyPart.setDataHandler(new DataHandler( //读取附件内容
new ByteArrayDataSource(
Files.readAllBytes(
Paths.get("C:\\Users\\lenovo\\Pictures\\magick.jpg")),
"application/octet-stream")));
//设置内容ID
imageBodyPart.setHeader("Content-ID", "<tiezi>");
//组合正文和附件
Multipart multiPart = new MimeMultipart();
multiPart.addBodyPart(textBodyPart);//正文内容
multiPart.addBodyPart(imageBodyPart);//附件内容
msg.setContent(multiPart);
Transport.send(msg);
} catch (MessagingException | IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
5.这样我们就通过了解邮件中的SMTP协议成功完成了邮件发送。