邮件协议概述:(跟Http协议一样,邮件也是有传输协议的)
SMTP(Simple Mail Transfer Protocol):简单邮件传输协议 发送邮件协议
POP3(Post Office Protocol Version 3):邮局协议第三版 收邮件协议
IMAP(Internet Message Access Protocol):因特网访问协议 收发邮件协议
邮件服务器名称:
smtp服务器的端口号为25,服务器名称为smtp.xxx.xxx
pop3服务器的端口号为110,服务器名称为pop3.xxx.xxx
如:163邮箱:smtp.163.com pop3.163.com
qq邮箱: smtp.qq.com pop3.qq.com
JavaMail概述
JavaMail是sun公司提供的针对邮件的API,主要jar包:mail.jar、activation.jar
JavaaMail中主要的类:
javax.mail.Session:表示会话,也就是客户端与邮件服务器之间的会话。获取会话需要提供账户和密码以及服务器名称,在邮件服务的Session对象,相当于jdbc连接数据库中的Connection对象。
javax.mail.internet.MimeMessage:表示邮件类。是Message的子类,包含邮件的主题、内容、收件人地址、发件人地址,可以设置抄送和暗送,也可以设置邮件附件。
javax.mail.Transport:用来发送邮件,可以理解为邮件发送器。
实现发送邮件主要步骤:第一步首先获取Session(得到Session,需要使用Session.getInstance(Properties,Authenticator)),第二步创建MimeMessage对象(表示一个邮件对象,可以调用它的setFrom方法,设置发件人,设置收件人。。。),第三步发送邮件(Transport.send(msg);)。
邮箱需要开通POP3/SMTP服务(如QQ邮箱在帐户设置中开通)
发送一封没有带附件的邮件 代码如下
//发件人的smtp服务地址,这里使用的是qq邮箱smtp服务器地址,如果是其他邮箱的,填写对应的服务器地址
private static String sendSmtpHost="smtp.qq.com";
private static String toEmailAdd="[email protected]";//收件人邮箱
@Test
public void test() throws AddressException, MessagingException {
//得到Session
Properties prop = new Properties();
prop.setProperty("mail.transport.protocol", "smtp");
prop.setProperty("mail.smtp.host",sendSmtpHost);
prop.setProperty("mail.smtp.auth","true");
Authenticator auth = new Authenticator() {
//创建验证器
@Override
protected PasswordAuthentication getPasswordAuthentication() {
// 验证密码 第一个参数是账号后面不带 第二个为邮箱开通的stmp服务后得到的客户端授权码
return new PasswordAuthentication("[email protected]", "kgckwqgoslxfcbad");
}
};
//创建一个客户端与邮箱服务器会话对象
Session session = Session.getInstance(prop,auth);
//创建MimeMessage
MimeMessage msg= new MimeMessage(session);
//设置发件人
msg.setFrom(new InternetAddress("[email protected]"));
msg.setRecipients(RecipientType.TO, toEmailAdd); //设置收件人
//msg.setRecipients(RecipientType.CC, "33035288@qq.com"); //设置抄送
//msg.setRecipients(RecipientType.BCC, "522639332@qq.com");//设置暗送
msg.setSubject("sunflower");
msg.setContent("无人能阻挡我们去寻找属于自己的光芒。", "text/html;charset=utf-8");
Transport.send(msg); //发送邮件
}
效果
发送带附件的邮件,代码如下
//发送带附件的邮件
@Test
public void test1() throws Exception {
// 得到Session
Properties prop = new Properties();
prop.setProperty("mail.transport.protocol", "smtp");
prop.setProperty("mail.smtp.host", sendSmtpHost);
prop.setProperty("mail.smtp.auth", "true");
Authenticator auth = new Authenticator() {
// 创建验证器
@Override
protected PasswordAuthentication getPasswordAuthentication() {
// 验证密码 第一个参数是账号后面不带 第二个为邮箱开通的stmp服务后得到的客户端授权码
return new PasswordAuthentication("[email protected]", "kgckwqgoslxfcbad");
}
};
// 创建一个客户端与邮箱服务器会话对象
Session session = Session.getInstance(prop, auth);
MimeMessage msg = new MimeMessage(session); // 创建MimeMessage
msg.setFrom(new InternetAddress("[email protected]")); // 设置发件人
msg.setRecipients(RecipientType.TO, toEmailAdd); // 设置收件人
msg.setSubject("sunflower");
/*发送包含附件的邮件时,邮件体为多部件的形式
* 创建一个多部件的部件内容(MimeMultipart),用来装载多个主体部件
* 发送包含附件的邮件需要创建两个主体部件(MimeBodyPart),一个是文本,一个是附件
*把MimeMultipart设置给MimeMessage的内容
**/
MimeMultipart mime = new MimeMultipart();//创建多部分主体
MimeBodyPart part = new MimeBodyPart(); //创建MimeBodyPart
part.setContent("","text/html;charset=utf-8");//设置主体部件的内容
mime.addBodyPart(part);//把主体部件添加到MimeMultipart里去
//创建MimeBodyPart
MimeBodyPart part1 = new MimeBodyPart();
part1.attachFile(new File("D:/向日葵.jpg"));
//设置文件名称,MimeUtility.encodeText方法是解决中文乱码问题
part1.setFileName(MimeUtility.encodeText("向日葵.jpg"));
mime.addBodyPart(part1);
msg.setContent(mime);//把它设置为邮件的内容
Transport.send(msg);// 发送邮件
}
Javamail常见异常总结:
抛异常的话,先检查下的你的邮箱名和授权是否正确,是否开通了邮箱服务。
发件人和发送对象不一致会触发下面异常,需要保持一致。我这里是授权码打错导致的。
发件人和发送邮箱的对象使用的邮箱不一致会触发以下异常,需要保持一致
导入的包没有包含sun的实现,需要重新导入javax.mail包。