JavaMail学习

版权声明:本文为setlilei原创文章 转载请注明来源 https://blog.csdn.net/setlilei/article/details/85021729

不发送二进制文件 使用RFC882文档规定的邮件格式即可
jar包地址(二选一)

https://javaee.github.io/javamail/
<dependency>
	<groupId>com.sun.mail</groupId>
	<artifactId>javax.mail</artifactId>
	<version>1.6.2</version>
</dependency>

下载 javax.mail.jar

package com.java;

import java.util.Date;
import java.util.Properties;

import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

/*
 * @author 李磊
 * JavaMail Version 1.6.2 JDK Version 必须1.7以上
 */
public class JavaMailUtil {

	//发件人的邮箱全称和密码(设授权码的必须使用授权码)
	public static String emailAccount = "[email protected]";
	public static String emailPassword = "ysyowsrfbutkbcba";

	//发件人邮箱的 SMTP 服务器地址 smtp.xxx.com
	public static String emailSMTPHost = "smtp.qq.com";

	//收件人邮箱 真实存在邮箱
	public static String receiveMailAccount = "[email protected]";

	public static void main(String[] args) throws Exception {
		//1.创建参数配置 用于连接邮件服务器的参数配置
		Properties props = new Properties();//参数配置
		props.setProperty("mail.transport.protocol", "smtp");//使用的协议(JavaMail规范要求)
		props.setProperty("mail.smtp.host", emailSMTPHost);//发件人的邮箱的 SMTP 服务器地址
		props.setProperty("mail.smtp.auth", "true");//需要请求认证

		/*
		 * PS:某些邮箱服务器要求 SMTP 连接需要使用 SSL安全认证 (为了提高安全性 邮箱支持SSL连接 也可以自己开启)
		 * 
		 * 如无法连接邮件服务器 查看控制台打印的 log 如有类似 "连接失败 要求 SSL安全连接" 等错误
		 * 打开下面 注释的五行代码 开启 SSL安全连接
		 */

		/*
		 * SMTP服务器的端口(非 SSL连接的端口一般默认为 25 可以不添加 如果开启了 SSL 连接 //需要改为对应邮箱的 SMTP
		 * 服务器的端口 具体可查看对应邮箱服务的帮助 //QQ邮箱的SMTP(SLL)端口为465或587 其他邮箱自行去查看)
		 * final String smtpPort = "465";
		 * props.setProperty("mail.smtp.port", smtpPort);
		 * props.setProperty("mail.smtp.socketFactory.class","javax.net.ssl.SSLSocketFactory");
		 * props.setProperty("mail.smtp.socketFactory.fallback", "false");
		 * props.setProperty("mail.smtp.socketFactory.port", smtpPort);
		 */

		//2.根据配置创建会话对象 用于和邮件服务器交互
		Session session = Session.getInstance(props);
		session.setDebug(true);//设置为debug模式 可以查看详细的发送 log

		//3.创建一封邮件 用发件人邮箱给收件人邮箱发一封邮件
		MimeMessage message = createMimeMessage(session, emailAccount, receiveMailAccount);

		//4.根据Session获取邮件传输对象
		Transport transport = session.getTransport();

		/*	
		 * 5.使用邮箱账号和密码连接邮件服务器 此处认证的邮箱必须与 message中的发件人邮箱一致 否则报错
		 * PS:成败的判断关键在此 如连接服务器失败 程序会在控制台输出相应失败原因的log日志 仔细查看错误
		 * 有些邮箱服务器会返回错误码或查看错误类型的链接 根据给出的错误类型 到对应邮件服务器的帮助网站上查看具体失败原因
		 * 
		 * PS:通常连接失败的原因:
		 * 邮箱没有开启 SMTP服务
		 * 邮箱密码错误 例如某些邮箱开启了独立密码(设置授权码就必须用授权码作为密码使用)
		 * 邮箱服务器要求必须要使用 SSL安全连接
		 * 请求过于频繁或其他原因 被邮件服务器拒绝服务网易邮箱严格 换个邮箱开始SMTP使用 或者去邮箱官网查看帮助
		 */
		transport.connect(emailAccount, emailPassword);

		//6.发送邮件 发到所有的收件地址  message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人  抄送人
		//密送人
		transport.sendMessage(message, message.getAllRecipients());

		//7.关闭连接
		transport.close();
	}

