通过java api验证SMTP服务器身份验证(Healthcheck包括身份验证) 目标

通过java api验证SMTP服务器身份验证(Healthcheck包括身份验证) 目标,java,email,smtp,jakarta-mail,Java,Email,Smtp,Jakarta Mail,我想对SMTP服务器实施运行状况检查。此健康检查应包括身份验证,以便我不仅知道服务器是否可用,而且知道我是否能够使用给定的证书发送电子邮件 我理解这一点 如果可能的话,我想要更高层次的东西。目前我正在使用javax.mail.Session,javax.mail.Transport,等等 问题 是否可以通过使用证书进行身份验证来验证SMTP服务器是否(可能)接受我的请求,而不使用简单的JavaAPI向服务器发送类似testmail的内容 还有一个问题是,我是否应该使用会话来发送mimessage

我想对SMTP服务器实施运行状况检查。此健康检查应包括身份验证,以便我不仅知道服务器是否可用,而且知道我是否能够使用给定的证书发送电子邮件

我理解这一点

如果可能的话,我想要更高层次的东西。目前我正在使用
javax.mail.Session
javax.mail.Transport
,等等

问题 是否可以通过使用证书进行身份验证来验证SMTP服务器是否(可能)接受我的请求,而不使用简单的JavaAPI向服务器发送类似testmail的内容

还有一个问题是,我是否应该使用会话来发送mimessage,然后使用static Transport#send方法发送这些消息。或者我应该在有实例的地方使用一些东西。我想实现的主要事情是在成功的情况下也从服务器检索返回代码

我也可以使用不同的库

请参阅我如何准备会话和消息的一些代码

public class SmtpMailService {

    public Session prepareSession() {
        Properties properties = new Properties();
        properties.put("mail.smtp.host", host);
        properties.put("mail.smtp.port", port);
        return Session.getInstance(properties, null);
    }

    public List<MimeMessage> sendMessages(List<MimeMessage> messages) {
        Iterator<MimeMessage> m = messages.iterator();

        while (m.hasNext()) {
            MimeMessage currentMessage = m.next();
            try {
                Transport.send(currentMessage);
                m.remove();
            } catch (MessagingException e) {
                break;
            }
        }

        List<MimeMessage> mailsWithError = StreamUtils.asList(m);
        return mailsWithError;
    }
}
公共类SmtpMailService{
公开会议筹备会议(){
属性=新属性();
properties.put(“mail.smtp.host”,host);
properties.put(“mail.smtp.port”,port);
返回Session.getInstance(属性,null);
}
公共列表发送消息(列表消息){
迭代器m=messages.Iterator();
while(m.hasNext()){
mimessage currentMessage=m.next();
试一试{
传输。发送(currentMessage);
m、 删除();
}捕获(消息异常e){
打破
}
}
List mailsWithError=StreamUtils.asList(m);
退回邮件错误;
}
}
然后我如何发送邮件

public class SmtpMailSenderService {
    private SmtpMailService mailerService;

    public List<SmtpEmailNotificationRecipient> sendNotificationMails(final List<SmtpEmailNotificationRecipient> recipients,
            final SmtpMailTemplate templateId, final Map<String, String> templateValues) {

        // templating stuff

        final Session smtpSession = mailerService.prepareSession();
        final List<MimeMessage> messages = mailerService.prepareMessages(smtpSession, recipients, email);

        final List<MimeMessage> unsentMessages = mailerService.sendMessages(messages);

        return collectRemainingRecipients(unsentMessages);
    }
}
公共类SmtpMailSenderService{
专用SmtpMailService mailerService;
公共列表发送通知邮件(最终列表收件人,
最终SmtpMailTemplate templateId,最终映射templateValues){
//模板材料
最终会话smtpSession=mailerService.prepareSession();
最终列表消息=mailerService.prepareMessages(smtpSession、收件人、电子邮件);
最终列表unsentMessages=mailerService.sendMessages(消息);
返回collectRemainingRecipients(未发送的邮件);
}
}

您无法判断服务器是否允许您在不实际发送邮件的情况下发送邮件。然后接受者也会很重要

您可以让JavaMail在成功时抛出异常,异常将包括返回代码。将会话属性设置为true。请参阅示例程序

如果您已经有了一个传输对象,那么最好使用它而不是静态发送方法