JAVA代码实现邮件传输
用代码完成邮件的发送在实际项目中应用的非常广泛,比如注册需要发送邮件进行账号激活等。
既然是发送邮件,请保持网络通畅
传输协议:
- SMTP服务器(用于发送邮件):用于处理用户smtp请求(邮件发送请求)。SMTP服务器地址:一般是 smtp.xxx.com,qq邮箱是smtp.qq.com。
- POP3服务器(用于接收邮件):用于处理用户pop3请求(邮件接收请求)。
开启QQ邮箱的POP3/SMTP服务
-
打开邮箱,登录;
-
打开QQ邮箱设置,进入账户标签;
-
找到‘POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务’一栏,点击‘开启服务’中的‘POP3/SMTP服务’的‘开启’按钮;
-
进行QQ的安全验证,并记录保存16位授权码。
关于QQ邮箱,有SSL加密,具体代码见下文
Java代码实现发送邮件需要的jar包
导包很重要,不仅要在java项目中建立关联的礼拜目录,还要对web项目做对应的jar包关联
使用Java发送E-mail首先你应该准备JavaMail API和Java Activation Framework 。也就是两个jar包:mail.jar和activation.jar。
为方便Java码农在代码中实现邮件发送和接收功能,sun公司提供的一套标准开发包:JavaMail,它支持一些常用的邮件协议,如SMTP,POP3。在使用JavaMail API编写邮件时,无须考虑邮件的底层实现细节,只要调用JavaMail 开发包中相应的API类就可以了。
发送邮件的步骤
-
创建定义整个应用程序所需的环境信息的Session对象;
-
创建transport对象,用于连接发送服务器(一般情况下,通过session得到transport对象);
-
通过transport对象的transport.connect(“smtp.qq.com”, "792228573@qq.com", “授权码”);方法,用邮箱的用户名和授权码连上邮件服务器;
-
创建邮件对象message,message代表邮件内容;
-
指明邮件的发件人、收件人,即收、发件人的邮箱地址;
-
用message对象的setSubject方法定义邮件的标题,用message对象的setContent方法定义邮件的文本内容;注意方法中的参数
-
用transport对象的sendMessage方法传入正确参数来对邮件进行发送;
-
调用transport对象的close方法关闭服务器连接。
具体代码如下:
package com.david.mail; import javax.mail.*; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import java.util.Properties; public class SendMail { public static void main(String[] args) throws MessagingException { //准备工作 Properties properties = new Properties(); properties.setProperty("mail.host","smtp.qq.com"); properties.setProperty("mail.transport.protocol","smtp"); properties.setProperty("mail.smtp.auth","ture"); //创建session对象 Session session = Session.getDefaultInstance(properties, new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("792228573@qq.com", "****************"); } }); textMail(session); } public static MimeMessage textMail(Session session) throws MessagingException { //可以通过debug模式来查看所有过程 session.setDebug(true); //创建transport对象 Transport tp = session.getTransport(); tp.connect("smtp.qq.com","792228573@qq.com","****************"); //创建邮件mimeMessage对象 MimeMessage mimeMessage = new MimeMessage(session); //发件人地址 mimeMessage.setFrom(new InternetAddress("792228573@qq.com")); //收件人地址(为不打搅到别人此处发送给我自己,地址相同就是发给自己) mimeMessage.setRecipient(Message.RecipientType.TO,new InternetAddress("624794851@qq.com")); //邮件主题 mimeMessage.setSubject("David.li:一个帅气的java程序猿"); //邮件内容 mimeMessage.setContent("这次只常识发送纯文本邮件,测试请经过别人同意,勿打扰到别人","text/html;charset=utf-8"); //发送邮件 tp.sendMessage(mimeMessage,mimeMessage.getAllRecipients()); //关闭transport对象所建立的与服务器的链接 tp.close(); return mimeMessage; } }
Javaweb发送邮件
很多的网站都提供有用户注册功能, 通常我们注册成功之后就会收到一封来自注册网站的邮件,这就是我们下面要做的事情,我们用代码来实现。
配置Tomcat,将之前提到的jar包导入web项目
-
编写用户实体类:(就是私有化变量,提供get/set方法,使得用户不能改动私有的代码,代码更安全)
package com.li.pojo; public class User { private String username; private String password; private String email; public User() { } public User(String username, String password, String email) { this.username = username; this.password = password; this.email = email; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } @Override public String toString() { return "User{" + "username='" + username + '\'' + ", password='" + password + '\'' + ", email='" + email + '\'' + '}'; } }
-
前段注册页面:(form表单用于提交信息)
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>注册</title> </head> <body> <form action="${pageContext.request.contextPath}/re" method="post"> 用户名:<input type="text" name="username"><br/> 密码:<input type="password" name="password"><br/> 邮箱:<input type="text" name="email"><br/> <input type="submit" value="注册"> </form> </body> </html>
-
邮件发送工具类:
package com.li.utils; import com.li.pojo.User; import javax.mail.*; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import java.util.Properties; public class SendMail extends Thread{ private String form="792228573@qq.com"; private String username="792228573@qq.com"; private String password="****************"; private String host = "smtp.qq.com"; private User user; public SendMail(User user){ this.user = user; } @Override public void run() { try { Properties prop = new Properties(); prop.setProperty("mail.host", host); prop.setProperty("mail.transport.protocol", "smtp"); prop.setProperty("mail.smtp.auth", "true"); Session session = Session.getDefaultInstance(prop, new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(username, password); } }); session.setDebug(true); Transport transport = session.getTransport(); transport.connect(host,username,password); Message message = new MimeMessage(session); message.setFrom(new InternetAddress(form)); message.setRecipient(Message.RecipientType.TO,new InternetAddress(user.getEmail())); message.setSubject("注册信息"); String info="注册成功,用户名为:"+user.getUsername()+"密码是:"+user.getPassword()+"请妥善保管您的信息,如有问题,我们一概不管"; message.setContent(info,"text/html;charset=UTF-8"); message.saveChanges(); transport.sendMessage(message,message.getAllRecipients()); transport.close(); } catch (Exception e) { throw new RuntimeException(e); } } }
-
编写对应的servlet类:(关联前段和后端)
package com.li.servlet; import com.li.pojo.User; import com.li.utils.SendMail; import java.io.IOException; public class RegisterServlet extends javax.servlet.http.HttpServlet { protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException { doGet(request,response); } protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException { try { String username = request.getParameter("username"); String password = request.getParameter("password"); String email = request.getParameter("email"); //User user = new User(); SendMail send = new SendMail(new User(username, password, email)); send.start(); request.setAttribute("message","注册成功,我们已经发了一封带了注册信息的电子邮件,请查收,收到别瞎嘚瑟,有密码,自己看就完了!如网络不稳定,可能过会儿才能收到,别瞎催"); request.getRequestDispatcher("info.jsp").forward(request,response); } catch (Exception e){ request.setAttribute("message","注册失败"); request.getRequestDispatcher("info.jsp").forward(request,response); } } }
-
配置web.xml:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <servlet> <servlet-name>register</servlet-name> <servlet-class>com.li.servlet.RegisterServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>register</servlet-name> <url-pattern>/re</url-pattern> </servlet-mapping> </web-app>
-
编写发送成功的警告反馈页面:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>警告</title> </head> <body> ${message} </body> </html>
-
运行Tomcat测试
带图片和福建的复杂邮件发送
现实生活中一定会在发邮件的过程中遇到文字和图片或附件一起发送的情况,所以一下简单介绍一下代码实现这种情况。
MIME:多用途互联网邮件扩展类型。
实现带图片和福建的复杂邮件发送,需要认识两个类:MimeMultipart类(javax.mail.internet.MimeMultipart是抽象类 Multipart的实现子类,它用来组合多个MIME消息。一个MimeMultipart对象可以包含多个代表MIME消息的MimeBodyPart对象。)和MimeBodyPart类(javax.mail.internet.MimeBodyPart类:表示的是一个MIME消息,它和MimeMessage类一样都是从Part接口继承过来)。
package com.david.mail;
import com.sun.mail.util.MailSSLSocketFactory;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.*;
import java.util.Properties;
public class SendFileEmail {
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("792228573@qq.com", "****************");
}
});
session.setDebug(true);
//2、通过session得到transport对象
Transport ts = session.getTransport();
//3、使用邮箱的用户名和授权码连上邮件服务器
ts.connect("smtp.qq.com", "792228573@qq.com", "****************");
//4、创建邮件
//创建邮件
MimeMessage message = new MimeMessage(session);
//设置邮件的基本信息
message.setFrom(new InternetAddress("792228573@qq.com"));
message.setRecipient(Message.RecipientType.TO, new InternetAddress("792228573@qq.com"));
message.setSubject("带附件和带图片的的邮件");
//图片
MimeBodyPart image = new MimeBodyPart();
image.setDataHandler(new DataHandler(new FileDataSource("src/resources/bz.jpg")));
image.setContentID("bz.jpg");
//正文
MimeBodyPart text = new MimeBodyPart();
text.setContent("哇呀呀<br/><img src='cid:bz.jpg'>","text/html;charset=UTF-8");
//附件1
MimeBodyPart attach = new MimeBodyPart();
attach.setDataHandler(new DataHandler(new FileDataSource("src/resources/1.txt")));
attach.setFileName("1.txt");
//附件2
MimeBodyPart attach2 = new MimeBodyPart();
DataHandler dh2 = new DataHandler(new FileDataSource("src/resources/2.properties"));
attach2.setDataHandler(dh2);
attach2.setFileName("2.properties");
//描述关系:正文和图片
MimeMultipart mp1 = new MimeMultipart();
mp1.addBodyPart(text);
mp1.addBodyPart(image);
mp1.setSubType("related");
//描述关系:正文和附件
MimeMultipart mp2 = new MimeMultipart();
mp2.addBodyPart(attach);
mp2.addBodyPart(attach2);
//代表正文的bodypart
MimeBodyPart content = new MimeBodyPart();
content.setContent(mp1);
mp2.addBodyPart(content);
mp2.setSubType("mixed");
message.setContent(mp2);
message.saveChanges();
//5.发送邮件
ts.sendMessage(message, message.getAllRecipients());
ts.close();
}
}