要在网络上实现邮件功能,必须要有专门的邮件服务器
邮件服务器类似于现实中的邮局,主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中。
1.张三通过SMTP协议连接到SMTP服务器,然后发送一封邮件给网易的邮件服务器;
2.网易分析发现需要去qq的邮件服务器,通过SMTP协议将邮件转投给qq的SMTP服务器
3.qq将接收到的邮件存储在李四的邮件账号的空间中
4.李四通过pop3协议连接到pop3服务器收取邮件
5.从李四的这个邮件账号的空间中取出邮件
6.Pop3服务器将取出来的邮件送到李四手中
注意:有可能你收件人地址,发件人地址等信息都正确了,控制台也打印了正确的信息,但是在收件箱就是收不到信息。这很可能是收件箱服务器拒收了你发的邮件(比如认为你的邮件是广告),这时可能在垃圾箱中能找到,可能找不到。解决办法是重复的邮件内容不要多次发送,或者更换收件箱
1. 给QQ邮箱发邮件
1.1 导包
使用Java发送Email需要准备JavaMail API和Java Activation Framework得到两个jar包mail.jar和activation.jar
这个包一定不要导错了,否则后续会出现QQ设置SSL加密错误
<dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4.7</version> </dependency> <dependency> <groupId>javax.activation</groupId> <artifactId>activation</artifactId> <version>1.1.1</version> </dependency>
1.2 在邮箱中配置
我们要打开QQ邮箱的设置
将第一个开启。一般都需要密保验证
将验证码自己保存下来
1.3 MailDemo01
package com.hxl; import com.sun.mail.util.MailSSLSocketFactory; import javax.mail.*; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import java.security.GeneralSecurityException; import java.util.Properties; //发送一份简单的邮件 public class MailDemo01 { 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加密 //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() { public PasswordAuthentication getPasswordAuthentication() { //发件人邮件用户名、授权码 return new PasswordAuthentication("XXXX@qq.com","授权码"); } }); //开启session的debug模式,这样可以查看到程序发送Email的运行状态 session.setDebug(true); //2.通过session得到transport对象 Transport ts=session.getTransport(); //3.使用邮箱的用户名和授权码连上邮件服务器 ts.connect("smtp.qq.com","XXXX@qq.com","授权码"); //4.创建邮件:写文件 //注意需要传递session MimeMessage message=new MimeMessage(session); //指明邮件的发件人 message.setFrom(new InternetAddress("XXXX@qq.com")); //指明邮件的收件人 message.setRecipient(Message.RecipientType.TO,new InternetAddress("XXXX@qq.com")); //邮件标题 message.setSubject("发送的标题"); //邮件的文本内容 //内容还可以添加样式等等比如说价格<h1 style='color:red'></h1> message.setContent("内容","text/html;charset=UTF-8"); //5.发送邮件 ts.sendMessage(message,message.getAllRecipients()); //6.关闭连接 ts.close(); } }
1.4 运行查看结果
没有网络,验证码不对等都会出现错误。
2. 发送复杂内容
MIME(多用途互联网邮件扩展类型)
MimeBodyPart类:javax.mail.internet.MimeBodyPart类表示的是一个MIME消息,它和MimeMessage类一样都是从Part接口继承过来的
MimeMultipart类:javax.mail.internet.MimeMultipart是抽象类Multipart的实现子类,它用来组合多个MIME消息,一个MimeMultipart对象可以包含多个代表MIME消息的MimeBodyPart对象。
2.1 图片地址
右键找到我们需要的图片地址
2.2 发送带图片的Mail
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; //携带图片的发送 public class MailDemo02 { 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加密 //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() { public PasswordAuthentication getPasswordAuthentication() { //发件人邮件用户名、授权码 return new PasswordAuthentication("xxxxx@qq.com","授权码"); } }); //开启session的debug模式,这样可以查看到程序发送Email的运行状态 session.setDebug(true); //2.通过session得到transport对象 Transport ts=session.getTransport(); //3.使用邮箱的用户名和授权码连上邮件服务器 ts.connect("smtp.qq.com","xxxxx@qq.com","授权码"); //4.创建邮件:写文件 //注意需要传递session MimeMessage message=new MimeMessage(session); //指明邮件的发件人 message.setFrom(new InternetAddress("xxxxx@qq.com")); //指明邮件的收件人 message.setRecipient(Message.RecipientType.TO,new InternetAddress("xxxxx@qq.com")); //邮件标题 message.setSubject("带着图片"); //邮件的文本内容 //=================================准备图片数据======================================= MimeBodyPart image=new MimeBodyPart(); //图片需要经过数据化的处理 DataHandler数据处理 //修改成自己的图片地址 DataHandler dh=new DataHandler(new FileDataSource("D:\\aAAAA\\util\\FunctionExtensio\\mail-java\\src\\main\\resources\\1.jpg")); //在MimeBodyPart中放入这个处理过图片的数据 image.setDataHandler(dh); //给这个图片设置一个ID名字,在后面可以使用 image.setContentID("bz.jpg"); //准备正文的数据 MimeBodyPart text=new MimeBodyPart(); //这里的cid就是 上面的setContentID 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()); //6.关闭连接 ts.close(); } }
2.3 测试结果






