一个电子邮件系统由三部分构成 用户代理(UA),邮件服务器,smtp和pop3协议。用户代理是用户和电子邮件系统的接口,往往是运行在PC中的一个程序。具有让用户撰写(编写邮件),显示(屏幕显示),处理(发送和接收邮件),通信的功能。现在我们使用javaMail.jar发送邮件。
电子邮件把邮件发送到收件人所使用的邮件服务器上,并放在收件人的信箱中,收件人方便时候通过邮件服务器对邮件读取。
SMTP:简单邮件传输协议,规定了两个相互通信的SMTP进程之间的应该如何交换信息,SMTP不使用中间的邮件服务器(不管发送方和接收方相距多远,也不管经过多少路由器,tcp连接都是建立在两个服务器之间的,如果其中的一个服务器出现故障,那么不能交给其他的邮件服务器,只能够等待一段时间是否能够建立tcp连接))
邮件读取协议:POP3和IMAP协议,这两个协议是用户代理从邮件服务器上读取邮件所使用的协议
import java.io.File;
import java.net.URL;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.activation.URLDataSource;
import javax.mail.Authenticator;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.Message.RecipientType;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
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;
public class MyAuthenticator extends Authenticator{
//用于验证邮箱的账号和密码
private String username = "135xx@qq.com";
private String password = "xxxx";
public void getConn() throws Exception {
try {
Properties prop = new Properties();
// 邮件服务器的地址
prop.put("mail.smtp.host", "com.it.cn");
// 邮件服务器的端口号
prop.put("mail.smtp.port", "25");
// 邮箱服务器所使用的协议
prop.put("mail.smtp.protocol", "smtp");
/*建立连接时候是否验证,進行验证的方式有两种
* 1、通过继承Authenticator类实现getPasswordAuthentication方法验证
* 2、也可以通过transport.connect("mail.smtp.host",username,password);
*/
prop.put("mail.smtp.auth", "true");
// 与邮箱服务器建立会话的对象session
//与邮箱建立连接的验证的方式之一
Session session = Session.getDefaultInstance(prop,new MyAuthenticator());
// Session session = Session.getInstance(prop,null);
// 邮件传输对象
Transport transport = session.getTransport();
//与邮箱建立连接的验证的方式之二
transport.connect("mail.smtp.host",username,password);
/*
* 1、邮件对象,代表一封邮件实体,Message是接口,MimeMesage是其实现类,
* 2、并将session对象作为参数传入
*/
Message msg = new MimeMessage(session);
// 设置主题
msg.setSubject("主题");
/*
* 设置文本的四种方式
* 1、 msg.setText("设置文本方式1");
* 2、msg.setContent("设置文本方式2","text/html");
* 本文采用第三種文本 设置方式,另外两种方式见下文
/*
* 每一个邮件又若干个部分构成,每一个部分称为邮件体部分----BodyPart
* 这些BodyPart被放在同一的容器中Multipart中,其中BodyPart
* 和Multipart都是接口,其实现类分别是MimeBodyPart、MimeMultipart
*/
Multipart multiPart = new MimeMultipart();
MimeBodyPart bodypart = new MimeBodyPart();
bodypart.setText("设置文本方式3");
// bodypart.setContent("设置文本方式4", "text/html");
multiPart.addBodyPart(bodypart);
/*
* 发送邮件的时候添加附件,附件可以是文本,声音,表格,图片等
* 附件数据的来源有两种,附件本身数据来源,通过url作为数据来源
* 然后交个数据处理器处理。
*/
//将附件本身作为数据的来源
BodyPart bodyPart1 = new MimeBodyPart();
File file = new File("E:\\excel\\mgexcel\\test1.xlsx");
DataSource source = new FileDataSource(file);
bodyPart1.setDataHandler(new DataHandler(source));
multiPart.addBodyPart(bodyPart1);
//将url作为附件数据的来源
URL url = new URL("");
source = new URLDataSource(url);
BodyPart bodyPart2 = new MimeBodyPart();
multiPart.addBodyPart(bodyPart2);
//将multipart容器,即邮件信息体放到邮件中
bodyPart2.setContent(multiPart);
/*添加发件人和多个收件人
* 邮箱账号由InternetAddress封装
* 多个账号使用InternetAddress.parse("aa@qq.com,bb@qq.com")
* 返回InternetAddress数组
*/
msg.setFrom();//发件人
/*
*收件人 类型有三种,RecipientType.TO,RecipientType.CC
*RecipientType.BCC
*分别对应收件人,抄送,密送
*/
msg.addRecipients(RecipientType.TO, InternetAddress.parse("aa@qq.com,bb@qq.com"));
/*邮件发送三種方式,当使用下面两种发送方式,既可以使用transport.Connect("mail.smtp.host","username","password")
* 验证也可以使用通过继承Authenticator类来通过验证
*1、transport.send(msg,msg.getAllRecipients());
*2、transport.sendMessage(msg, msg.getAllRecipients());*/
//当实现如下的发送方式,那么验证方式使用继承Authenticator类来通过验证
Transport.send(msg);
} catch (Exception e) {
// transport.
}
}
@Override
public PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username,password);
}
}