Hutool - 结合163邮箱发送邮件

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

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

  •  

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值