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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过java api验证SMTP服务器身份验证(包括AUTH的Healthcheck)相关的知识,希望对你有一定的参考价值。

目标

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

我知道这is possible using Telnet

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

问题

是否可以通过使用证书进行身份验证而不通过使用简单的Java API向服务器发送诸如testmail之类的邮件来验证SMTP服务器是否(可能)接受我的请求?

还有另一个问题是,是否应该为MimeMessage使用会话,然后使用静态Transport#send方法发送这些会话。还是应该在获得实例的地方使用某些东西。我要实现的主要事情是在成功的情况下也从服务器检索返回码。

我也可以使用其他库。

作为参考,我正在准备会话和消息atm的一些代码。

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;
    

以及我随后如何发送邮件。

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);
    

答案

您无法确定服务器是否允许您在不实际发送邮件的情况下发送邮件。然后收件人也将很重要。

您可以使JavaMail成功抛出异常,该异常将包含返回码。将mail.smtp.reportsuccess会话属性设置为true。请参阅mail.smtp.reportsuccess示例程序。

如果已经有一个Transport对象,则可以很好地使用它而不是静态send方法。

以上是关于通过java api验证SMTP服务器身份验证(包括AUTH的Healthcheck)的主要内容,如果未能解决你的问题,请参考以下文章

SMTP 服务器需要安全连接或客户端未通过身份验证。服务器响应是:5.5.1 需要身份验证?

C# SMTP 无法在 Outlook.com 端口 587 上进行身份验证。“服务器响应为:5.7.1 客户端未通过身份验证”

SMTP 服务器需要安全连接或客户端未通过身份验证。

使用c#发送电子邮件SMTP服务器需要安全连接或客户端未通过身份验证[重复]

使用 SendGrid/Gmail 时 SMTP 身份验证失败

无法通过SMTP服务器以Java发送邮件