在Java中,使用JavaMail API发送邮件时,我们通常会关注邮件是否成功发送。然而,仅仅知道邮件是否发送成功可能并不足够。在实际应用中,我们可能需要知道邮件发送失败的具体原因,以便进行相应的错误处理。本文将详细介绍如何使用JavaMail API实现邮件发送成功和失败的回调功能。

1. 准备工作

在开始之前,请确保您已经完成了以下准备工作:

  • 安装JavaMail API库:您可以从JavaMail官方下载地址下载最新版本的JavaMail API库,并将其添加到项目的类路径中。
  • 配置邮件服务器:根据您使用的邮件服务器类型(如SMTP、IMAP等),配置相应的服务器地址、端口、用户名和密码等信息。

2. 创建邮件发送类

首先,我们需要创建一个邮件发送类,该类负责发送邮件,并实现成功和失败的回调功能。

import javax.mail.*;
import javax.mail.internet.*;
import java.util.Properties;

public class MailSender {
    private String smtpHost;
    private String smtpPort;
    private String username;
    private String password;
    private Session session;

    public MailSender(String smtpHost, String smtpPort, String username, String password) {
        this.smtpHost = smtpHost;
        this.smtpPort = smtpPort;
        this.username = username;
        this.password = password;
        Properties props = new Properties();
        props.put("mail.smtp.host", smtpHost);
        props.put("mail.smtp.port", smtpPort);
        props.put("mail.smtp.auth", "true");
        session = Session.getInstance(props, new javax.mail.Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(username, password);
            }
        });
    }

    public void sendMail(String from, String to, String subject, String content, final Callback callback) throws MessagingException {
        Message message = new MimeMessage(session);
        message.setFrom(new InternetAddress(from));
        message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
        message.setSubject(subject);
        message.setText(content);

        Transport.send(message, new TransportListener() {
            @Override
            public void messageDelivered(Message message) throws MessagingException {
                callback.onSuccess();
            }

            @Override
            public void messageNotDelivered(Message message) throws MessagingException {
                callback.onFailure(message);
            }
        });
    }

    public interface Callback {
        void onSuccess();
        void onFailure(Message message);
    }
}

3. 使用邮件发送类

接下来,我们可以使用MailSender类发送邮件,并实现成功和失败的回调功能。

public class Main {
    public static void main(String[] args) {
        MailSender mailSender = new MailSender("smtp.example.com", "587", "username@example.com", "password");

        try {
            mailSender.sendMail("username@example.com", "recipient@example.com", "Test Mail", "Hello, this is a test mail.", new MailSender.Callback() {
                @Override
                public void onSuccess() {
                    System.out.println("邮件发送成功!");
                }

                @Override
                public void onFailure(Message message) {
                    System.out.println("邮件发送失败:" + message.getContent());
                }
            });
        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }
}

4. 总结

本文详细介绍了如何使用JavaMail API实现邮件发送成功和失败的回调功能。通过实现Callback接口,我们可以自定义邮件发送成功和失败时的处理逻辑,从而更好地控制邮件发送过程。在实际应用中,您可以根据需要修改和扩展MailSender类,以满足不同的需求。