Java邮件发送详解 |
您所在的位置:网站首页 › 收发邮件协议 › Java邮件发送详解 |
大家好,又见面了,我是你们的朋友全栈君。 文章目录电子邮件传输协议 SMTP协议POP3协议邮件收发原理Java发送邮件概述纯文本邮件带图片和附件的邮件JavaWeb发送邮件电子邮件要在网络上实现邮件功能,必须要有专门的邮件服务器。 这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中。 SMTP服务器地址:一般是 smtp.xxx.com,比如163邮箱是smtp.163.com,qq邮箱是smtp.qq.com。 电子邮箱(E-Mail地址)的获得需要在邮件服务器上进行申请。比如我们要使用QQ邮箱,就需要开通邮箱功能; ![]() 发送邮件: 我们通常把处理用户smtp请求(邮件发送请求)的服务器称之为SMTP服务器(邮件发送服务器)。 POP3协议接收邮件: 我们通常把处理用户pop3请求(邮件接收请求)的服务器称之为POP3服务器(邮件接收服务器)。 邮件收发原理![]() 【注意】有可能填写的收件人地址,发件人地址等信息都正确了,控制台也打印了正确的信息,但是在收件箱就是收不到信息。这是因为可能收件箱服务器拒收了你发的邮件(比如认为你的邮件是广告),这时候可能在垃圾箱里能找到,可能找不到。解决办法是重复的邮件内容不要多次发送,或者更换收件箱试试 Java发送邮件概述我们将用代码完成邮件的发送。这在实际项目中应用的非常广泛,比如注册需要发送邮件进行账号激活,再比如OA项目中利用邮件进行任务提醒等等。 使用Java发送 E-mail 十分简单,但是首先你应该准备 JavaMail API 和Java Activation Framework 。 得到两个jar包: mail.jaractivation.jarJavaMail 是sun公司(现以被甲骨文收购)为方便Java开发人员在应用程序中实现邮件发送和接收功能而提供的一套标准开发包,它支持一些常用的邮件协议,如前面所讲的SMTP,POP3,IMAP,还有MIME等。我们在使用JavaMail API 编写邮件时,无须考虑邮件的底层实现细节,只要调用JavaMail 开发包中相应的API类就可以了。 我们可以先尝试发送一封简单的邮件,首先请确保电脑可以连接网络。 创建包含邮件服务器的网络连接信息的Session对象。创建代表邮件内容的Message对象创建Transport对象,连接服务器,发送Message,关闭连接主要有四个核心类,我们在编写程序时,记住这四个核心类,就很容易编写出Java邮件处理程序,如图所示: ![]() 先在项目中导入jar包 导入的就是在概述中提到的activation,jar和mail.jar包,如图所示: ![]() QQ邮箱中获取对应的权限 QQ邮箱需要安全验证,我们需要获取他对应的权限; 进入QQ邮箱–>邮箱设置–>账户,下滑找到POP3/IMAP/SMTP/Exchange/CardDav/CalDav服务,开启POP3/SMTP服务,如图所示: ![]() ![]() 记住这16位授权码,然后开始编写测试程序: 代码语言:javascript复制import com.sun.mail.util.MailSSLSocketFactory; import java.util.*; import javax.mail.*; import javax.mail.internet.*; 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("[email protected]", "授权码"); } }); //开启Session的debug模式,这样就可以查看到程序发送Email的运行状态 session.setDebug(true); //2、通过session得到transport对象 Transport ts = session.getTransport(); //3、使用邮箱的用户名和授权码连上邮件服务器 ts.connect("smtp.qq.com", "[email protected]", "授权码"); //4、创建邮件 //创建邮件对象 MimeMessage message = new MimeMessage(session); //指明邮件的发件人 message.setFrom(new InternetAddress("[email protected]")); //指明邮件的收件人,现在发件人和收件人是一样的,那就是自己给自己发 message.setRecipient(Message.RecipientType.TO, new InternetAddress("[email protected]")); //邮件的标题 message.setSubject("只包含文本的简单邮件"); //邮件的文本内容 message.setContent("你好啊!", "text/html;"); //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对象。 ![]() 创建包含内嵌图片的邮件 前面的例子中是单独的使用HTML或者是纯文本内容,但是有时候我们需要在纯文本中使用内嵌的方式显示一些图片,因此就要将纯文本和内嵌图片单独存放在MimeBodyPart中然后再将其存放在一个Mimemultipart对象中即可。 代码如下: 代码语言:javascript复制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.util.Properties; 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("[email protected]", "授权码"); } }); //开启Session的debug模式,这样就可以查看到程序发送Email的运行状态 session.setDebug(true); //2、通过session得到transport对象 Transport ts = session.getTransport(); //3、使用邮箱的用户名和授权码连上邮件服务器 ts.connect("smtp.qq.com", "[email protected]", "授权码"); //4、创建邮件 //创建邮件 MimeMessage message = new MimeMessage(session); // 设置邮件的基本信息 //发件人 message.setFrom(new InternetAddress("[email protected]")); //收件人 message.setRecipient(Message.RecipientType.TO, new InternetAddress("[email protected]")); //邮件标题 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("这是一封邮件正文带图片![]() 带图片和附件的复杂邮件发送 代码如下: 代码语言:javascript复制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 SendFileMail { public static void main(String[] args) throws MessagingException, GeneralSecurityException { //创建一个配置文件保存并读取信息 Properties properties = new Properties(); //设置qq邮件服务器 properties.setProperty("mail.host","smtp.qq.com"); //设置发送的协议 properties.setProperty("mail.transport.protocol","smtp"); //设置用户是否需要验证 properties.setProperty("mail.smtp.auth", "true"); //=================================只有QQ存在的一个特性,需要建立一个安全的链接 // 关于QQ邮箱,还要设置SSL加密,加上以下代码即可 MailSSLSocketFactory sf = new MailSSLSocketFactory(); sf.setTrustAllHosts(true); properties.put("mail.smtp.ssl.enable", "true"); properties.put("mail.smtp.ssl.socketFactory", sf); //=================================准备工作完毕 //1.创建一个session会话对象; Session session = Session.getDefaultInstance(properties, new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("[email protected]", "授权码"); } }); //可以通过session开启Dubug模式,查看所有的过程 session.setDebug(true); //2.获取连接对象,通过session对象获得Transport,需要捕获或者抛出异常; Transport tp = session.getTransport(); //3.连接服务器,需要抛出异常; tp.connect("smtp.qq.com","[email protected]","授权码"); //4.连接上之后我们需要发送邮件; MimeMessage mimeMessage = imageMail(session); //5.发送邮件 tp.sendMessage(mimeMessage,mimeMessage.getAllRecipients()); //6.关闭连接 tp.close(); } public static MimeMessage imageMail(Session session) throws MessagingException { //消息的固定信息 MimeMessage mimeMessage = new MimeMessage(session); //邮件发送人 mimeMessage.setFrom(new InternetAddress("[email protected]")); //邮件接收人,可以同时发送给很多人,我们这里只发给自己; mimeMessage.setRecipient(Message.RecipientType.TO, new InternetAddress("[email protected]")); mimeMessage.setSubject("我也不知道是个什么东西就发给你了"); //邮件主题 /* 编写邮件内容 1.图片 2.附件 3.文本 */ //图片 MimeBodyPart body1 = new MimeBodyPart(); body1.setDataHandler(new DataHandler(new FileDataSource("src/resources/yhbxb.png"))); body1.setContentID("yhbxb.png"); //图片设置ID //文本 MimeBodyPart body2 = new MimeBodyPart(); body2.setContent("请注意,我不是广告![]() 现在很多的网站都提供有用户注册功能, 通常我们注册成功之后就会收到一封来自注册网站的邮件。邮件里面的内容可能包含了我们的注册的用户名和密码以及一个激活账户的超链接等信息。今天我们也来实现一个这样的功能,用户注册成功之后,就将用户的注册信息以Email的形式发送到用户的注册邮箱当中,实现发送邮件功能就得借助于JavaMail了。 项目实现: 新建一个JavaWeb项目,配置tomcat的参数,然后添加jar包(记得在tomcat目录下的common目录下也导包,不然会报500错误),并且添加实体类User,Servlet类RegisterServlet,工具类Sendmail,如图所示:![]() 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/146345.html原文链接:https://javaforall.cn |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |