java实现邮件发送功

在很多管理系统中,向指定邮箱发送邮件是比较常见的功能。比如登录注册可以用邮箱进行验证;运维系统中,自动给运维人员发送告警邮件;企业内部系统中,审批事项的邮件提醒等场景。以下实现了java语言中,发送邮件的功能。

一、准备工作

  1. 确保使用的邮箱已开启SMTP服务(通常在邮箱设置中开启)

    本文以qq邮箱为例,进入邮箱首页,找到账号。
    在这里插入图片描述

  2. 找到POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务并开启服务

    如果服务已经开启可以点击管理服务,进入管理界面。

在这里插入图片描述

  1. 生成授权码

    在管理界面安全设置中,生成授权码,授权码将会配置在程序中使用。

    在这里插入图片描述

    注意:授权码不是登录密码


二、使用javax.mail

JavaMail是Sun公司推出的Java 中用于处理电子邮件的编程接口,属于独立发布的API。它提供了发送、接收和读取电子邮件的功能。

  1. 常见邮箱服务器配置
  • QQ邮箱
String host = "smtp.qq.com";
String port = "465"; // 或 "587"
  • 163邮箱
String host = "smtp.163.com";
String port = "465"; // 或 "587"
  • Gmail
String host = "smtp.gmail.com";
String port = "465";
// 注意:Gmail需要开启"低安全性应用访问"
  • Outlook
String host = "smtp.office365.com";
String port = "587";
  1. 添加依赖
<dependency>
    <groupId>com.sun.mail</groupId>
    <artifactId>javax.mail</artifactId>
    <version>1.6.2</version>
</dependency>
  1. 发送HTML格式邮件

    要发送HTML格式的邮件,修改邮件创建部分:

    // 创建HTML格式邮件
    MimeMessage message = new MimeMessage(session);
    message.setFrom(new InternetAddress(username));
    message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
    message.setSubject(subject);
    
    // 设置HTML内容
    String htmlContent = "<h1>HTML格式邮件</h1>"
                       + "<p>这是一封<strong>HTML格式</strong>的测试邮件</p>"
                       + "<p>发送时间: " + new java.util.Date() + "</p>"
                       + "<p><a href='https://www.example.com'>访问示例网站</a></p>";
    message.setContent(htmlContent, "text/html; charset=utf-8");
    
  2. 发送带附件的邮件

    // 创建多部分消息
    Multipart multipart = new MimeMultipart();
    
    // 添加文本部分
    MimeBodyPart textPart = new MimeBodyPart();
    textPart.setText(body);
    multipart.addBodyPart(textPart);
    
    // 添加附件
    MimeBodyPart attachmentPart = new MimeBodyPart();
    String filePath = "path/to/your/file.pdf";
    DataSource source = new FileDataSource(filePath);
    attachmentPart.setDataHandler(new DataHandler(source));
    attachmentPart.setFileName("附件.pdf");
    multipart.addBodyPart(attachmentPart);
    
    // 设置消息内容
    message.setContent(multipart);
    
  3. 异常处理

    程序可能抛出以下异常:

    • AuthenticationFailedException:认证失败,检查邮箱和授权码
    • MessagingException:邮件发送过程中的其他错误
    • AddressException:邮箱地址格式错误

    建议在实际应用中加入完善的异常处理机制。

  4. 完整示例(带HTML和附件)

    public static void main(String[] args) {
            // 配置邮件服务器信息
            String host = "smtp.qq.com"; // SMTP服务器地址
            String port = "465"; // SMTP端口
            String username = "your_email@qq.com"; // 发件人邮箱
            String password = "your_authorization_code"; // 邮箱授权码(不是登录密码)
    
            // 邮件内容
            String to = "receive_email@qq.com"; // 收件人邮箱
            String subject = "Java邮件发送测试"; // 邮件主题
            // HTML格式邮件正文
            String body = "<html><body>"
                    + "<h1 style='color:blue'>Java邮件测试</h1>"
                    + "<p>这是一封包含<strong>HTML格式</strong>和<em>附件</em>的测试邮件</p>"
                    + "<p>发送时间: " + new java.util.Date() + "</p>"
                    + "</body></html>";
            // 附件路径
            String attachmentPath = "example.pdf";
    
            // 发送邮件
            try {
                sendEmail(host, port, username, password, to, subject, body, attachmentPath);
                System.out.println("邮件发送成功!");
            } catch (MessagingException e) {
                System.err.println("邮件发送失败: " + e.getMessage());
                e.printStackTrace();
            }
        }
    
        /**
         * 发送电子邮件
         *
         * @param host SMTP服务器地址
         * @param port SMTP端口
         * @param username 发件人邮箱
         * @param password 邮箱授权码
         * @param to 收件人邮箱
         * @param subject 邮件主题
         * @param body 邮件正文
         * @param attachmentPath 附件路径
         * @throws MessagingException 邮件发送异常
         */
        public static void sendEmail(String host, String port, String username,
                                     String password, String to, String subject,
                                     String body, String attachmentPath) throws MessagingException {
    
            // 1. 配置邮件服务器属性
            Properties props = new Properties();
            props.put("mail.smtp.auth", "true"); // 启用认证
            props.put("mail.smtp.starttls.enable", "true"); // 启用TLS加密
            props.put("mail.smtp.host", host); // SMTP服务器地址
            props.put("mail.smtp.port", port); // SMTP端口
    
            // 对于使用SSL的邮箱(如QQ邮箱)
            if ("465".equals(port)) {
                props.put("mail.smtp.socketFactory.port", port);
                props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
            }
    
            // 2. 创建Session会话
            Session session = Session.getInstance(props, new Authenticator() {
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication(username, password);
                }
            });
    
            // 3. 创建邮件消息
            Message message = new MimeMessage(session);
            message.setFrom(new InternetAddress(username)); // 设置发件人
            message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to)); // 设置收件人
            message.setSubject(subject); // 设置邮件主题
    //        message.setText(body); // 设置邮件正文
    
            // 创建多部分内容
            Multipart multipart = new MimeMultipart();
    
            // HTML正文部分
            MimeBodyPart htmlPart = new MimeBodyPart();
            htmlPart.setContent(body, "text/html; charset=utf-8");
            multipart.addBodyPart(htmlPart);
    
            // 附件部分
            if (attachmentPath != null && !attachmentPath.isEmpty()) {
                MimeBodyPart attachmentPart = new MimeBodyPart();
                DataSource source = new FileDataSource(attachmentPath);
                attachmentPart.setDataHandler(new DataHandler(source));
                attachmentPart.setFileName(source.getName());
                multipart.addBodyPart(attachmentPart);
            }
    
            // 设置消息内容
            message.setContent(multipart);
    
            // 4. 发送邮件
            Transport.send(message);
        }
    
  5. 登录收件人邮箱查看结果

    在这里插入图片描述

  6. 配置参数说明

