邮件发送
1、电子邮件
要实现网络上的邮件传输,就必须要有专门的邮件服务器。
- 邮件服务器,类似于生活中的邮局,负责接收用户传输过来的邮件,并且把邮件传输到接受者的邮箱中
SMTP 服务器地址 :一般都是 smtp.xxx.com,例如 QQ邮箱: smtp.qq.com
电子邮箱(E-mail 地址)的获得需要在邮件服务器上进行申请。例如要是用 QQ 邮箱,就要开通邮箱功能
2、传输协议
2.1 SMTP 协议(发送)
发送邮件:
- 通常处理用户 smtp 请求(邮件发送请求)的服务器称之为 SMTP 服务器(邮件发送服务器)
2.2 POP3 协议(接收)
接收邮件:
- 通常处理用户 pop3 请求(邮件接收请求)的服务器称之为 POP3 服务器(邮件接收服务器)
3、发送原理
邮件发送服务器:
协议:
- 张三通过 smtp 协议连接到 Smtp 服务器,然后发送一封邮件给 网易 的邮件服务器
- 网易 分析发现需要去 QQ 邮件服务器通过 smtp 协议将邮件转投给 QQ 的 Smtp服务器
- QQ 将接收到的邮件存储在 张三 的邮件账号的空间中
- 李四通过 Pop3协议连接到 pop3 服务器接收邮件
- 从 张三 的邮件账号空间中取出邮件
- pop3 服务器将取出来的邮件发送到 李四 那
注意:
- 有时候你写的收件地址和发件地址等信息都是正确,控制台也打印了正确的信息,但对方的收件箱就是收不到信息
- 这可能是收件箱服务器拒收了你发出的邮件(例如:认为你的邮件有毒,或者是广告)
- 这时候可能在垃圾箱中找到,也有一定几率找不到
- 所以重复邮件不要多次发送,或者更换收件箱
4、使用 Java 发送
4.1 需要的 jar 包依赖
使用 Java 发送 E-mail,需要准备 JavaMail API 和 Java Activation Framework
需要两个 jar 包:
- mail.jar
- activation.jar
4.2 纯文本邮件
-
导包
-
简单邮件传输实现
- 准备参数
- 获取 Session 对象
- 获取传输对象
- 登录授权(授权码)
- 编写邮件(邮件对象,发件人,收件人,标题,内容。。。)
- 发送邮件
- 关闭服务器资源
package com.aze; import com.sun.mail.util.MailSSLSocketFactory; import javax.mail.*; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import java.util.Properties; //发送一封简单的邮件 public class simpleMail { 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 对象 //使用QQ邮箱的时候才需要,其他邮箱不需要这一段代码 Session session = Session.getDefaultInstance(prop, new Authenticator() { //获取和SMTP服务器的连接对象 public PasswordAuthentication getPasswordAuthentication() { //发件人邮件用户名、授权码 return new PasswordAuthentication("XXXX@qq.com", "授权码"); } }); //开启Session的debug模式,这样就可以查看到程序发送Email的运行状态 session.setDebug(true); //2、通过session得到transport对象 Transport ts = session.getTransport();//通过这一次和SMTP服务器的连接对象获取发送邮件的传输对象 //3、使用邮箱的用户名和授权码连上SMTP邮件服务器,即登陆 ts.connect("smtp.qq.com", "XXXX@qq.com", "授权码"); //4、创建邮件对象MimeMessage——点击网页上的写信 //创建一个邮件对象 MimeMessage message = new MimeMessage(session); //指明邮件的发件人——在网页上填写发件人 message.setFrom(new InternetAddress("XXXX@qq.com"));//设置发件人 //指明邮件的收件人,现在发件人和收件人是一样的,那就是自己给自己发——在网页上填写收件人 message.setRecipient(Message.RecipientType.TO, new InternetAddress("XXXX@qq.com"));//设置收件人 //邮件的标题——在网页上填写邮件标题 message.setSubject("简单邮件发送实现");//设置邮件主题 //邮件的文本内容——在网页上填写邮件内容 message.setContent("<h2 style='color:red'>你好啊!</h2>", "text/html;charset=UTF-8");//设置邮件的具体内容 //5、发送邮件——在网页上点击发送按钮 ts.sendMessage(message, message.getAllRecipients()); //6、关闭连接对象,即关闭服务器上的连接资源 ts.close(); } }
4.3 带图片的邮件
package com.aze;
import com.sun.mail.util.MailSSLSocketFactory;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import java.security.GeneralSecurityException;
import java.util.Properties