JavaMail smtp properties (for STARTTLS)

2022-09-01 18:50:22

JavaMail 指定了一组属性,可以设置这些属性来配置 SMTP 连接。若要使用 STARTTLS,必须设置以下属性

mail.smtp.starttls.enable=true

在哪里指定使用 smtp 服务的用户名/密码?指定以下内容是否足够:

mail.smtp.user=me
mail.smtp.password=secret

或者我必须使用以下内容显式登录:

transport.connect(server, userName, password)

是的,我已经尝试过这样做,似乎有必要使用进行连接。但是,如果是,&pass属性的用途是什么?难道他们不足以使用smtp与?transport.connect(..)mail.smtp.userstarttls


答案 1

这是我的 sendEmail 方法,它使用 GMail smtp (JavaMail) 和 STARTTLS

public void sendEmail(String body, String subject, String recipient) throws MessagingException,
            UnsupportedEncodingException {
        Properties mailProps = new Properties();
        mailProps.put("mail.smtp.from", from);
        mailProps.put("mail.smtp.host", smtpHost);
        mailProps.put("mail.smtp.port", port);
        mailProps.put("mail.smtp.auth", true);
        mailProps.put("mail.smtp.socketFactory.port", port);
        mailProps.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        mailProps.put("mail.smtp.socketFactory.fallback", "false");
        mailProps.put("mail.smtp.starttls.enable", "true");

        Session mailSession = Session.getDefaultInstance(mailProps, new Authenticator() {

            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(login, password);
            }

        });

        MimeMessage message = new MimeMessage(mailSession);
        message.setFrom(new InternetAddress(from));
        String[] emails = { recipient };
        InternetAddress dests[] = new InternetAddress[emails.length];
        for (int i = 0; i < emails.length; i++) {
            dests[i] = new InternetAddress(emails[i].trim().toLowerCase());
        }
        message.setRecipients(Message.RecipientType.TO, dests);
        message.setSubject(subject, "UTF-8");
        Multipart mp = new MimeMultipart();
        MimeBodyPart mbp = new MimeBodyPart();
        mbp.setContent(body, "text/html;charset=utf-8");
        mp.addBodyPart(mbp);
        message.setContent(mp);
        message.setSentDate(new java.util.Date());

        Transport.send(message);
    }

答案 2

您必须子类身份验证器并为会话创建密码身份验证对象以及 env 属性才能登录

Session session = Session.getDefaultInstance(props, new javax.mail.Authenticator() {

    protected PasswordAuthentication getPasswordAuthentication() {
      return new PasswordAuthentication("user-name", "user-password");
    }
  });

用户名有时是某些服务器(如 gmail)的完整电子邮件 ID。希望这有帮助。


推荐