E-Mail协议简介
- 邮件服务器,按照提供的服务类型,可以分为发送邮件的服务器我接收邮件的服务器。
- 发送邮件的服务器使用发送协议,现在常用的是SMTP协议。所以,通常发邮件的服务器也称为SMTP服务器。
- 接收邮件的服务器使用接收协议,现在常用的是POP3协议或IMAP协议,所以通常也被称为POP3或IMAP服务器。
- 目前经常见到的服务器为SMTP和POP3服务器。如大家在注册了126的邮箱之后,它的发邮件服务器为smtp.126.com:25,而收邮件服务器则为pop3.126.com:110.(冒号后面的为端口号)。
- 当然,发邮件服务器和收邮件服务器也可能是同一台主机,但端口号一定不相同。默认发邮件服务器的端口为25,收邮件的端口为110.
邮件发送的工作图
Java程序发邮件
JavaMail-API简介
- 邮件客户端的主要任务是向邮件服务器发送邮件,以及接收来自邮件服务器的邮件。
- Sun公司制定了一套API,它封装了邮件通信的各种协议。为Java开发者提供了收发电子邮件的公共接口。
技术入口:Javax.mail.Session
- Session -用于设置服务器,协议类型和密码等
表示会话,是JavaMailApi的最高层入口类。Session对像从Properties中获取信息,如IP、协议、用户名密码等。
- Javax.mail.Message类,它的一个重要子类为MimeMessage.
Message类表示电子邮件的正文部分。
一封电子邮件包含以下内容:
地址信息、标题、日期、正文。
- Java.mail.Address:收件人地址
表示邮件的地址。常用的子类为:javax.mail.internet.InternetAddress.
- Javax.mail.Transport:负责发送邮件
指定邮件发送的协议。通常为SMTP.
它的静态方法send(Message)负责发送邮件。
准备
mail.jar,activation.jar.两个jar包,找不到可以下载本例完整代码,项目中lib目录中有。
代码演示
发送纯文本邮件
@Test
public void demo1() throws Exception {
Properties p = new Properties();
p.setProperty("mail.transport.protocol", "SMTP"); //设置邮件发送协议
p.setProperty("mail.smtp.host", "smtp.163.com"); //设置邮件服务器
p.setProperty("mail.smtp.port", "25"); //设置发送邮件的端口号,默认 25
p.setProperty("mail.smtp.auth", "true"); // 登录认证为true
p.setProperty("mail.smtp.timeout","1000"); //设置超时时间
//技术入口:
Session mailSession = Session.getDefaultInstance(p, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
String username = "xxx@163.com"; //邮箱账号 xxx@163.com
String password = "xxx"; //密码
return new PasswordAuthentication( username, password );
}
});
mailSession.setDebug(true); //开启debug模式
//下面开始进行邮件信息的封装//
//1 创建邮件对象,并且设置 由 mailSession 用户进行发送邮件
Message message = new MimeMessage(mailSession);
//2 设置邮件发送者
message.setFrom( new InternetAddress("xxx@163.com") );
//3 设置邮件接收者
message.setRecipient( RecipientType.TO, new InternetAddress("xxx@qq.com"));
//4 设置邮件主题
message.setSubject("测试一下");
//5 设置邮件内容
message.setContent("Hello world! 你好!","text/html;charset=utf-8");
//发送!!!
Transport.send(message);
}
发送带附件的邮件
@Test
public void demo2() throws Exception {
Properties p = new Properties();
p.setProperty("mail.transport.protocol", "SMTP"); //设置邮件发送协议
p.setProperty("mail.smtp.host", "smtp.163.com"); //设置邮件服务器
p.setProperty("mail.smtp.port", "25"); //设置发送邮件的端口号,默认 25
p.setProperty("mail.smtp.auth", "true"); // 登录认证为true
p.setProperty("mail.smtp.timeout","1000"); //设置超时时间
//技术入口:
Session mailSession = Session.getDefaultInstance(p, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
String username = "xxx@163.com"; //邮箱账号 xxx@163.com
String password = "xxx"; //密码
return new PasswordAuthentication( username, password );
}
});
mailSession.setDebug(true); //开启debug模式
//下面开始进行邮件信息的封装//
//1 创建邮件对象,并且设置 由 mailSession 用户进行发送邮件
Message message = new MimeMessage(mailSession);
//2 设置邮件发送者
message.setFrom( new InternetAddress("xxx@163.com") );
//3 设置邮件接收者
message.setRecipient( RecipientType.TO, new InternetAddress("xxx@qq.com"));
//4 设置邮件主题
message.setSubject("福利");
///下面是开始变化的部分///
// //5 设置邮件内容
// message.setContent("Hello world! 你好!","text/html;charset=utf-8");
//第一部分
MimeBodyPart bodyPart1 = new MimeBodyPart();
bodyPart1.setContent("<h1>福利</h1>","text/html;charset=utf-8");
//第二部分
MimeBodyPart bodyPart2 = new MimeBodyPart();
bodyPart2.setDataHandler( new DataHandler( new FileDataSource("./imgs/1.jpg" ) ) );
bodyPart2.setFileName(MimeUtility.encodeText("美女1.gif"));
//第三部分
MimeBodyPart bodyPart3 = new MimeBodyPart();
bodyPart3.setDataHandler( new DataHandler( new FileDataSource("./imgs/2.jpg" ) ) );
bodyPart3.setFileName(MimeUtility.encodeText("美女2.gif"));
//按顺序加入到 Multipart 中
Multipart mp = new MimeMultipart();
mp.addBodyPart(bodyPart1);
mp.addBodyPart(bodyPart2);
mp.addBodyPart(bodyPart3);
//把mp设置为 message 的内容
message.setContent(mp); //技术入口
/
//发送!!!
Transport.send(message);
}
完整代码链接