邮件传输协议
SMTP协议:
- 发送邮件:
我们通常把处理用户smtp请求(邮件发送请求)的服务器称之为SMTP服务器(邮件发送服务器)。
POP3协议:
- 接受邮件:
我们通常把处理用户pop3请求(邮件接收请求)的服务器称之为POP3服务器(邮件接收服务器)。
邮件收发的原理
- 第1步:
用户一通过STMP协议连接STMP服务器,然后发一封邮件给QQ邮件服务器 - 第2步:
QQ分析发现还需要去QQ的邮件服务器,通过smtp协议将邮件转投给QQ的SMTP服务器 - 第3步:
QQ将接收到的邮件存储在 211516844@qq.com这个邮件账号的空间中 - 第4步:
用户二通过POP3协议连接POP3服务器收取邮件 - 第5步:
POP3邮件服务器从用户二的邮箱空间里拿取第3步保存到的邮件 - 第6步:
POP3服务器将拿到的邮件返回给用户二
需要注意的地方
可能你把邮件发出去了,但是收件人的收件箱里没有收到邮件(误认为你发的邮件是广告等类型的垃圾邮件),这时不妨去垃圾箱找找,可能会转角遇到爱(发现邮件被收在了垃圾箱里)
Java发送邮件
发送邮件前的准备
首先你应该准备 JavaMail API 和Java Activation Framework(即引入两个jar包:mail.jar、activation.jar)
自己建一个lib文件夹,将两个jar包放进去
接着将lib目录添加到项目输出目录中
发送邮件的三大步骤
- 1.创建包含邮件服务器的网络连接信息的Session对象。
- 2.创建代表邮件内容的Message对象
- 3.创建Transport对象,连接服务器,发送Message,关闭连接
邮件发送主要有四个类,记住这四个类,就很容易写出邮件处理程序
发送纯文本邮件
- 如果给QQ邮箱发送邮件,则需获取相应的权限
QQ邮箱–>邮箱设置–>账户安全
- 使用JavaMail发送邮件的5个步骤:
1.开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
2.通过session得到transport对象
3.使用邮箱的用户名和授权码连上邮件服务器
4.邮件对象:创建邮件对象–>指明邮件的发件人–>/指明邮件的收件人–>设置邮件的标题–>设置邮件的文本内容
5.发送邮件
public class SendEmail {
public static void main(String[] args) throws Exception {
Properties prop = new Properties();
prop.setProperty("mail.host", "smtp.qq.com"); 设置QQ邮件服务器
prop.setProperty("mail.transport.protocol", "smtp"); // 邮件发送协议
prop.setProperty("mail.smtp.auth", "true"); // 需要验证用户名密码
// 关于QQ邮箱,还要设置SSL加密,加上以下代码即可
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
prop.put("mail.smtp.ssl.enable", "true");
prop.put("mail.smtp.ssl.socketFactory", sf);
//使用JavaMail发送邮件的5个步骤
//创建定义整个应用程序所需的环境信息的 Session 对象
Session session = Session.getDefaultInstance(prop, new Authenticator() {
public PasswordAuthentication getPasswordAuthentication() {
//发件人邮件用户名、授权码
return new PasswordAuthentication("2285815484@qq.com", "授权码");
}
});
//1、开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
session.setDebug(true);
//2、通过session得到transport对象
Transport ts = session.getTransport();
//3、使用邮箱的用户名和授权码连上邮件服务器
ts.connect("smtp.qq.com", "2285815484@qq.com", "授权码");
//4、创建邮件
//创建邮件对象
MimeMessage message = new MimeMessage(session);
//指明邮件的发件人
message.setFrom(new InternetAddress("2285815484@qq.com"));
//指明邮件的收件人
message.setRecipient(Message.RecipientType.TO, new InternetAddress("211516844@qq.com"));
//邮件的标题
message.setSubject("只包含文本的简单邮件");
//邮件的文本内容
message.setContent("大王叫我来巡山,哈哈哈!", "text/html;charset=UTF-8");
//5、发送邮件
ts.sendMessage(message, message.getAllRecipients());
ts.close();
}
}
带图片和附件的邮件
先认识两个类和一个名词:
- MIME :(多用途互联网邮件扩展类型)
- MimeBodyPart类:
javax.mail.internet.MimeBodyPart类 表示的是一个MIME消息,它和MimeMessage类一样都是从Part接口继承过来。 - MimeMultipart类:
javax.mail.internet.MimeMultipart是抽象类 Multipart的实现子类,它用来组合多个MIME消息。一个MimeMultipart对象可以包含多个代表MIME消息的MimeBodyPart对象。
发送包含图片的邮件
public class SendImageEmail {
public static void main(String[] args) throws Exception {
Properties prop = new Properties();
prop.setProperty("mail.host", "smtp.qq.com"); 设置QQ邮件服务器
prop.setProperty("mail.transport.protocol", "smtp"); // 邮件发送协议
prop.setProperty("mail.smtp.auth", "true"); // 需要验证用户名密码
// 关于QQ邮箱,还要设置SSL加密,加上以下代码即可
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
prop.put("mail.smtp.ssl.enable", "true");
prop.put("mail.smtp.ssl.socketFactory", sf);
//使用JavaMail发送邮件的5个步骤
//1、创建定义整个应用程序所需的环境信息的 Session 对象
Session session = Session.getDefaultInstance(prop, new Authenticator() {
public PasswordAuthentication getPasswordAuthentication() {
//发件人邮件用户名、授权码
return new PasswordAuthentication("2285815484@qq.com", "授权码");
}
});
//开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
session.setDebug(true);
//2、通过session得到transport对象
Transport ts = session.getTransport();
//3、使用邮箱的用户名和授权码连上邮件服务器
ts.connect("smtp.qq.com", "2285815484@qq.com", "授权码");
//4、创建邮件
//创建邮件
MimeMessage message = new MimeMessage(session);
// 设置邮件的基本信息
//发件人
message.setFrom(new InternetAddress("2285815484@qq.com"));
//收件人
message.setRecipient(Message.RecipientType.TO, new InternetAddress("211516844@qq.com"));
//邮件标题
message.setSubject("带图片的邮件");
// 准备邮件数据
// 准备图片数据
MimeBodyPart image = new MimeBodyPart();
DataHandler dh = new DataHandler(new FileDataSource("src/resources/bz.jpg"));
image.setDataHandler(dh);
image.setContentID("bz.jpg");
// 准备正文数据
MimeBodyPart text = new MimeBodyPart();
text.setContent("这是一封邮件正文带图片<img src='cid:bz.jpg'>的邮件", "text/html;charset=UTF-8");
// 描述数据关系
MimeMultipart mm = new MimeMultipart();
mm.addBodyPart(text);
mm.addBodyPart(image);
mm.setSubType("related");
//设置到消息中,保存修改
message.setContent(mm);
message.saveChanges();
//5.发送邮件
ts.sendMessage(message, message.getAllRecipients());
ts.close();
}
}