ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

利用邮箱进行辅助注册

2020-12-19 11:33:31  阅读:292  来源: 互联网

标签:辅助 MimeMessage 发送 session 注册 邮箱 message 邮件


一、发送邮件的原理

    在了解其原理之前,先要知道两个协议,SMTP和POP3

      SMTP:Simple Mail Transfer Protocol,即简单邮件传输协议,发送邮件的协议,默认端口,25

      POP3:Post Office Protocol 3,即邮局协议,接收邮件的协议,默认端口,110

    知道了这两个协议,下面来说说邮件发送和接收的原理图,分两种,相同邮件(QQ邮箱给QQ邮箱)和不同邮件(QQ邮箱给163邮箱)是不一样的。

解释:    

          为了方便起见,将新浪邮箱,list@sina.com称为用户A,将搜狐邮箱,wangwu@sohu.com 称为用户B

        用户A(新浪邮箱,list@sina.com)给用户B(搜狐邮箱,wangwu@sohu.com)发送一封邮件,那么整个过程就为图中的实线部分,用户A通过OutLook(浏览器或者客户端)登录自己的邮箱帐号,编写邮件,使用Smtp协议发送给Sina的邮件服务器中的Smtp服务器(专门用来发送的服务器),然后在通过SMTP协议,传输给Sohu的邮件服务器中的Smtp服务器,然后通过Sohu的Smtp服务器将邮件发送给用户B的存储设备进行存储(每个用户都会有一个存储空间用来存储邮件的),到这里,用户A就相当于发送成功了,因为已经到达了目的地,如果B用户需要查看邮件内容,必须通过POP3服务器将从自己的存储设备中拿到,然后返回到浏览器或者客户端中显示。

        用户B给用户A发送一封邮件,那么整个过程就为图中的虚线部分,是和A给B发一样的步骤

        用户A给一个同样使用新浪邮箱的用户C发送一封邮件,那么其过程就简单的多了,先通过Smtp服务器,然后smtp服务器会将其发送到用户C的存储设备上,A发送邮件就成功了,用户C要显示自己邮箱中的邮件,那么就通过POP3服务器从自己存储设备中拿取所有邮件进行查看。

二、通过Java代码实现发送邮件

     2.1、准备jar包

        核心:mail.jar

        依赖:activation.jar, 邮件需要发送附件时使用

使用QQ邮箱发送邮件

2.3.1、首先在QQ邮箱中注册一个帐号。有的话就省略这一步

        2.3.2、进行三大步,创建连接、创建消息,发送消息

确定连接位置

//发送方
		String myAccount = "2928235428@qq.com";
		//授权码
		String myPass = "xtevddbazoshdfcd";
		//发件人 邮箱的 SMTP 服务器地址
		String SMTPHost = "smtp.qq.com";
		//组成 properties
		Properties prop = new Properties();
		prop.setProperty("mail.transport.protocol", "smtp");//设置协议类型
		prop.setProperty("mail.smtp.host", SMTPHost);//定义发件人的邮箱服务器地址
		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);

创建连接

//1.Session对象 创建会话 用于和邮箱服务器进行交互
		Session session = Session.getDefaultInstance(prop);
		//设置debug模式 可以查看详细发送信息 可略
		session.setDebug(true);
Transport tran = session.getTransport();
			//连接服务器 确认发送方 是否授权
			tran.connect(myAccount, myPass);

创建消息

private static MimeMessage createMsg(Session session, String myAccount, User user) {
		//使用session对象 获取待发送的邮件信息
		MimeMessage message = new MimeMessage(session);
		//3.设置发件人 收件人 标题 邮件内容 附件 发送时间等等
		try {
			//3.1发件人 from
			message.setFrom(new InternetAddress(myAccount, "小米", "utf-8"));
			//3.2收件人 to 支持可以添加多个收件人 | 抄送 | 密送 如果想要发送给多个人 可以重复下面代码多次
			/*
			 * MimeMessage.RecipientType.TO 发送
			 * MimeMessage.RecipientType.CC 抄送
			 * MimeMessage.RecipientType.BCC 密送
* 比如A要给B发邮件,但是A觉得有必要给要让C也看看其内容,就在给B发邮件时,
      *   将邮件内容抄送给C,那么C也能看到其内容了,但是B也能知道A给C抄送过该封邮件
    *    而如果是暗送(密送)给C的话,那么B就不知道A给C发送过该封邮件。比如A要给B发邮件,但是A觉得有必要给要让C也看看其内容,就在给B发邮件时,
     *   将邮件内容抄送给C,那么C也能看到其内容了,但是B也能知道A给C抄送过该封邮件
      *   而如果是暗送(密送)给C的话,那么B就不知道A给C发送过该封邮件。
			 * */
			message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(user.getEmail(), user.getUsername(), "utf-8"));
			//3.3生成邮件主题
			message.setSubject("小米商城账号激活邮件","utf-8");
			//这里如果你本地有虚拟机的话,ip会很奇怪,而且qq邮箱因为安全问题,不能用localhost
			// Inet4Address.getLocalHost().getHostAddress();
			//String ip ="127.0.0.1";
			String url = "http://127.0.0.1:8080/myshop/user?method=active&c="+Base64Utils.encode(user.getCode());
			//设置邮件正文 setContent 可以使用html标签
			message.setContent(user.getUsername()+",你好<br>欢迎注册小米商城! 请点击链接进行激活:<a href='"+url+"'>点击进行激活</a>","text/html;charset=utf-8");
			//设置邮件的发送时间 是立即发送
			message.setSentDate(new Date());
			//保存设置
			message.saveChanges();
		}  catch (MessagingException e) {
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return message;
	}
} 

