要在网络上实现邮件功能,必须要有专门的邮件服务器。这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中。
org.springframework
spring-context-support
5.0.4.RELEASE
QQ邮箱需获取相应的权限:
QQ邮箱–>邮箱设置–>账户–>POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务 开启POP3/SMTP服务,然后获取16位授权码(注意不要将授权码泄露,一个账户可以拥有多个授权码)
开启后
spring实现邮件发送
package com.haichuang.utils;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMailMessage;
import org.springframework.mail.javamail.MimeMessageHelper;
import java.util.Properties;
/**
* 邮箱工具类
* @author liu
* @date 2020/07/10
*/
public class MailUtil {
//使用对象注入的方式 记得配置文件
private static JavaMailSenderImpl senderImpl;
private static SimpleMailMessage mailMessage;
private static Properties prop;
static {
senderImpl=new JavaMailSenderImpl();
mailMessage=new SimpleMailMessage();
prop=new Properties();
}
//发送验证码的方法,to是目标邮箱地址,code是发送的验证码(事先生成)
public static boolean sendMail (String to,String code, String content) {
try{
//设定mail server
senderImpl.setHost("smtp.qq.com");
// 设置收件人,寄件人 用数组发送多个邮件
mailMessage.setTo(to);
mailMessage.setFrom( "[email protected]" );
mailMessage.setSubject( "海创网盘" );
mailMessage.setText(content + code+"!");
senderImpl.setUsername("liu");
senderImpl.setPassword("上述你的qq邮箱授权码");
prop.put("mail.smtp.auth","true");
prop.put("mail.smtp.ssl.enable","true");
prop.put("mail.smtp.timeout","25000");
senderImpl.setJavaMailProperties(prop);
//发送邮件
senderImpl.send(mailMessage);
System.out.println("发送邮件成功,邮箱验证码是:"+code);
return true;
}catch (Exception e) {
System.out.println("发送邮件失败");
System.out.println(prop);
return false;
}
}
}
FTP(File Transfer Protocol)文件传输协议,用于远程服务器和本地主机之间传输文件。FTP是应用层协议,采用C/S架构,服务器和客户端之间通过TCP协议建立连接,服务器用来存储文件,客户端通过访问服务器来下载文件或向服务器上传文件。
FTP在传输数据的时候使用控制连接(21端口)和数据连接(20端口),控制连接用来传输命令,数据连接用来传输数据;每一个FTP命令发送之后,FTP服务器都会返回一个字符串,包括响应代码和一些说明信息,响应代码主要是判断客户端的命令是否被成功执行。
服务器和客户端之间数据的传输有两种模式:
FTP的基本过程:建立连接,传输数据,释放连接。
socket编程的步骤:
服务器:
socket():创建套接字sock
bind():进行绑定
listen():监听连接的到来
accept():接收新连接的请求
send()和recv():进行会话
close():关闭连接
客户端:
socket():创建套接字sock
connect():给服务器发送一个连接请求
send()和recv():进行会话
close():关闭连接
FTP服务器支持的功能: USER,PASS,LIST,RETR,PUSH,QUIT
FTP服务器的响应码:
220: 新用户服务准备好了
221: 服务关闭控制连接,可以退出登录
226: 关闭数据连接,请求的文件操作成功
230:用户登录
502: 命令未实现,不合法的命令
530:账号或密码错误
550: 未执行请求的操作
553: 未执行请求的操作:文件名不合法
ftp就介绍到这里,接下来进入正题,ftp上传下载工具类的实现
可在maven导入以下依赖
commons-net
commons-net
3.3
package com.haichuang.utils;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import java.io.*;
/**
* ftp上传下载工具类
* @author liu
* @date 2020/07/10
*/
public class FtpUtil {
/**
* Description: 向FTP服务器上传文件
*
* @param host FTP服务器hostname
* @param port FTP服务器端口
* @param username FTP登录账号
* @param password FTP登录密码
* @param basePath FTP服务器基础目录
* @param filePath FTP服务器文件存放路径。例如分日期存放:/2015/01/01。文件的路径为basePath+filePath
* @param filename 上传到FTP服务器上的文件名
* @param input 输入流
* @return 成功返回true,否则返回false
*/
public static boolean uploadFile(String host, int port, String username, String password, String basePath,
String filePath, String filename, InputStream input) {
boolean result = false;
FTPClient ftp = new FTPClient();
try {
int reply;
ftp.connect(host, port);// 连接FTP服务器
// 如果采用默认端口,可以使用ftp.connect(host)的方式直接连接FTP服务器
ftp.login(username, password);// 登录
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
return result;
}
//切换到上传目录
if (!ftp.changeWorkingDirectory(basePath+filePath)) {
//如果目录不存在创建目录
String[] dirs = filePath.split("/");
String tempPath = basePath;
for (String dir : dirs) {
if (null == dir || "".equals(dir)) continue;
tempPath += "/" + dir;
if (!ftp.changeWorkingDirectory(tempPath)) {
if (!ftp.makeDirectory(tempPath)) {
return result;
} else {
ftp.changeWorkingDirectory(tempPath);
}
}
}
}
//设置上传文件的类型为二进制类型
ftp.setFileType(FTP.BINARY_FILE_TYPE);
//上传文件
if (!ftp.storeFile(filename, input)) {
return result;
}
input.close();
ftp.logout();
result = true;
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}
return result;
}
/**
* Description: 从FTP服务器下载文件
* @param host FTP服务器hostname
* @param port FTP服务器端口
* @param username FTP登录账号
* @param password FTP登录密码
* @param remotePath FTP服务器上的相对路径
* @param fileName 要下载的文件名
* @param localPath 下载后保存到本地的路径
* @return
*/
public static boolean downloadFile(String host, int port, String username, String password, String remotePath,
String fileName, String localPath) {
boolean result = false;
FTPClient ftp = new FTPClient();
try {
int reply;
ftp.connect(host, port);
// 如果采用默认端口,可以使用ftp.connect(host)的方式直接连接FTP服务器
ftp.login(username, password);// 登录
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
return result;
}
ftp.changeWorkingDirectory(remotePath);// 转移到FTP服务器目录
FTPFile[] fs = ftp.listFiles();
for (FTPFile ff : fs) {
if (ff.getName().equals(fileName)) {
File localFile = new File(localPath + "/" + ff.getName());
OutputStream is = new FileOutputStream(localFile);
ftp.retrieveFile(ff.getName(), is);
is.close();
}
}
ftp.logout();
result = true;
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException ioe) {
}
}
}
return result;
}
}
MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。这套算法的程序在 RFC 1321 标准中被加以规范。1996年后该算法被证实存在弱点,可以被加以破解,对于需要高度安全性的数据,专家一般建议改用其他算法,如SHA-2。2004年,证实MD5算法无法防止碰撞(collision),因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途。
在最近的项目开发中,对于用户注册时对密码的加密,我有点措手不及,本人还没有学习spring security之类的安全框架。在看别人的代码时学到了md5加密,今天和大家分享一下
可在maven导入以下依赖
commons-io
commons-io
2.5
org.springframework
spring-core
5.0.4.RELEASE
下面是源码:
package com.haichuang.utils;
import org.apache.commons.io.IOUtils;
import org.springframework.util.DigestUtils;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.util.Date;
/**
* MD%加密工具类
*
* @author liu
* @date 2020/07/10
*/
public class MD5Util {
// 生成16位MD5密文
public static String getMD5(String str) {
try {
// 生成一个MD5加密计算摘要
MessageDigest md = MessageDigest.getInstance("MD5");
// 调用update方法计算MD5函数(参数:将密码串转换为操作系统的字节编码)
md.update(str.getBytes());
// digest()最后返回md5的hash值,返回值为8位的字符串,但此方法要先调用update
// BigInteger函数则将8位的字符串转换成16位hex值,用字符串来表示;得到字符串形式的hash值,数值从1开始
// BigInteger会把0省略掉,需补全至32位,重写一个方法将16位数转换为32位数
String md5 = new BigInteger(1, md.digest()).toString(16);
return md5;
} catch (Exception e) {
throw new RuntimeException("MD5加密错误:" + e.getMessage(), e);
}
}
// 将16位数转为32位
public static String fillMD5(String md5) {
return md5.length() == 32 ? md5 : fillMD5("0" + md5);
}
/**
* 推荐此方法获取文件MD5
*
* @param inputStream
* @return
*/
public static String getMd5File(InputStream inputStream) {
String md5 = null;
try {
md5 = DigestUtils.md5DigestAsHex(IOUtils.toByteArray(inputStream));
IOUtils.closeQuietly(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
return md5;
}
}