当前位置: 代码迷 >> 综合 >> Hutool - 结合163邮箱发送邮件
  详细解决方案

Hutool - 结合163邮箱发送邮件

热度:72   发布时间:2023-12-27 11:16:07.0

使用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;}

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

  •