海创软件组-20200712-项目常用工具类-邮件发送,ftp上传下载工具类,MD5工具类

一、邮件发送工具类

1)邮件服务器与传输协议

要在网络上实现邮件功能,必须要有专门的邮件服务器。这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中。

  • SMTP服务器地址:一般是 smtp.xxx.com,比如163邮箱是
  • smtp.163.com,qq邮箱是smtp.qq.com。
  • SMTP协议
  • 通常把处理用户smtp请求(邮件发送请求)的服务器称之为SMTP服务器(邮件发送服务器)。
  • POP3协议
  • 通常把处理用户pop3请求(邮件接收请求)的服务器称之为POP3服务器(邮件接收服务器)。

2)发送邮件

海创软件组-20200712-项目常用工具类-邮件发送,ftp上传下载工具类,MD5工具类_第1张图片
可在maven项目导入以下依赖


	    org.springframework
	    spring-context-support
	    5.0.4.RELEASE

QQ邮箱需获取相应的权限:

QQ邮箱–>邮箱设置–>账户–>POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务 开启POP3/SMTP服务,然后获取16位授权码(注意不要将授权码泄露,一个账户可以拥有多个授权码)
海创软件组-20200712-项目常用工具类-邮件发送,ftp上传下载工具类,MD5工具类_第2张图片
开启后
海创软件组-20200712-项目常用工具类-邮件发送,ftp上传下载工具类,MD5工具类_第3张图片
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上传下载工具类

1)FTP是什么

FTP(File Transfer Protocol)文件传输协议,用于远程服务器和本地主机之间传输文件。FTP是应用层协议,采用C/S架构,服务器和客户端之间通过TCP协议建立连接,服务器用来存储文件,客户端通过访问服务器来下载文件或向服务器上传文件。
FTP在传输数据的时候使用控制连接(21端口)和数据连接(20端口),控制连接用来传输命令,数据连接用来传输数据;每一个FTP命令发送之后,FTP服务器都会返回一个字符串,包括响应代码和一些说明信息,响应代码主要是判断客户端的命令是否被成功执行。

海创软件组-20200712-项目常用工具类-邮件发送,ftp上传下载工具类,MD5工具类_第4张图片

服务器和客户端之间数据的传输有两种模式:

主动模式(PORT)

  1. 客户端和服务器的21端口建立控制连接
  2. 客户端发送PORT命令给服务器,PORT命令中包含了客户端将用啥端口接收数据
  3. 服务器通过20端口和客户端指定的端口之间传送数据

被动模式(PASV)

  1. 客户端和服务器的21端口建立控制连接
  2. 客户端向服务器发送PASV命令,服务器在接收到PASV命令之后随机打开一个大于1024的端口,通知客户端在这个端口进行数据的传输
  3. 客户端收到这个端口号之后,客户端连接上服务器的这个端口,进行数据传输

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信息摘要算法(英语: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;
    }
}

你可能感兴趣的:(海创软件组)