发送消息

//发送邮件 将message 对象 传给 Transport 对象 将邮件发送出去
			//参数1 要发的内容 参数2 要给哪些人发
			//message.getAllRecipients() 获取到所有的收件人 | 抄送 | 密送
			tran.sendMessage(message, message.getAllRecipients());
			//关闭连接
			tran.close();

授权码的解释

         什么是授权码?这个很简单,如果你不是在qq的邮箱网址中登录的,而是在一些第三方客户端中登录邮箱帐号密码,那么就必须进行授权,来获取一个授权码,使用该授权码在第三方客户端中进行登录。而该授权码就相当于我们的密码了,帐号是不变的,也就是我们说我们在java代码中想登录邮箱,那么就必须使用授权码进行登录。如果获取授权码呢?

登录之后肯定显示的是首页,在首页中有一个设置,点击设置,在左面就会显示一系列的设置选项,点击客户端授权密码,就会显示如图中所示,让其设置客户端授权码,如果没开启的话,默认就是关闭的,然后在按照步骤点击开启,一步步设置,就能得到授权码。

登录之后肯定显示的是首页,在首页中有一个设置,点击设置,在左面就会显示一系列的设置选项,点击客户端授权密码,就会显示如图中所示,让其设置客户端授权码,如果没开启的话,默认就是关闭的,然后在按照步骤点击开启,一步步设置,就能得到授权码。

如果不使用授权码,那么java程序会报错,报错信息是验证失败,说明帐号密码不正确,此时就是密码不正确,因为这里密码应该写授权码

完整代码

/*
 * 1.首先需要获取发送邮件的Session对象
 * 	Session session = Session.getDefaultInstance(Properties prop)
 * 2.使用session对象 获取待发送的邮件信息
 *  MimeMessage mime = new MimeMessage(session)
 * 3.设置发件人 收件人 标题 邮件内容 附件 发送时间等等
 * 4.利用Transport 发送邮件
 * */
public class EmailUtils {
	public static void sendEmail(User user) throws GeneralSecurityException {
		//发送方
		String myAccount = "2928235428@qq.com";
		//授权码
		String myPass = "xtevddbazoshdfcd";
		//发件人 邮箱的 SMTP 服务器地址
		String SMTPHost = "smtp.qq.com";
		//组成 properties
		Properties prop = new Properties();
		prop.setProperty("mail.transport.protocol", "smtp");//设置协议类型
		prop.setProperty("mail.smtp.host", SMTPHost);//定义发件人的邮箱服务器地址
		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);
		//1.Session对象 创建会话 用于和邮箱服务器进行交互
		Session session = Session.getDefaultInstance(prop);
		//设置debug模式 可以查看详细发送信息 可略
		session.setDebug(true);
		
		//2.创建方法 用来组成一封完整的邮件
		//参数 session(参数配置), myAccount 发送方 , user.getEmail() 接收方
		MimeMessage message = createMsg(session,myAccount,user);
		//4.利用Transport 发送邮件
		try {
			Transport tran = session.getTransport();
			//连接服务器 确认发送方 是否授权
			tran.connect(myAccount, myPass);
			//发送邮件 将message 对象 传给 Transport 对象 将邮件发送出去
			//参数1 要发的内容 参数2 要给哪些人发
			//message.getAllRecipients() 获取到所有的收件人 | 抄送 | 密送
			tran.sendMessage(message, message.getAllRecipients());
			//关闭连接
			tran.close();
		} catch (MessagingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

	private static MimeMessage createMsg(Session session, String myAccount, User user) {
		//使用session对象 获取待发送的邮件信息
		MimeMessage message = new MimeMessage(session);
		//3.设置发件人 收件人 标题 邮件内容 附件 发送时间等等
		try {
			//3.1发件人 from
			message.setFrom(new InternetAddress(myAccount, "小米", "utf-8"));
			//3.2收件人 to 支持可以添加多个收件人 | 抄送 | 密送 如果想要发送给多个人 可以重复下面代码多次
			/*
			 * MimeMessage.RecipientType.TO 发送
			 * MimeMessage.RecipientType.CC 抄送
			 * MimeMessage.RecipientType.BCC 密送
			 * */
			message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(user.getEmail(), user.getUsername(), "utf-8"));
			//3.3生成邮件主题
			message.setSubject("小米商城账号激活邮件","utf-8");
			//这里如果你本地有虚拟机的话,ip会很奇怪,而且qq邮箱因为安全问题,不能用localhost
			// Inet4Address.getLocalHost().getHostAddress();
			//String ip ="127.0.0.1";
			String url = "http://127.0.0.1:8080/myshop/user?method=active&c="+Base64Utils.encode(user.getCode());
			//设置邮件正文 setContent 可以使用html标签
			message.setContent(user.getUsername()+",你好<br>欢迎注册小米商城! 请点击链接进行激活:<a href='"+url+"'>点击进行激活</a>","text/html;charset=utf-8");
			//设置邮件的发送时间 是立即发送
			message.setSentDate(new Date());
			//保存设置
			message.saveChanges();
		}  catch (MessagingException e) {
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return message;
	}
}

总结

        上面使用QQ邮箱发送邮件, 其他的一些邮箱服务器,应该也类似,就算有也是一些细微的区别,就好比上面QQ邮箱需要使用SSL加密,而163不需要一样,遇到错误可以百度自己解决一下。然后必须注明一点,上面的发送邮件的前提是,必须要联网,如果不能联网,那就不能够成功发送邮件,并且会报异常。

标签:辅助,MimeMessage,发送,session,注册,邮箱,message,邮件
来源: https://www.cnblogs.com/zcqzwy/p/14158357.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有