	/*
	 * 创建一封只包含文本的简单邮件
	 *
	 * @param session		和服务器交互的会话
	 * @param sendMail		发件人邮箱
	 * @param receiveMail	收件人邮箱
	 * @return
	 * @throws Exception
	 */
	public static MimeMessage createMimeMessage(Session session, String sendMail, String receiveMail) throws Exception {
		//1.创建一封邮件
		MimeMessage message = new MimeMessage(session);

		/*
		 * from字段   --用于指明发件人
		 * to字段       --用于指明收件人
		 * subject字段  --用于说明邮件主题
		 * cc字段      -- 抄送 将邮件发送给收件人的同时抄送给另一个收件人 收件人可以看到邮件抄送给了谁
		 * bcc字段    -- 密送 将邮件发送给收件人的同时将邮件秘密发送给另一个收件人 收件人无法看到邮件密送给了谁
		 */
		
		//2.From:发件人的昵称
		message.setFrom(new InternetAddress(sendMail, "李磊", "UTF-8"));

		//3.To:收件人的昵称(可以增加多个收件人 抄送 密送)
		message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiveMail, "VIP-User", "UTF-8"));

		//4.Subject:邮件主题
		message.setSubject("主题就是内容", "UTF-8");

		//5.Content:邮件正文(可以使用html标签 浏览器会解析)
		message.setContent(
				"<h1>You are our outstanding user. We hope you will be happy every day and have no worries.</h1>"
				, "text/html;charset=UTF-8");
		//6.设置发件时间
		message.setSentDate(new Date());

		//7.保存设置
		message.saveChanges();

		return message;
	}

}

发送二进制文件或者携带附件 必须使用MIME协议
JavaMail创建的邮件是基于MIME协议的 因此可以使用JavaMail创建出包含图片 包含附件的复杂邮件 但要在之前的基础上多导入一个jar activation.jar

http://java.sun.com/javase/technologies/desktop/javabeans/jaf/index.jsp
<!-- https://mvnrepository.com/artifact/javax.activation/activation -->
<dependency>
    <groupId>javax.activation</groupId>
    <artifactId>activation</artifactId>
    <version>1.1.1</version>
</dependency>
MIME协议是对RFC822文档的升级和补充 它描述了如何生产一封复杂的邮件
通常把MIME协议描述的邮件称之为MIME邮件 MIME协议描述的数据称之为MIME消息
对于一封复杂邮件 如果包含了多个不同的数据 MIME协议规定了要使用分隔线对多段数据进行分隔
并使用Content-Type头字段对数据的类型 以及多个数据之间的关系进行描述
package com.java;

import java.io.FileOutputStream;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

/*
* @Description:发送Email
* @author:李磊
*
*/ 
public class JavaMailUtil {

    /*
     * @param args
     * @throws Exception 
     */
    public static void main(String[] args) throws Exception {
        
        Properties prop = new Properties();
        prop.setProperty("mail.host", "smtp.sohu.com");
        prop.setProperty("mail.transport.protocol", "smtp");
        prop.setProperty("mail.smtp.auth", "true");
        //使用JavaMail发送邮件的5个步骤
        //1 .创建session
        Session session = Session.getInstance(prop);
        //开启Session的debug模式 这样就可以查看到程序发送Email的运行状态
        session.setDebug(true);
        //2 .通过session得到transport对象
        Transport ts = session.getTransport();
        //3 .连上邮件服务器 需要发件人提供邮箱的用户名和密码进行验证
        ts.connect("smtp.sohu.com", "gacl", "邮箱密码");
        //4 .创建邮件
        Message message = createImageMail(session);
        //5 .发送邮件
        ts.sendMessage(message, message.getAllRecipients());
        ts.close();
    }
    
