使用Hutool结合163邮箱发送邮件
-
进入163设置邮箱POP3/SMTP/IMAP
-
引入Hutool依赖
地址:https://www.hutool.cn/docs/#/extra/%E9%82%AE%E4%BB%B6%E5%B7%A5%E5%85%B7-MailUtil
<dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4.7</version> </dependency> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-extre</artifactId> <version>5.0.6</version> </dependency>
-
创建配置文件,该文件并非只能叫mail.setting,通过查看源码可以看到配置文件名称和路径配置,这里不讲述,放到最后来描述。
# 邮件服务器的SMTP地址,可选,默认为smtp.<发件人邮箱后缀> host=smtp.163.com # 邮件服务器的SMTP端口,默认是25端口 port=25 # 发件人(必须正确,否则发送失败) from=*******@163.com # 用户名,必须要设置成你自己使用邮箱的名称,否则会报错,权限认证失败 535错误 user=******@163.com # 密码 此处注意,这里是授权码 pass=**** # 使用SSL安全连接 sslEnable=false #使用 STARTTLS安全连接,STARTTLS是对纯文本通信协议的扩展。 starttlsEnable = false auth = true
-
设置maven添加文件扫描,如果不添加有可能会造成target目录下找不到.setting文件
<resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.yml</include> <include>**/*.properties</include> <include>**/*.xml</include> <include>**/*.setting</include> <include>**/*.png</include> </includes> <filtering>false</filtering> </resource> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.yml</include> <include>**/*.properties</include> <include>**/*.xml</include> <!-- 加入.setting --> <include>**/*.setting</include> <include>**/*.png</include> </includes> <filtering>false</filtering> </resource> </resources>
-
开始写java代码
public void sendEmail() {
ArrayList<String> tos = CollUtil.newArrayList(
"****@163.com",
"****@qq.com");
MailUtil.send(tos, "测试邮件", "邮件来自Zyred问候沙雕的邮件, 晚上好!", false);
}
-
测试结果
-
部分源码阅读
进入send() 后
// 进入send() MailUtil.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(GlobalMailAccount.INSTANCE.getAccount(), true, tos, ccs, bccs, subject, content, null, isHtml, files); }
此时你会发现第第一个send()调用了第二个send(),第二个send()中第一个参数好像就是账户对象,果断点进去看看,Ctrl + 鼠标右键,点击INSTANCE,进入该类中,代码如下
package cn.hutool.extra.mail; import cn.hutool.core.io.IORuntimeException; /** * 全局邮件帐户,依赖于邮件配置文件{@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 this.mailAccount; } /** * 创建默认帐户 * * @return MailAccount */ private MailAccount createDefaultAccount() { MailAccount mailAccount = null; try { mailAccount = new MailAccount(MailAccount.MAIL_SETTING_PATH); } catch (IORuntimeException e) { //ignore } // 寻找config/mailAccount.setting if(null == mailAccount) { try { mailAccount = new MailAccount(MailAccount.MAIL_SETTING_PATH2); } catch (IORuntimeException e) { //ignore } } // 寻找mail.setting 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/mail.setting"; public static final String MAIL_SETTING_PATH2 = "config/mailAccount.setting"; public static final String MAIL_SETTING_PATH3 = "mail.setting";
此时此刻浮现在眼前的是三个不同的路径,然后我们再回到 GlobalMailAccount#createDefaultAccount(),
private MailAccount createDefaultAccount() { MailAccount mailAccount = null; try { // 读取 config/mail.setting mailAccount = new MailAccount(MailAccount.MAIL_SETTING_PATH); } catch (IORuntimeException e) { //ignore } // 寻找config/mailAccount.setting if(null == mailAccount) { try { mailAccount = new MailAccount(MailAccount.MAIL_SETTING_PATH2); } catch (IORuntimeException e) { //ignore } } // 寻找classpath下的 mail.setting if(null == mailAccount) { try { mailAccount = new MailAccount(MailAccount.MAIL_SETTING_PATH3); } catch (IORuntimeException e) { //ignore } } return mailAccount; }
现在明白了吗?
菜鸟的记录,有错误请多多指教,相互学习,谢谢!! -