在 JavaMail 中,可以通过 extends Authenticator 抽象类,在子类中覆盖父类中的 getPasswordAuthentication() 方法,就可以实现以不同的方式来进行登录邮箱时的用户身份认证。JavaMail 中的这种设计是使用了策略模式(Strategy),具体的请参看相关文章。

在我们的代码中,我们设计了一种简单的 SimpleAuthenticator 子类通过构造函数传入用户名和密码,而另一种 GUIAuthenticator 子类则使用 GUI 界面的形式进行身份认证,它可以使得程序在运行时弹出输入对话框来让用户提交用户名和密码,具体的请看下面运行图。

代码实现:

import java.util.Date;

import java.util.Properties;

import java.util.StringTokenizer;

import javax.mail.Authenticator;

import javax.mail.Transport;

import javax.mail.Message.RecipientType;

import javax.mail.PasswordAuthentication;

import javax.mail.Session;

import javax.mail.internet.InternetAddress;

import javax.mail.internet.MimeMessage;

import javax.swing.JOptionPane;

// 普通的通过构造函数传入身份验证信息的 Authenticator 子类

class SimpleAuthenticator extends Authenticator {

private String user;

private String pwd;

public SimpleAuthenticator(String user, String pwd) {

this.user = user;

this.pwd = pwd;

}

@Override

protected PasswordAuthentication getPasswordAuthentication() {

return new PasswordAuthentication(user, pwd);

}

}

// 具有弹出输入对话框的 Authenticator 子类

class GUIAuthenticator extends Authenticator {

@Override

protected PasswordAuthentication getPasswordAuthentication() {

String user;

String pwd;

// 弹出输入对话框

String result = JOptionPane.showInputDialog("请输入用户名和密码,以','隔开!");

StringTokenizer st = new StringTokenizer(result, ","); user = st.nextToken();

pwd = st.nextToken();

return new PasswordAuthentication(user, pwd);

}

}

/**

使用Authenticator子类进行用户身份认证

@author haolloyin

*/

public class UseAuthenticatorSender {

private String smtpServer = "smtp.126.com";

private String from = "testhao@126.com";

private String to = "test_hao@sina.cn";

private String subject = "使用Authenticator子类进行用户身份认证";

private String body = "使用Authenticator子类进行用户身份认证的测试!!!";

public void sendMails(Authenticator auth) throws Exception {

// 设置协议、是否身份验证、服务器等信息

Properties props = new Properties();

props.setProperty("mail.transport.protocol", "smtp");

props.setProperty("mail.smtp.auth", "true");

props.setProperty("mail.host", smtpServer);

// 通过传入的参数获得Authenticator子类对象

Session session = Session.getInstance(props, auth);

session.setDebug(true);

MimeMessage msg = new MimeMessage(session);

msg.setFrom(new InternetAddress(from));

msg.addRecipient(RecipientType.CC, new InternetAddress(from));

msg.setRecipient(RecipientType.BCC, new InternetAddress(to));

msg.setSubject(subject);

msg.setSentDate(new Date());

msg.setText(body);

msg.saveChanges();

Transport.send(msg);

}

// 测试

public static void main(String[] args) throws Exception {

UseAuthenticatorSender sender = new UseAuthenticatorSender();

// 这里体现了使用策略模式的好处,客户端可以选择使用

// 具体的哪一种身份验证方式来提交信息

// Authenticator auth = new SimpleAuthenticator("testhao", "123456");

Authenticator auth = new GUIAuthenticator();

sender.sendMails(auth);

}

}

两种测试结果(只需要在main()方法中注释掉其中的一行则可):

1、使用 SimpleAuthenticator 子类:

2、使用 GUIAuthenticator 子类:

注:程序在运行到用户身份验证时会自动弹出下面的输入对话框,由于上面的代码中的 Session 对象启动了 JavaMail API 调试功能,所以这个现象可以很明显地从控制台中得知。

通过上面使用 Authenticator 的具体子类来实现不同的身份验证方式,我们大概地了解到策略模式的好处,我们还可以在设计一个从网页中或者数据库表中获取登录信息的 Authenticator 子类,而客户端在使用时却可以不受影响。

小结:

Authenticator 类的这种结构设计是设计模式运用在实际应用中的体现,从 JavaMail 的帮助文档中可以看到 Authenticator 类中的其他方法都是 protected final 修饰的,这与策略模式(Strategy)的设计一样。

