本文共 10732 字,大约阅读时间需要 35 分钟。
我们想要实现在网络上邮件发送,就必须有专门的邮件服务器。就像是现实生活中的邮局,负责接受用户递来的邮件,并把邮件送到邮件接受者的邮箱中去。
邮件发送有一个专门的协议叫做SMTP,有了这个协议才能收发邮件。那么一般的邮件服务器地址是smtp.xxx.com,比如163邮箱是smtp.163.com,qq邮箱是smtp.qq.com。 电子邮箱的获取需要在邮件服务器上进行申请,比如QQ邮箱。注意:现在的邮箱有识别垃圾邮件的功能,如果重复发邮件,多次发送可能会导致收到的邮件直接被邮件服务器放到垃圾箱里去。
①邮件发送的两个jar包
②邮件发送四个核心类③在QQ邮箱中获取对应的权限
打开QQ邮箱找到邮箱的设置---->账户 找到服务设置,开启POP3/SMTP服务 记住这个授权码准备工作好了之后,我们下面就开始准备发送一封简单的邮件
```package com.muhan.sendMail;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 SendMail { public static void main(String[] args) throws GeneralSecurityException, MessagingException { //第一步:创建配置文件,保存并读取信息 Properties properties = new Properties(); //1.设置qq邮件服务器 properties.setProperty("mail.host","semp.qq.com"); //2.设置发送协议 properties.setProperty("mail.transport.protocol","smtp"); //3.设置用户是否需要验证 properties.setProperty("mail.stmpt.auth","true"); //第二步:设置QQ邮箱SSL加密 //因为我们使用的是QQ邮箱,还要设置SSL加密,加上以下几行代码即可(别的邮箱不需要) MailSSLSocketFactory sf = new MailSSLSocketFactory(); sf.setTrustAllHosts(true); properties.put("mail.smtp.ssl.enable", "true"); properties.put("mail.smtp.ssl.socketFactory", sf); System.out.println("=============准备工作完成==============="); //第三步:正式开始准备发送邮件 //1.创建Session会话对象 Session session = Session.getDefaultInstance(properties, new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { //实现方法,传入发件方的邮箱地址和权限校验码 return new PasswordAuthentication("462447812@qq.com","bxxovtwbczspbhcg"); } }); //2.开启Sessin的debug模式,这样就可以在控制台查看程序Email发送的状态了 session.setDebug(true); //3.获取连接对象,通过session对象获取transport对象 Transport transport = session.getTransport(); //4.连接服务器,需要传入邮件服务器,发件方的账号和权限校验码 transport.connect("smtp.qq.com","462447812@qq.com","euwawaosjlnobhcg"); //5.发送邮件(这里为了理清楚逻辑,抽取一个方法调用) sendText(session,transport); //6.最后关闭连接 transport.close(); } //发送邮件 private static void sendText(Session session, Transport transport) throws MessagingException { //1.创建邮件对象,传入session MimeMessage mimeMessage = new MimeMessage(session); //2.设置邮件发送人 mimeMessage.setFrom(new InternetAddress("462447812@qq.com")); //3.设置邮件收件人,可以设置多人,也可以设置自己给自己发(这里我就设置的是自己给自己发) mimeMessage.setRecipient(Message.RecipientType.TO,new InternetAddress("462447812@qq.com")); //4.设置邮件标题 mimeMessage.setSubject("Hello 邮件发送"); //5.设置邮件内容,为防止乱码问题这里参数2将文本类型和字符编码设置 String msg = "资料已经整理好了,请查收"; mimeMessage.setContent(msg,"text/html;charset=utf-8"); //6.发送 transport.sendMessage(mimeMessage,mimeMessage.getAllRecipients()); }}```
效果展示:
我们要想发送一封带图片的邮件,就得先知道它的原理。在邮件中资源是这样的位置:
那么在我们Java中也为我们提供了用来组合的类:MimeMultipart; javax.mail.internet.MimeMultipart是抽象类 Multipart的实现子类,它用来组合多个MIME消息。一个MimeMultipart对象可以包含多个代表MIME消息的MimeBodyPart对象。 除此之外,Java还为我们提供了一个类:MimeBodyPart javax.mail.internet.MimeBodyPart类 表示的是一个MIME消息,MIME:多用途互联网邮件扩展类型。它和MimeMessage类一样都是从Part接口继承过来。就是用来封装消息的类。package com.muhan.sendMail;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 SendImgMail { public static void main(String[] args) throws GeneralSecurityException, MessagingException { //第一步:创建配置文件,保存并读取信息 Properties properties = new Properties(); //1.设置qq邮件服务器 properties.setProperty("mail.host","semp.qq.com"); //2.设置发送协议 properties.setProperty("mail.transport.protocol","smtp"); //3.设置用户是否需要验证 properties.setProperty("mail.stmpt.auth","true"); //第二步:设置QQ邮箱SSL加密 //因为我们使用的是QQ邮箱,还要设置SSL加密,加上以下几行代码即可(别的邮箱不需要) MailSSLSocketFactory sf = new MailSSLSocketFactory(); sf.setTrustAllHosts(true); properties.put("mail.smtp.ssl.enable", "true"); properties.put("mail.smtp.ssl.socketFactory", sf); System.out.println("=============准备工作完成==============="); //第三步:正式开始准备发送邮件 //1.创建Session会话对象 Session session = Session.getDefaultInstance(properties, new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { //实现方法,传入发件方的邮箱地址和权限校验码 return new PasswordAuthentication("462447812@qq.com","bxxovtwbczspbhcg"); } }); //2.开启Sessin的debug模式,这样就可以在控制台查看程序Email发送的状态了 session.setDebug(true); //3.获取连接对象,通过session对象获取transport对象 Transport transport = session.getTransport(); //4.连接服务器,需要传入邮件服务器,发件方的账号和权限校验码 transport.connect("smtp.qq.com","462447812@qq.com","bxxovtwbczspbhcg"); //5.发送邮件 sendImgMail(session, transport); //6.关闭连接 transport.close(); } private static void sendImgMail(Session session, Transport transport) throws MessagingException { //第一步:创建邮件 //1创建邮件消息对象 MimeMessage message = new MimeMessage(session); //2设置邮件的基本信息 message.setFrom(new InternetAddress("462447812@qq.com"));//发件人 message.setRecipient(Message.RecipientType.TO,new InternetAddress("462447812@qq.com"));//收件人 message.setSubject("图片邮件,请查收");//邮件主题 //3准备邮件数据 //3-1准备图片数据 MimeBodyPart imgBody = new MimeBodyPart(); //把图片封装成流,参数是本地图片的路径 DataHandler dataHandler = new DataHandler(new FileDataSource("E:/IdeaProjects/JavaWeb邮件发送/src/resources/1.jpg")); imgBody.setDataHandler(dataHandler); imgBody.setContentID("1.jpg");//设置图片CID //3-2准备正文数据 MimeBodyPart txtBody = new MimeBodyPart(); //设置正文内容,并将图片利用html嵌入,参数二为文本类型和字符编码 txtBody.setContent("这是一封附带图片的邮件,图片:","text/html;charset=UTF-8"); //4描述数据关系,将图片和文本组合 MimeMultipart mimeMultipart= new MimeMultipart(); mimeMultipart.addBodyPart(imgBody); mimeMultipart.addBodyPart(txtBody); mimeMultipart.setSubType("related");//设置邮件类型为嵌入式 //5.5将邮件数据设置到邮件消息对象中,并保存修改 message.setContent(mimeMultipart); message.saveChanges();//保存修改 //6.发送邮件 transport.sendMessage(message,message.getAllRecipients()); }}
效果展示:
原理和带图片的邮件发送一样,也是将每一部分封装再组合成一个整体。然后发送
package com.muhan.mail;import com.sun.mail.util.MailSSLSocketFactory;import javax.activation.DataHandler;import javax.activation.FileDataSource;import javax.mail.*;import javax.mail.internet.*;import java.io.UnsupportedEncodingException;import java.nio.charset.Charset;import java.security.GeneralSecurityException;import java.util.Properties;//发送文本,图片,附件复合邮件public class SendAllMail { public static void main(String[] args) throws MessagingException, GeneralSecurityException, UnsupportedEncodingException { Properties properties = new Properties(); properties.setProperty("mail.host","smtp.qq.com");//设置qq邮件服务器,如果是别的邮箱参数二改变即可 properties.setProperty("mail.transport.protocol","smtp");//设置邮件协议 properties.setProperty("mail.smtp.auth","true");//设置需要验证用户名和密码 // 关于QQ邮箱,还要设置SSL加密,加上以下代码即可,其他邮箱不用这段代码 MailSSLSocketFactory sf = new MailSSLSocketFactory(); sf.setTrustAllHosts(true); properties.put("mail.smtp.ssl.enable", "true"); properties.put("mail.smtp.ssl.socketFactory", sf); System.out.println("=========准备工作完成==========="); //开始发送邮件步骤 //1.创建Session对象 Session session = Session.getDefaultInstance(properties, new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("462447812@qq.com", "bxxovtwbczspbhcg");//邮箱用户名和密码(授权码) } }); //2.开启Session的deBug模式,这样可以查看到程序发送Email的运行状态 session.setDebug(true); //3.通过Session获得Transport对象 Transport transport = session.getTransport(); //4.使用邮箱用户名和密码(授权码)连接邮件服务器 transport.connect("smtp.qq.com","462447812@qq.com","bxxovtwbczspbhcg"); //5.准备邮件 //5.1创建邮件消息对象 MimeMessage message = new MimeMessage(session); //5.2设置邮件的基本信息 message.setFrom(new InternetAddress("462447812@qq.com"));//发件人 message.setRecipient(Message.RecipientType.TO,new InternetAddress("462447812@qq.com"));//收件人 message.setSubject("复合邮件,请查收");//邮件主题 //5.3编写邮件内容 //5.3.1图片 MimeBodyPart imgBody = new MimeBodyPart(); DataHandler dataHandler = new DataHandler(new FileDataSource( "E:/IdeaProjects/JavaWeb邮件发送/src/resources/1.jpg"));//封装图片为流 imgBody.setDataHandler(dataHandler); imgBody.setContentID("1.jpg");//设置图片CID //5.3.2文本 MimeBodyPart txtBody = new MimeBodyPart(); //设置正文内容,并将图片利用html嵌入,参数二为文本类型和字符编码 txtBody.setContent("这是一封混合邮件,","text/html;charset=UTF-8"); //5.3.3附件 MimeBodyPart fileBody = new MimeBodyPart(); fileBody.setDataHandler(new DataHandler(new FileDataSource( "E:/IdeaProjects/JavaWeb邮件发送/src/resources/我的文本文件.txt")));//封装附件为流 //fileBody.setFileName(MimeUtility.encodeText("我的文本文件.txt")); //这里是将附件的名称做处理,防止乱码 String str = new String("我的文本文件.txt".getBytes("UTF-8"),"ISO-8859-1"); fileBody.setFileName(str); //5.4将三部分拼装 MimeMultipart allFile = new MimeMultipart(); allFile.addBodyPart(imgBody); allFile.addBodyPart(txtBody); allFile.addBodyPart(fileBody); allFile.setSubType("mixed");//设置邮件类型为带附件的混合类型 //6.将整体放入message中,并保存修改 message.setContent(allFile); message.saveChanges();//保存修改 //7.发送邮件 transport.sendMessage(message,message.getAllRecipients()); //8.关闭连接 transport.close(); }}
效果显示:
转载地址:http://foiwi.baihongyu.com/