Hutool - 结合163邮箱发送邮件

时间:2025-03-10 10:11:54

 部分源码阅读
 

进入send() 后

// 进入send()
(tos, "测试邮件", "邮件来自Zyred问候沙雕的邮件, 晚上好!", false);

 

/**
	 * 使用配置文件中设置的账户发送邮件,发送给多人
	 *
	 * @param tos 收件人列表
	 * @param subject 标题
	 * @param content 正文
	 * @param isHtml 是否为HTML
	 * @param files 附件列表
	 */
	public static void send(Collection<String> tos, String subject, String content, boolean isHtml, File... files) {
		send(tos, null, null, subject, content, isHtml, files);
	}

/**
	 * 使用配置文件中设置的账户发送邮件,发送给多人
	 *
	 * @param tos 收件人列表
	 * @param ccs 抄送人列表,可以为null或空
	 * @param bccs 密送人列表,可以为null或空
	 * @param subject 标题
	 * @param content 正文
	 * @param isHtml 是否为HTML
	 * @param files 附件列表
	 * @since 4.0.3
	 */
	public static void send(Collection<String> tos, Collection<String> ccs, Collection<String> bccs, String subject, String content, boolean isHtml, File... files) {
		send((), true, tos, ccs, bccs, subject, content, null, isHtml, files);
	}

 此时你会发现第第一个send()调用了第二个send(),第二个send()中第一个参数好像就是账户对象,果断点进去看看,Ctrl + 鼠标右键,点击INSTANCE,进入该类中,代码如下
 

package ;

import ;

/**
 * 全局邮件帐户,依赖于邮件配置文件{@link MailAccount#MAIL_SETTING_PATH}或{@link MailAccount#MAIL_SETTING_PATH2}
 * 
 * @author looly
 *
 */
public enum GlobalMailAccount {
	INSTANCE;

	private final MailAccount mailAccount;

	/**
	 * 构造
	 */
	GlobalMailAccount() {
		mailAccount = createDefaultAccount();
	}

	/**
	 * 获得邮件帐户
	 * 
	 * @return 邮件帐户
	 */
	public MailAccount getAccount() {
		return ;
	}

	/**
	 * 创建默认帐户
	 * 
	 * @return MailAccount
	 */
	private MailAccount createDefaultAccount() {
		MailAccount mailAccount = null;
		try {
			mailAccount = new MailAccount(MailAccount.MAIL_SETTING_PATH);
		} catch (IORuntimeException e) {
			//ignore
		}
		
		// 寻找config/
		if(null == mailAccount) {
			try {
				mailAccount = new MailAccount(MailAccount.MAIL_SETTING_PATH2);
			} catch (IORuntimeException e) {
				//ignore
			}
		}
		
		// 寻找
		if(null == mailAccount) {
			try {
				mailAccount = new MailAccount(MailAccount.MAIL_SETTING_PATH3);
			} catch (IORuntimeException e) {
				//ignore
			}
		}
		
		return mailAccount;
	}
}
注意看createDefaultAccount()方法中,是如何创建MailAccount对象的,我们再看看try中 new   MailAccount(MailAccount.MAIL_SETTING_PATH); MailAccount.MAIL_SETTING_PATH代表了什么?
public static final String MAIL_SETTING_PATH = "config/";
public static final String MAIL_SETTING_PATH2 = "config/";
public static final String MAIL_SETTING_PATH3 = "";

此时此刻浮现在眼前的是三个不同的路径,然后我们再回到 GlobalMailAccount#createDefaultAccount(),
 

private MailAccount createDefaultAccount() {
		MailAccount mailAccount = null;
		try {
            // 读取 config/
			mailAccount = new MailAccount(MailAccount.MAIL_SETTING_PATH);
		} catch (IORuntimeException e) {
			//ignore
		}
		
		// 寻找config/
		if(null == mailAccount) {
			try {
				mailAccount = new MailAccount(MailAccount.MAIL_SETTING_PATH2);
			} catch (IORuntimeException e) {
				//ignore
			}
		}
		
		// 寻找classpath下的 
		if(null == mailAccount) {
			try {
				mailAccount = new MailAccount(MailAccount.MAIL_SETTING_PATH3);
			} catch (IORuntimeException e) {
				//ignore
			}
		}
		
		return mailAccount;
	}

现在明白了吗? 
菜鸟的记录,有错误请多多指教,相互学习,谢谢!!