java mail authen,javaxmail发送邮件:用Authenticator的子类进行身份验证及策略模式(Strategy)...相关推荐

  1. 设计模式-策略模式(Strategy)-Java

    设计模式-策略模式(Strategy)-Java 目录 文章目录 1.前言 2.示例案例-电影票打折方案 3.策略模式概述 3.1.策略模式定义 3.2.策略模式结构 3.3.策略模式结构图中角色 3 ...

  2. Java设计模式之——策略模式(Strategy)

    一.例子 令狐冲被岳不群罚在思过崖上面壁思过.偶然的机会发现崖内有一个后洞,石壁上刻有魔教十长老尽破五岳剑派的图形招式.所有五岳剑派引以为豪的精微奥妙招式尽数被破得干干净净,包括一些已经失传的招式. ...

  3. Google Authenticator windows client 谷歌身份验证器 windows 电脑端

    谷歌身份验证器现在有安卓客户端和ios客户端,本人开发了一个windows客户端,基于 .NETFramework v4.7 开发,已在 github 上开源,可以在 github 上直接下载. gi ...

  4. Java 策略模式(Strategy)

    创建一个能够根据所传递的参数对象的不同而具有不同行为的方法 要执行的算法固定不变,封装到一个类(Context)中 策略就是传递进去的参数对象,它包含执行代码 策略接口 /*** 策略接口*/ pub ...

  5. Java策略模式(Strategy)

    文章目录 策略模式(Strategy) 一.不使用策略模式 二.使用策略模式 1.案例类图 2.案例实现 3.总结 4.开发中的使用场景 策略模式(Strategy) 一.不使用策略模式 使用场景: ...

  6. Java设计模式-策略模式(Strategy)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.策略模式 二.策略模式示例代码 1.支付策略 2.具体支付策略实现 3.策略执行对象 4.测试 总结 前言 本篇介 ...

  7. Java设计模式之十一 ---- 策略模式和模板方法模式

    前言 在上一篇中我们学习了行为型模式的访问者模式(Visitor Pattern)和中介者模式(Mediator Pattern).本篇则来学习下行为型模式的两个模式,策略模式(Strategy Pa ...

  8. Java 设计模式之策略模式

    一.了解策略模式 1.1 什么是策略模式 策略模式 (Strategy Pattern) 是指对一系列的算法定义,并将每一个算法封装起来,而且使它们还可以相互替换.此模式让算法的变化独立于使用算法的客 ...

  9. java解决策略膨胀_折腾Java设计模式之策略模式

    简介 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改.这种类型的设计模式属于行为型模式.简单理解就是一组算法,可以互换,再简单点策略就是封装算法. 意图 定义一 ...

  10. [设计模式] - 策略模式(Java篇)

    来源:http://user.qzone.qq.com/31584 (QQ空间) http://b.qzone.qq.com/cgi-bin/blognew/blog_output_data?uin= ...

最新文章

  1. redis延迟队列 实现_灵感来袭,基于Redis的分布式延迟队列(续)
  2. ODBC驱动,没装怎么办
  3. java.sql.sqlexception: 无效的名称模式:_PSQLException:错误:关系“ TABLE_NAME”不存在...
  4. 安装oracle解压版,oracle11g压缩解压版图文安装详细教程
  5. spring—Bean实例化三种方式
  6. php 将字符串打乱,PHP内部实现打乱字符串顺序函数str_shuffle的方法
  7. 宏基因组大数据分析的质量控制流程规范
  8. 编程语言对比 容器
  9. [Jquery Plugin]Jquery Tabs 插件简介-更友好地组织你的页面 (转)
  10. 【ROS系统】解决找不到用户工作空间下的程序包的问题——E:No such package
  11. ajax上传 java_使用Ajax进行文件与其他参数的上传功能(java开发)
  12. 刚学java.一天应该写多少代码_对于刚学编程不久的人,每天码代码是怎么码?...
  13. entity framework 数据库默认时间的问题的一种解决方案
  14. 自由软件之“父”—Richard. M. Stallman
  15. ansys和matlab优化,基于ANSYS和MATLAB的优化设计
  16. 《微处理器体系结构》1.1 汇编语言与机器语言及应用
  17. WCDMA中的CQI
  18. 【2019年01月18日】股息率分红最高排名
  19. 【Python】pyecharts 数据可视化模块
  20. 2、MySQL数据库-表的修改

热门文章

  1. 梯度、散度、旋度的关系
  2. html5音乐播放器网页底部,jQuery+html5网页底部固定mp3音乐播放器代码
  3. NOI2021颓废记
  4. ­«持续更新«计算机名词梳理(知识点概括,名词解析,简答题)
  5. 用c++做文本加密与解密程序(源码)
  6. SLAM导航全栈书的正确打开方式(强烈推荐)
  7. 2021全国省市区街道(乡镇)数据及编码(不包含港澳台)
  8. 戴尔服务器重装系统优盘启动不了怎么办,戴尔电脑重装系统识别不了u盘怎么办...
  9. Windows 2000 安全检查清单( 摘自《网络与安全》)
  10. win10熄屏时间不对_win10设置了息屏时间但是很快就息屏