最近需要帮助 HR 写一个群发工资邮件的程序,这个程序考虑只有一个用户使用,尽可能简单,所以就决定实现一个基于命令行交互的小程序。以前是没怎么写过这种程序的,实际写下来发现,也没有那么容易,想写得好,给到用户一些提示,需要在这些交互动作以及文本提示的格式上下点功夫。
一开始想用以前的方式采用 Java 的 System.in 来读取用户的输入进行交互,后来发现 java6 中的一个新的工具 Console 类,这个类提供了便捷的读取用户输入的方法,同时更加重要的是支持读取密码的方法:readPassword,这样用户在输入密码的时候就可以保证不被旁边的人看到,增强了一些安全性。
下面总结一下这个程序由最开始一个很快开发出来的可用版本,经过不断修改后变成一个比较完善的版本的过程。
程序一开始就采用 Spring 进行开发, Spring 已经封装好了一些发送邮件的类和 API 使用起来比较简单。开始测试就用的 Gmail 的 SMTP 服务器。
这个程序考虑到邮件的内容可以不断的修改,所以一开始就采用了 Velocity 来实现邮件模板。
然后由于邮件发送的内容里面有很多的敏感信息,所以需要输入密码之后才能执行。密码采用 md5 进行加密。
发送成功后,要有统计的报告,比如:多少发送成功,多少发送失败,原因是什么,及时反馈发送的结果。
下面说说细节问题:
1 、一开始 Velocity 模板,按照自己的习惯就命名成 .vm 的扩展名。但是,这个文件以后需要使用者来编辑的,所以 .vm 扩展名,明显不方便直接编辑,所以后来就改成了 .txt 的扩展名。
2 、邮件的内容在模板里面,但是一开始标题是写在代码中的,这样就没有考虑以后修改邮件标题的可能。后来改成,邮件标题就是模板文件的标题。方便使用者更改和确认。
3 、程序打包后生成的 jar 包,这个一定要取一个正式的,清楚的名字。不要起一些通用的,容易误解的名字。
4 、邮件的附件由于是中英文混写的,所以还需要考虑外国人的阅读习惯,英文单词的前后一定要有空格。(要不然很可能那个国外大老板就会看着很不爽哦。)
5 、然后发送的过程中,这些可能变化的内容,包括标题,邮件内容要回显给用户,让用户再次确认。
6 、接下来要发会发送的列表以及发送的数目给到用户确认。
7 、内容和标题的确认要采用 | 分割,把格式弄得更加漂亮
8 、由于使用的人,发送者邮箱,邮件服务器都可能变化,所以一开始这些配置文件我放到 jar 包里面的 xml 中,但是发现普通用户是无法修改的,所以还是放到 jar 包外面,采用文本文件进行配置。
9 、发送邮件附件有乱码的问题,需要使用MimeUtility.encodeText(file.getName(), "utf-8", null)进行转码。