参数说明示例值
hostSMTP服务器地址smtp.qq.com (QQ邮箱)
portSMTP端口465 (SSL加密) 或 587 (TLS加密)
username发件人邮箱your_email@qq.com
password邮箱授权码在邮箱设置中生成的授权码
to收件人邮箱recipient@example.com
subject邮件主题Java邮件发送测试
body邮件正文邮件内容文本

二、使用hutool工具包

Hutool是一个强大的Java工具包类库,封装了大量的Util工具类,使用hutool工具包,可以让我们用更少的代码,很轻松地实现邮件发送功能。

使用Hutool中的邮件发送功能,需要依赖于javax.mail包,Hutool对javax.mail包进行工具类化封装,使其变得更加简单,易于使用。

  1. 添加依赖
	<dependency>
      <groupId>com.sun.mail</groupId>
      <artifactId>javax.mail</artifactId>
      <version>1.6.2</version>
    </dependency>	
	<dependency>
      <groupId>cn.hutool</groupId>
      <artifactId>hutool-all</artifactId>
      <version>5.8.24</version>
    </dependency>
  1. 测试代码
public static void main(String[] args) {
    	// HTML格式邮件正文
        String htmlBody = "<html><body>"
                + "<h1 style='color:blue'>Java邮件测试</h1>"
                + "<p>这是一封包含<strong>HTML格式</strong>的测试邮件</p>"
                + "<p>发送时间: " + new java.util.Date() + "</p>"
                + "</body></html>";
        // 使用Hutool发送邮件
        MailAccount account = new MailAccount();
        account.setHost("smtp.qq.com");
        account.setPort(465);
        account.setUser("your_email@qq.com");
        account.setPass("your_authorization_code");
    	account.setFrom("your_email@qq.com");
        account.setSslEnable(true);
        String send = MailUtil.send(account, "receive_email@qq.com", "Java邮件测试", htmlBody, true, null);
    	
        System.out.println("sendEMail  result ========" + send);
}
  1. 执行结果

在这里插入图片描述

250SMTP(简单邮件传输协议) 中的状态码,表示**“请求的邮件操作已就绪”或“操作成功完成”**


常见问题解决

  1. 认证失败
    • 确保使用授权码而不是邮箱登录密码
    • 检查是否已开启邮箱的SMTP服务
    • 对于Gmail,需要开启"低安全性应用访问"
  2. 连接超时
    • 检查网络连接是否正常
    • 尝试更换端口(465或587)
    • 检查防火墙设置
  3. 附件大小限制
    • 大多数邮箱服务商有附件大小限制(通常25MB)
    • 大文件建议使用云存储服务
  4. 邮件被标记为垃圾邮件
    • 避免使用敏感词汇
    • 添加合适的邮件主题
    • 避免发送过多相似内容
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值