Javamail 实现简单发送邮件(一)

  在互联网刚开始普及的时代,邮件就像古时书信一样重要。尽管如今实时通讯已经做得非常便捷了,但是邮件依然起着不可替代的作用。许多大厂、学校都有自己的邮件系统,其中比较著名的就属Gmail、outlook、网易163和QQ等邮箱了。

一、发送邮件原理

两个重要协议

  1. SMTP: Simple Mail Transfer Protocol,即简单邮件传输协议,发送邮件的协议,默认端口,25
  2. POP3: Post Office Protocol 3,即邮局协议,接收邮件的协议,默认端口,110

①、用户A的电子邮箱为:xx@qq.com,通过邮件客户端软件写好一封邮件,交到QQ的邮件服务器,这一步使用的协议是SMTP,对应图示的①;

②、QQ邮箱会根据用户A发送的邮件进行解析,也就是根据收件地址判断是否是自己管辖的账户,如果收件地址也是QQ邮箱,那么会直接存放到自己的存储空间。这里我们假设收件地址不是QQ邮箱,而是163邮箱,那么QQ邮箱就会将邮件转发到163邮箱服务器,转发使用的协议也是SMTP,对应图示的②;

③、163邮箱服务器接收到QQ邮箱转发过来的邮件,也会判断收件地址是否是自己,发现是自己的账户,那么就会将QQ邮箱转发过来的邮件存放到自己的内部存储空间,对应图示的③;

④、用户A将邮件发送了之后,就会通知用户B去指定的邮箱收取邮件。用户B会通过邮件客户端软件先向163邮箱服务器请求,要求收取自己的邮件,对应图示的④;

⑤、163邮箱服务器收到用户B的请求后,会从自己的存储空间中取出B未收取的邮件,对应图示⑤;

⑥、163邮箱服务器取出用户B未收取的邮件后,将邮件发给用户B,对应图示的⑥;最后三步用户B收取邮件的过程,使用的协议是POP3;

二、***邮件客户端(Java)

  相信很多人都经历过邮箱登陆、注册、接收通知等活动吧!!!邮件的作用很多,尤其在国外异常多!!!我曾经看到过一个视频,就是Facebook的创始人扎克伯格接收哈佛录取通知书,视频中小扎就是打开邮箱查看的录取通知书。可想而知,mail是多么重要而且普及了吧!!!

  网站实现邮件登陆、注册其实并不难。你可以自己申请一个域名,然后创建一个专属于你的邮箱系统,也可以使用其他大型邮件客户端的接口,进行学习使用。今天我们主要讲第二种,实现接口,发送邮件。

1、开启第三方登陆(QQ)

  主要以QQ邮箱为例,邮箱设置基本都是一样的只是位置不同罢了。开启POP3/SMTP服务和IMAP/SMTP服务,并按提示要求生成授权码

2、所需依赖

	<dependency>
		<groupId>javax.mail</groupId>
		<artifactId>mail</artifactId>
		<version>1.4.7</version>
   </dependency>

3、编写代码实现

	public void TestSend() {
		/** * 1、设置邮箱的一些属性,关于Properties类的介绍 * 2、创建认证对象authenticator,使用自己的邮件账号和授权码 * 3、获得一个session对象,用来保存认证对象 * 4、创建邮件消息对象message * 4.1、设置message的发送人,这个要和认证对象的账号一致 * 4.2、设置message的接收人 * 4.3、设置邮件的主题和内容 */

        //1 确定连接位置
        Properties props = System.getProperties();
        //1.1获取qq邮箱smtp服务器的地址,
        props.setProperty("mail.smtp.host", "smtp.qq.com");
        //1.2是否进行权限验证。
        props.setProperty("mail.smtp.auth", "true");
        
        //3 建立邮件会话 2、创建认证对象authenticat
        Session session = Session.getDefaultInstance(props, new Authenticator() {
        	 //填写自己的qq邮箱的登录帐号和授权密码,授权密码的获取,在后面会进行讲解。
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("XXXXXXXXX@qq.com", "XXXXXXXXX"); //账户 授权码
            }
        });
            //4、创建消息
        MimeMessage message = new MimeMessage(session);
     
      
       //4.1 附带发件人名字
       
       //设置自定义发件人昵称 
       String nickFrom = MimeUtility.encodeText("职能搜索平台");  
       String nickTo = MimeUtility.encodeText("酷酷的用户");  
       //4.2 设置发信人 
	   message.setFrom(new InternetAddress(nickFrom+"<XXXXXXXXXX@qq.com>"));
	   message.setRecipients(Message.RecipientType.TO, nickTo+"<XXXXXXXXXX@163.com>");
	   message.setRecipients(Message.RecipientType.BCC, nickFrom+"<XXXXXXXXXX@qq.com>");
	   
	   /** * 4.2 收件人 (补充) * 第一个参数: * RecipientType.TO 代表收件人 * RecipientType.CC 抄送 * RecipientType.BCC 暗送 * 比如A要给B发邮件,但是A觉得有必要给要让C也看看其内容,就在给B发邮件时, * 将邮件内容抄送给C,那么C也能看到其内容了,但是B也能知道A给C抄送过该封邮件 * 而如果是暗送(密送)给C的话,那么B就不知道A给C发送过该封邮件。 * 第二个参数 * 收件人的地址,或者是一个Address[],用来装抄送或者暗送人的名单。或者用来群发。可以是相同邮箱服务器的,也可以是不同的 * 这里我们发送给我们的qq邮箱 */
	   //4.3设置主题和内容
	   
	   message.setSubject("通过javamail发出!!!");
	   
	   //文本部分
	   message.setContent("文本邮件测试", "text/html;charset=UTF-8");
	   message.setSentDate(new Date());
	   //发送邮件
	   Transport.send(message);
	}

参考:https://www.cnblogs.com/whgk/p/6506027.html

参考:https://www.cnblogs.com/ysocean/p/7652934.html