    /*
    * @Method:createImageMail
    * @Description:生成一封邮件正文带图片的邮件
    * @Anthor:李磊
    * @param session
    * @return
    * @throws Exception
    */ 
    public static MimeMessage createImageMail(Session session) throws Exception {
        //创建邮件
        MimeMessage message = new MimeMessage(session);
        //设置邮件的基本信息
        //发件人
        message.setFrom(new InternetAddress("[email protected]"));
        //收件人
        message.setRecipient(Message.RecipientType.TO, new InternetAddress("[email protected]"));
        //邮件标题
        message.setSubject("带图片的邮件");

        //准备邮件数据
        //准备邮件正文数据
        MimeBodyPart text = new MimeBodyPart();
        text.setContent("这是一封邮件正文带图片<img src='cid:xxx.jpg'>的邮件", "text/html;charset=UTF-8");
        //准备图片数据
        MimeBodyPart image = new MimeBodyPart();
        DataHandler dh = new DataHandler(new FileDataSource("src\\1.jpg"));
        image.setDataHandler(dh);
        image.setContentID("xxx.jpg");
        //描述数据关系
        MimeMultipart mm = new MimeMultipart();
        mm.addBodyPart(text);
        mm.addBodyPart(image);
        mm.setSubType("related");

        message.setContent(mm);
        message.saveChanges();
        //将创建好的邮件写入到E盘以文件的形式进行保存
        message.writeTo(new FileOutputStream("E:\\ImageMail.eml"));
        //返回创建好的邮件
        return message;
    }
}
package com.java;

import java.io.FileOutputStream;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

/*
* @Description:发送Email
* @author:李磊
*/ 
public class JavaMailUtil {

    /*
     * @param args
     * @throws Exception 
     */
    public static void main(String[] args) throws Exception {
        
        Properties prop = new Properties();
        prop.setProperty("mail.host", "smtp.sohu.com");
        prop.setProperty("mail.transport.protocol", "smtp");
        prop.setProperty("mail.smtp.auth", "true");
        //使用JavaMail发送邮件的5个步骤
        //1.创建session
        Session session = Session.getInstance(prop);
        //开启Session的debug模式 这样就可以查看到程序发送Email的运行状态
        session.setDebug(true);
        //2.通过session得到transport对象
        Transport ts = session.getTransport();
        //3.连上邮件服务器
        ts.connect("smtp.sohu.com", "gacl", "邮箱密码");
        //4.创建邮件
        Message message = createAttachMail(session);
        //5.发送邮件
        ts.sendMessage(message, message.getAllRecipients());
        ts.close();
    }
    
    /*
    * @Method:createAttachMail
    * @Description:创建一封带附件的邮件
    * @Anthor:李磊
    * @param session
    * @return
    * @throws Exception
    */ 
    public static MimeMessage createAttachMail(Session session) throws Exception{
        MimeMessage message = new MimeMessage(session);
        
        //设置邮件的基本信息
        //发件人
        message.setFrom(new InternetAddress("[email protected]"));
        //收件人
        message.setRecipient(Message.RecipientType.TO, new InternetAddress("[email protected]"));
        //邮件标题
        message.setSubject("JavaMail邮件发送测试");
        
        //创建邮件正文 为了避免邮件正文中文乱码问题 需要使用charset=UTF-8指明字符编码
        MimeBodyPart text = new MimeBodyPart();
        text.setContent("使用JavaMail创建的带附件的邮件", "text/html;charset=UTF-8");
        
        //创建邮件附件
        MimeBodyPart attach = new MimeBodyPart();
        DataHandler dh = new DataHandler(new FileDataSource("src\\2.jpg"));
        attach.setDataHandler(dh);
        attach.setFileName(dh.getName());  //
        
        //创建容器描述数据关系
        MimeMultipart mp = new MimeMultipart();
        mp.addBodyPart(text);
        mp.addBodyPart(attach);
        mp.setSubType("mixed");
        
        message.setContent(mp);
        message.saveChanges();
        //将创建的Email写入到E盘存储
        message.writeTo(new FileOutputStream("E:\\attachMail.eml"));
        //返回生成的邮件
        return message;
    }
}

原文 https://www.cnblogs.com/Vae1990Silence/p/4622521.html

猜你喜欢

转载自blog.csdn.net/setlilei/article/details/85021729