跳至主要內容

邮件发送

holic-x...大约 4 分钟碎片化碎片化

邮件发送

源码样例

​ noob-demo->springboot-demo->springboot-demo-mail

参考步骤说明

1.引入mail相关依赖
2.引入mail操作工具类,或者直接编写方法填充参数发送邮件信息
3.编写测试类(确认参数配置和发送的邮件内容)

​ 邮件发送可以使用spring自带的JavaMailSenderImpl实现,需结合不同的工程进行调整。

​ 如果是普通maven项目,需额外加入spring-context-supportopen in new window依赖,JavaMailSenderImpl类在该包下。

邮件发送核心依赖引入

<dependency>
      <groupId>javax.mail</groupId>
      <artifactId>mail</artifactId>
      <version>1.4.7</version>
 </dependency>

​ 如果是springboot项目则引入spring-boot-starter-mailopen in new window

参数配置

​ 可在资源配置文件中配置邮件相关的参数,简单说明如下(参数配置名称可自定义,在相应的方法中引用即可)

参数说明
mailConfig.host服务器,可为smtp.qq.com
mailConfig.port端口号
mailConfig.username邮箱账号
mailConfig.password邮箱授权码
mailConfig.timeout时间延迟
mailConfig.from发送人(发送者邮箱账号)
application.yml配置
# mail邮件相关配置
mailConfig:
  host: smtp.qq.com # 服务器
  port: 465 # 端口号
  username: xxx@qq.com # 邮箱账号
  password: xxxxxx # 邮箱授权码
  timeout: 25000 # 时间延迟
  from: xxx@qq.com # 发送人
// 初始化参数
@Component
public class MailConfig {

    public static String HOST;

    public static Integer PORT;

    public static String USERNAME;

    public static String PASSWORD;

    public static String TIMEOUT;

    public static String MAIL_FROM;

    @Value("${mailConfig.host}")
    public void setHOST(String HOST) {
        MailConfig.HOST = HOST;
    }

    @Value("${mailConfig.port}")
    public void setPORT(Integer PORT) {
        MailConfig.PORT = PORT;
    }

    @Value("${mailConfig.username}")
    public void setUSERNAME(String USERNAME) {
        MailConfig.USERNAME = USERNAME;
    }

    @Value("${mailConfig.password}")
    public void setPASSWORD(String PASSWORD) {
        MailConfig.PASSWORD = PASSWORD;
    }

    @Value("${mailConfig.timeout}")
    public void setTIMEOUT(String TIMEOUT) {
        MailConfig.TIMEOUT = TIMEOUT;
    }

    @Value("${mailConfig.from}")
    public void setMailFrom(String mailFrom) {
        MAIL_FROM = mailFrom;
    }

}

参考工具类(编写发送邮件接口的工具类MailUtil)

参数说明
mail.smtp.timeout连接超时时间,单位毫秒
mail.smtp.authauth:认证机制开关
mail.smtp.socketFactory.classjavax.net.ssl.SSLSocketFactory
@Component
public class MailUtil {

    private static JavaMailSenderImpl mailSender ;

    static {
        mailSender = createMailSender();
    }

    /**
     * 装载邮件发送器
     * @return 配置好的邮件发送器
     */
    private static JavaMailSenderImpl createMailSender() {
        JavaMailSenderImpl sender = new JavaMailSenderImpl();
        sender.setHost(MailConfig.HOST);
        sender.setPort(MailConfig.PORT);
        sender.setUsername(MailConfig.USERNAME);
        sender.setPassword(MailConfig.PASSWORD);
        sender.setDefaultEncoding("Utf-8");
        Properties p = new Properties();
        p.setProperty("mail.smtp.timeout", MailConfig.TIMEOUT);
        p.setProperty("mail.smtp.auth", "false");
        p.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        sender.setJavaMailProperties(p);
        return sender;
    }

    /**
     * 发送邮件
     * @param to      接受人
     * @param subject 主题
     * @param html    发送内容
     * @throws MessagingException           异常
     * @throws UnsupportedEncodingException 异常
     */
    public static void sendMail(String to, String subject, String html) throws MessagingException, UnsupportedEncodingException {
        MimeMessage mimeMessage = mailSender.createMimeMessage();
        // 设置utf-8或GBK编码以避免乱码问题
        MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
        // 设定发送者名称
        String personal = "noob";
        messageHelper.setFrom(MailConfig.MAIL_FROM, personal);
        messageHelper.setTo(to);
        messageHelper.setSubject(subject);
        messageHelper.setText(html, true);
        mailSender.send(mimeMessage);
    }

    /**
     * 发送带附件的邮件
     *
     * @param to      接受人
     * @param subject 主题
     * @param html    发送内容
     * @param filePath  附件路径
     * @throws MessagingException           异常
     * @throws UnsupportedEncodingException 异常
     */
    public static void sendAttachmentMail(String to, String subject, String html, String filePath) throws MessagingException, UnsupportedEncodingException {
        MimeMessage mimeMessage = mailSender.createMimeMessage();
        // 设置utf-8或GBK编码,否则邮件会有乱码
        MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
        // 设定发送者名称
        String personal = "noob";
        messageHelper.setFrom(MailConfig.MAIL_FROM, personal);
        messageHelper.setTo(to);
        messageHelper.setSubject(subject);
        messageHelper.setText(html, true);
        FileSystemResource file=new FileSystemResource(new File(filePath));
        String fileName=filePath.substring(filePath.lastIndexOf(File.separator));
        messageHelper.addAttachment(fileName,file);
        mailSender.send(mimeMessage);
    }

}

配置测试类

@SpringBootTest
class SpringbootDemoMailApplicationTests {

    @Test
    void contextLoads() {
    }

    @Test
    public void sendMail() {
        String emailMsg = "测试发送邮件";
        try {
            // 发送普通文本邮件
            MailUtil.sendMail("xxx@qq.com", "邮件发送测试", "<a href='https://www.baidu.com' >百度一下</a>");
            // 发送带附件的邮件(指定附件邮件路径)
            MailUtil.sendAttachmentMail("xxx@qq.com", "邮件发送测试", "<a href='https://www.baidu.com' >百度一下</a>", "E:\\temp\\1.png");
        } catch (AddressException e) {
            e.printStackTrace();
        } catch (MessagingException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }
}

邮箱配置:

​ 此处使用qq邮箱的smtp邮件服务器(需关闭邮箱登录保护)

​ 选用一个邮箱作为发送方(发送方需拥有邮件服务器的访问权限),相应配置该账号的账户信息,开通POP3/STMP服务,获取授权码并配置到代码中

授权码open in new window:如果需要管理授权码,可通过账号>自助查询>设备管理查看授权码信息,如果该授权码失效则使用该授权码登录的第三方客户端便无法收发该账号邮件(也可通过手机端处进行管理:设置>账号>安全管理>设备管理,对授权码进行管理),需管理好授权码信息,避免被滥用

评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v3.1.3