java发送邮件,不使用springboot
有时候要用到邮件,但是又不是springboot项目,那么就要用到以下方法:
首先要添加maven依赖
<dependency> <groupId>com.sun.mail</groupId> <artifactId>javax.mail</artifactId> <version>1.5.2</version> </dependency>
然后要配置一些参数,我这些参数是放在配置文件中的,然后通过读取配置文件再配置进去,也可以直接写在代码里面,
如下:
#邮件服务器
mail.smtp.host=smtp.qq.com
#发送端口
mail.smtp.port=587
#ֻ只处理SSL的连接,对于非SSL的连接不做处理
mail.smtp.socketFactory.fallback=false
#是要验证用户名和密码
mail.smtp.auth=true
#是否允许使用ssl安全套接字
mail.smtp.ssl.enable=true
#设置发送邮件的账号和密码,是发件人的数据,密码使用秘钥,该秘钥是从邮箱设置那边获取的授权码
mail.user=#######@qq.com
mail.pwd=############
#收件人的邮箱数据
resive.user=#########@qq.com
配置文件相应的工具类如下:
package send; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.util.Properties; /** * 用于处理配置文件的类,判断工程外部是否有配置文件,如果没有,则使用默认的配置文件 * @author 徐金仁 */ public class PropertityUtils extends Properties{ private String filePath = null; public PropertityUtils(String filePath){ this.filePath = filePath; readerFiles(); } public void readerFiles(){ File file = new File(filePath); InputStream is = null; if(file.exists()){ try { is = new FileInputStream(file); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } }else{ is = this.getClass().getClassLoader().getResourceAsStream(filePath); } Reader reader = new InputStreamReader(is); try { this.load(reader); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public String getValue(String key){ return this.getProperty(key); } }
接着就是进行邮件发送的配置和封装,如下:
MailUtil.java
package send; import javax.mail.*; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import java.util.Properties; /** * 邮件工具类 */ public class MailUtil { /** * 发送邮件 * @param to 给谁发 * @param text 发送内容 */ private String mail_smtp_host = ""; private String mail_smtp_port = ""; private String mail_smtp_socketFactory_fallback = ""; private String mail_smtp_auth = ""; private String mail_smtp_ssl_enable = ""; private String sender = ""; private String pwd = ""; private String reciver = ""; public MailUtil(){ //初始化数据 PropertityUtils pro = new PropertityUtils("mail.properties"); this.mail_smtp_host = pro.getValue("mail.smtp.host"); this.mail_smtp_port = pro.getValue("mail.smtp.port"); this.mail_smtp_socketFactory_fallback = pro.getValue("mail.smtp.socketFactory.fallback"); this.mail_smtp_auth = pro.getValue("mail.smtp.auth"); this.mail_smtp_ssl_enable = pro.getValue("mail.smtp.ssl.enable"); this.mail_smtp_ssl_enable = pro.getValue("mail.user"); this.pwd = pro.getValue("mail.pwd"); this.reciver = pro.getValue("resive.user"); this.sender = pro.getValue("mail.user"); } public void send_mail(String to,String text) throws MessagingException { //创建连接对象 连接到邮件服务器 Properties properties = new Properties(); //设置发送邮件的基本参数 //发送邮件服务器 properties.put("mail.smtp.host", "smtp.qq.com"); //发送端口 properties.put("mail.smtp.port", "465"); properties.put("mail.smtp.socketFactory.fallback", "false"); // 只处理SSL的连接,对于非SSL的连接不做处理 properties.put("mail.smtp.auth", "true"); //是要验证用户名和密码 properties.put("mail.smtp.ssl.enable", true); //是否允许使用ssl安全套接字 //设置发送邮件的账号和密码 Session session = Session.getInstance(properties, new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { //两个参数分别是发送邮件的账户和密码 return new PasswordAuthentication(sender, pwd); } }); //创建邮件对象 Message message = new MimeMessage(session); //设置发件人 message.setFrom(new InternetAddress(sender)); //设置收件人 message.setRecipient(Message.RecipientType.TO,new InternetAddress(to)); //设置主题 message.setSubject("验证码"); //设置邮件正文 第二个参数是邮件发送的类型 message.setContent(text,"text/html;charset=UTF-8"); //发送一封邮件 Transport.send(message); } }
测试如下:
package springboot.javaSendEmail; import javax.mail.MessagingException; import org.junit.Test; import send.MailUtil; /** * 测试类 * @author 徐金仁 * */ public class TestMain { @Test public void test1() throws MessagingException{ MailUtil mailUtil = new MailUtil(); mailUtil.send_mail("########@qq.com", "你好"); } }
二:发送带有附件和文本显示图片的邮件
package send; import javax.activation.DataHandler; import javax.activation.DataSource; 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 javax.mail.internet.MimePartDataSource; import javax.mail.internet.MimeUtility; import java.io.File; import java.io.UnsupportedEncodingException; import java.util.Properties; /** * 邮件工具类 */ public class MailUtil { /** * 发送邮件 * @param to 给谁发 * @param text 发送内容 */ private String mail_smtp_host = ""; private String mail_smtp_port = ""; private String mail_smtp_socketFactory_fallback = ""; private String mail_smtp_auth = ""; private String mail_smtp_ssl_enable = ""; private String sender = ""; private String pwd = ""; private String reciver = ""; public MailUtil(){ //初始化数据 PropertityUtils pro = new PropertityUtils("mail.properties"); this.mail_smtp_host = pro.getValue("mail.smtp.host"); this.mail_smtp_port = pro.getValue("mail.smtp.port"); this.mail_smtp_socketFactory_fallback = pro.getValue("mail.smtp.socketFactory.fallback"); this.mail_smtp_auth = pro.getValue("mail.smtp.auth"); this.mail_smtp_ssl_enable = pro.getValue("mail.smtp.ssl.enable"); this.mail_smtp_ssl_enable = pro.getValue("mail.user"); this.pwd = pro.getValue("mail.pwd"); this.reciver = pro.getValue("resive.user"); this.sender = pro.getValue("mail.user"); } /** * 发送简单邮件 * @param to * @param text * @throws MessagingException *//* public void send_mail(String to,String text) throws MessagingException { //创建连接对象 连接到邮件服务器 Properties properties = new Properties(); //设置发送邮件的基本参数 //发送邮件服务器 properties.put("mail.smtp.host", mail_smtp_host); //发送端口 properties.put("mail.smtp.port", mail_smtp_port); properties.put("mail.smtp.socketFactory.fallback", mail_smtp_socketFactory_fallback); // 只处理SSL的连接,对于非SSL的连接不做处理 properties.put("mail.smtp.auth", mail_smtp_auth); //是要验证用户名和密码 properties.put("mail.smtp.ssl.enable", mail_smtp_ssl_enable); //是否允许使用ssl安全套接字 //设置发送邮件的账号和密码 Session session = Session.getInstance(properties, new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { //两个参数分别是发送邮件的账户和密码,密码用授权码 return new PasswordAuthentication(sender, pwd); } }); //创建邮件对象 Message message = new MimeMessage(session); //设置发件人 message.setFrom(new InternetAddress(sender)); //设置收件人 message.setRecipient(Message.RecipientType.TO,new InternetAddress(to)); //设置主题 message.setSubject("验证码"); //设置邮件正文 第二个参数是邮件发送的类型 message.setContent(text,"text/html;charset=UTF-8"); //发送一封邮件 Transport.send(message); }*/ /** * 发送带有附件的邮件 * @param text 邮件的正文 * @param filePath 邮件的附件 * @param imageFile 邮件中显示的附件 */ public void send_Email_File_image(String to, String text, String imageFile , String filePath){ //创建连接对象 连接到邮件服务器 Properties properties = new Properties(); //设置发送邮件的基本参数 //发送邮件服务器 properties.put("mail.smtp.host", mail_smtp_host); //发送端口 properties.put("mail.smtp.port", mail_smtp_port); properties.put("mail.smtp.socketFactory.fallback", mail_smtp_socketFactory_fallback); // 只处理SSL的连接,对于非SSL的连接不做处理 properties.put("mail.smtp.auth", mail_smtp_auth); //是要验证用户名和密码 properties.put("mail.smtp.ssl.enable", mail_smtp_ssl_enable); //是否允许使用ssl安全套接字 //设置发送邮件的账号和密码 Session session = Session.getInstance(properties, new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { //两个参数分别是发送邮件的账户和密码,密码用授权码 return new PasswordAuthentication(sender, pwd); } }); try { //创建邮件对象 Message message = new MimeMessage(session); //设置发件人 message.setFrom(new InternetAddress(sender)); //设置收件人 message.setRecipient(Message.RecipientType.TO,new InternetAddress(to)); //设置主题 message.setSubject("验证码"); //创建消息部分 BodyPart bodyPart = new MimeBodyPart(); //消息 bodyPart.setContent(text,"text/html;charset=UTF-8"); //创建多重消息 MimeMultipart multiPart_text_image = new MimeMultipart(); //创建图片部分 MimeBodyPart image_body = new MimeBodyPart(); image_body.setDataHandler(new DataHandler(new FileDataSource(imageFile))); //处理附件(路径中文)中文的乱码问题 image_body.setFileName(MimeUtility.encodeText(imageFile)); //设置唯一的编号(在正文节点中引用该编号) image_body.setContentID("image001"); //添加到多重消息里面 multiPart_text_image.addBodyPart(image_body); //添加到多重消息里面 multiPart_text_image.addBodyPart(bodyPart); multiPart_text_image.setSubType("related"); //设置关联关系 // 将 文本+图片 的混合"节点"封装成一个普通"节点" // 最终添加到邮件的 Content 是由多个 BodyPart 组成的 Multipart, 所以我们需要的是 BodyPart, // 上面的 mailTestPic 并非 BodyPart, 所有要把 mm_text_image 封装成一个 BodyPart //所以这里要将多重消息封装成一个普通的节点 MimeBodyPart mm_text_image = new MimeBodyPart(); mm_text_image.setContent(multiPart_text_image); //创建附件部分 BodyPart file_body = new MimeBodyPart(); //设置要发送的文件的路径 DataSource source = new FileDataSource(filePath); file_body.setDataHandler(new DataHandler(source)); //处理附件(路径中文)中文的乱码问题 file_body.setFileName(MimeUtility.encodeText(filePath)); //创建最终的多重消息,即最后要发送的多重消息 MimeMultipart multiPart = new MimeMultipart(); //添加到多重消息里面 multiPart.addBodyPart(file_body); multiPart.addBodyPart(mm_text_image); multiPart.setSubType("mixed"); //处理文本和附件之间的关系 //发送完整消息 message.setContent(multiPart); Transport.send(message); } catch (MessagingException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } }
测试如下:
mailUtil.send_Email_File_image("1417734497@qq.com", "这个学期的课表<img src='cid:image001'/>","D:/image001.jpg", "D:/url.txt");
结果如下图所示: