Java - JavaMail - 利用 JavaMail 发邮件的 小demo
1. 概述
- 面试的时候, 被问到一些乱七八糟的运维知识
- 虽然我不是干运维的, 但是最后却告诉我专业知识深度不够, 感觉很难受
- 又回到了一个烦人的问题
- 工作没有深度的情况下, 你该如何的提升自己, 并且做出些有意义的成果
- 反正我现在是一脸懵逼的
- 后悔之前选择不慎的同时, 也得想想如何丰富自己了
- 扯远了
2. 准备
- 环境
硬件
- 略, 这个没啥特定要求, 我就是在一个 windows 的 pc 上写的
软件
- 操作系统
- Windows 10
- jdk
- JDK8
- maven
- 3.3.9
- 组件
JavaMail
<!-- 主要是 JavaMail 相关的组件 -->
<!-- 还用到 TestNG 来做单元测试 -->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>javax.mail-api</artifactId>
<version>1.6.2</version>
</dependency>
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.2</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
- 操作系统
邮件相关的一些协议
- SMTP
- 名称
- Simple Mail Transfer Protocol
- 功能
- 收发邮件
- 名称
- POP
- 名称
- Post Office protocol
- 功能
- 接受邮件
- 原始版本, 只能单用户, 单邮箱
- 名称
- IMAP
- 名称
- Internet Message Access Protocol
- 功能
- 接收邮件
- 可以多用户, 多邮箱
- 名称
- 本次demo
- 功能
- 只有简单的发送邮件
- 采用
- SMTP
- 功能
- SMTP
SMTP 的一些准别
参数
- 邮件服务器
- 邮件端口
- 邮箱账号
- 邮箱密码
获取方法
- 略, 这个每个邮件服务商, 都有自己的获取方式
JavaMail 的一些准备
Session
- 概述
- 存储基本的邮箱信息
- 作为与邮箱连接的 会话对象
- 依赖属性
- Properties
- 一个属性对象
- 属性
- 后面会专门列出 properties 文件
- Authenticator
- 认证器
- 属性
- 邮箱用户
- 邮箱密码
- Properties
- 概述
Authenticator
- 概述
- 认证器
- 概述
Message
- 概述
- 消息
- 依赖 Session
- 属性
- 发件人
- 依赖 Address
- 收件人
- 依赖 Address
- 标题
- 内容
- 发件人
- 概述
Address
- 概述
- 地址信息
- 属性
- URL
- 概述
Transport
- 概述
- 收发器
- 概述
思路
- 获取配置
- 创建 Authenticator
- 创建 Session
- 创建 Message
- 发送邮件
3. 项目结构
概述
- Maven 项目
- 简单描述下结构
结构
- project
- src
- main
- java
- resources
- test
- java
- resources
- main
- src
- project
说明
src
- 子目录
- main
- 程序目录
- test
- 测试目录
- main
- 子目录
main
- 子目录
- java
- 程序目录
- resources
- 资源目录
- classpath 的位置
- java
- 子目录
test
- 子目录
- java
- 测试目录
- resouces
- 资源目录
- classpath 的位置
- java
- 子目录
资源目录
- java 和 test 下的资源目录, 不是互通的
- 测试代码在测试 java 下的代码时
- 如果涉及到取 classpath, 会自动转换到 test 的 resource 下
4. 代码
配置文件
概述
- 配置的字段名, 最好不要改
- 如何把这些东西读到 properties 里, 这个就八仙过海了
代码
# Server
mail.smtp.host=smtp.qq.com
mail.smtp.port=587 # Account
mail.smtp.account=<yourEmailAccount>
mail.smtp.password=<yourEmailPassword> # Options
# 这俩是那种必须要, 但是我又懒得去搞懂的参数
mail.smtp.auth=true
mail.smtp.startssl.enable=true # Message
mail.message.from=<yourSender>
mail.message.to=<yourReciever>
mail.message.subject=<yourTitle>
mail.message.text=<yourContent>
友情提示
- = 号两边的空格, 最好贴演示
- 配置的值, 千万不要加 引号
- 千万不要加 引号
- 千万不要加 引号
- 千万不要加 引号
代码
概述
- 按照之前描述的思路
- 肯定不能运行
- 原因是我没有上传我 properties 的处理组件
- 其实自己改改, 也不麻烦, 毕竟只是一个简单的发邮件功能
代码
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties; public class MyMailBox { public static void main(String[] args) {
// 1. 获取 session;
// # 1. 准备属性
String filename = "demo.properties";
final Properties properties = PropertiesUtil.getProperties(filename); // # 2. 准备用户信息
Authenticator auth = new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(properties.getProperty(MailConstants.MAIL_ACCOUNT),
properties.getProperty(MailConstants.MAIL_PASSWORD));
}
}; // # 3. 创建 Session
Session session = Session.getDefaultInstance(properties, auth); // 2. 构造 消息;
try {
// # 1. 创建 message
Message message = new MimeMessage(session); // # 2. 设置发信人
message.setFrom(new InternetAddress(properties.getProperty(MailConstants.MAIL_FROM))); // # 3. 设置设置收信人
message.setRecipient(Message.RecipientType.TO,
new InternetAddress(properties.getProperty(MailConstants.MAIL_TO))); // # 4. 设置标题
message.setSubject(properties.getProperty(MailConstants.MAIL_SUBJECT)); // # 5. 设置内容
message.setText(properties.getProperty(MailConstants.MAIL_TEXT)); // 3. 发送消息
Transport.send(message); System.out.println("Mission complete!");
} catch (MessagingException e) {
throw new RuntimeException(e);
} }
}
5. 结果
- 邮件能发出来
6. 其他的一些想法
工程上
更加地面向对象
- 可以把一些东西抽象出来, 做复用
- 邮件服务器
- 用户信息
- 邮件信息
- 这次没做, 是因为东西比较少, 一个 properties 搞定
- 可以把一些东西抽象出来, 做复用
properties 读取配置
- 这块已经做了, 不过没发上来
- 确实有点不地道
- 我会在另一篇博客里, 补充一些相关的东西
- properties 读取数组
- 不知道可不可以, 但是面的多个收信人, 起码不会太尴尬, 是吧
- 这块已经做了, 不过没发上来
邮件内容
- 尝试发送复杂的东西
- html 页面
- freemarker 模板做的 html 页面
- 附件
- 尝试发送复杂的东西
测试
- 尝试了 测试驱动开发 的思路
- 问题
测试方法如何管理, 命名
- 测试一个方法
- 正向
- 正向场景1
- 正向场景2
- 逆向
- 逆向场景1
- 逆向场景2
- 正向
- 问题
- 方法命名
- 我之前的思路, 是 test 打头, 接原方法名, 再接场景, 再接参数
- 他的太长没法看, 而且很乱
- 真心求一个组织用例的方式
- 因为代码不多, 我所有方法, 都是写到一个测试类里
- 难道是要分包, 分类, 在细分?
- 方法命名
- 测试一个方法
数据管理
- 写在专门的数据类里
- 问题
- 该数据需要重新编译
- 如果写在 mysql 里, 表结构不知道怎么定义会比较合适
- 如果改成 关键字驱动, 那么表结构什么的, 估计也会比较麻烦
自动化测试, 与发送邮件告警
写这个的目的, 是希望在出问题的时候, 可以邮件告警
结果
- 单纯的 java 项目
- 需要 maven 插件的配置
- 持续集成系统
- jinkens
- 自带模块, 配置好了就能发
- 还有模板什么的
- jinkens
- 监控系统
- zabbix
- 自带功能
- 配置好了就能使
- 还有模板
- 还有问题级别
- 还支持自定义 py 脚本
- 什么短信, 微信也是信手拈来
- zabbix
- 单纯的 java 项目
回到那个最原始的问题
- 如何在工作很浅的情况下, 提升自己, 干有意义的事
Java - JavaMail - 利用 JavaMail 发邮件的 小demo的更多相关文章
- CentOS6.4 利用sendEmail发邮件
1.下载安装sendEmail wget http://caspian.dotconf.net/menu/Software/SendEmail/sendEmail-v1.56.tar.gz tar z ...
- iOS10打电话、发短信、发邮件等小功能
注意:iOS10.0以后,使用openURL会有延迟,需要使用 openURL: options: completionHandler: 一.概要 本文中主要就是介绍在iOS中实现打电话.发短信.发邮 ...
- [置顶] 利用CXF发布webService的小demo
其实webService的发布不仅仅只有xfire,今天,给大家介绍一下用CXF发布一个webService的小demo,CXF也是我做webService用的第一个框架... 先将相关的jar引进来 ...
- java实现后台自动发邮件功能
web.xml文件 <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE web-app PUBLI ...
- Python发邮件的小脚本
# -*- coding: UTF-8 -*- import smtplib from email.mime.text import MIMEText mailto_list = ['hitwh_Gy ...
- python 利用 smtplib发邮件
import smtplib from email.mime.text import MIMEText title = "request build error" content ...
- 邮件发送小demo
//send email public static bool SendEmail() { //实例化发件人地址 MailAddress from = new MailAddress("aa ...
- 《java语言程序设计》初步学习——各种小Demo
发现现在的天下几乎都是java的天下啊,虽然我个人对java没什么好感,但是迫于生活压力,还是学一下吧,我关注的应该主要还是web方面,所以应该学的是 java server page(JSP),所以 ...
- JAVA的NIO的新特性和小Demo,进一步了解NIO
1.为什么要用NIO NIO 的创建目的是为了让 Java 程序员可以实现高速 I/O 而无需编写自定义的本机代码.NIO 将最耗时的 I/O 操作(即填充和提取缓冲区)转移回操作系统,因而可以极大地 ...
随机推荐
- Linux crontab命令详解与实例
内容有重复的,不过本着宁多勿少的原则就都看看吧,就当加深印象啦 基本格式 :* * * * * command分 时 日 月 周 命令 第1列表示分钟1-59 每分钟用*或者 */1表示第2列表示小时 ...
- [BZOJ 3441]乌鸦喝水
3441: 乌鸦喝水 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 374 Solved: 148[Submit][Status][Discuss] ...
- SpringBoot 中解决跨域请求
CORS 理解 同源策略是web浏览器实现的一个重要的安全概念,它防止JavaScript代码对不同的来源(例如,不同的域)发出请求,而不是它所服务的来源.虽然同源策略有效地防止来自不同来源的资源,但 ...
- linux性能系列--网络
一.为啥网络监控不好做? 回答:网络是所有子系统中最难监控的了.首先是由于网络是抽象的,更重要的是许多影响网络的因素并不在我们的控制范围之内.这些因素包括,延迟.冲突.阻塞等 等.由于网络监控中, ...
- CSS 预处理器
在程序员眼里,css不像其他程序语言(例如PHP, Javascript等等),有自己的变量.常量.条件语句以及一些编程语法,它只是一行行单纯的属性描述,写起来相当费事,而且代码难以组织和维护.自然的 ...
- Django中模型(五)
Django中模型(五) 六.模型查询 1.概述 查询集,表示从数据库获取的对象集合. 过滤器就是一个函数,基于所给的参数限制查询集结果.查询集可以有多个过滤器. 从sql角度来说,查询集合等价于se ...
- 3、Web Service-Jaxws(Eclipse版本)
1.概述 开发手段: 使用jdk开发(1.6及以上的版本) 使用CXF框架开发 组成: -服务器端 -客户端 2.使用JDK开发 1).服务器端 -@WebService(SEI和SEI的实现类) - ...
- Kali-linux破解操作系统用户密码
当忘记操作系统的密码或者攻击某台主机时,需要知道该系统中某个用户的用户名和密码.本节将分别介绍破解Windows和Linux用户密码. 8.6.1 破解Windows用户密码 Windows系统的用户 ...
- Gradle初步
一.介绍 Gradle是一个基于 JVM 的富有突破性构建工具. 它为您提供了: 一个像 ant 一样,通用的灵活的构建工具 一种可切换的,像 maven 一样的基于约定优于配置的构建框架 强大的多工 ...
- PHPStorm自定义主题配置
1.下载喜欢的主题 官方下载地址:下载 2.将.icls主题文件放到PHPStorm的配置中 windows下主题位置:C:\Users\Administrator\.PhpStorm2017.3\c ...