使用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.settingif(null == mailAccount) {try {mailAccount = new MailAccount(MailAccount.MAIL_SETTING_PATH2);} catch (IORuntimeException e) {//ignore}}// 寻找mail.settingif(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.settingmailAccount = new MailAccount(MailAccount.MAIL_SETTING_PATH);} catch (IORuntimeException e) {//ignore}// 寻找config/mailAccount.settingif(null == mailAccount) {try {mailAccount = new MailAccount(MailAccount.MAIL_SETTING_PATH2);} catch (IORuntimeException e) {//ignore}}// 寻找classpath下的 mail.settingif(null == mailAccount) {try {mailAccount = new MailAccount(MailAccount.MAIL_SETTING_PATH3);} catch (IORuntimeException e) {//ignore}}return mailAccount;}
现在明白了吗?
菜鸟的记录,有错误请多多指教,相互学习,谢谢!! -