首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >STARTTLS属性(用于JavaMail )

STARTTLS属性(用于JavaMail )
EN

Stack Overflow用户
提问于 2011-04-08 15:52:55
回答 5查看 86.2K关注 0票数 25

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

代码语言:javascript
复制
mail.smtp.starttls.enable=true

在何处指定用户名/密码以使用smtp服务?是否可以指定:

代码语言:javascript
复制
mail.smtp.user=me
mail.smtp.password=secret

或者我必须显式登录使用:

代码语言:javascript
复制
transport.connect(server, userName, password)

是的,我已经尝试过了,似乎有必要使用transport.connect(..)进行连接。但是如果是,mail.smtp.user & pass属性是用来做什么的呢?它们还不足以将smtp与starttls一起使用吗?

EN

回答 5

Stack Overflow用户

发布于 2011-04-08 17:05:45

下面是我的sendEmail方法,它将GMail smtp (JavaMail)与STARTTLS结合使用

代码语言:javascript
复制
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);
    }
票数 27
EN

Stack Overflow用户

发布于 2011-04-08 16:12:51

您必须继承验证器的子类,并为会话和环境属性创建PasswordAuthentication对象才能登录

代码语言:javascript
复制
Session session = Session.getDefaultInstance(props, new javax.mail.Authenticator() {

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

对于某些服务器,例如gmail,user-name有时是完整的电子邮件id。希望这能有所帮助。

票数 5
EN

Stack Overflow用户

发布于 2012-06-06 08:24:55

您可以将用户指定为

代码语言:javascript
复制
mail.smtps.user=cayhorstmann@gmail.com

(如果不使用mail.transport.protocol=smtps,则为mail.smtp.user )。

AFAIK,你不能提供密码。但你当然可以把它放在道具里,然后自己找回它。或者以某种其他方式获得它,例如通过提示用户。

当您拥有它时,有两种方法可以将它提供给会话。更简单的方法是使用

代码语言:javascript
复制
Transport tr = session.getTransport();
tr.connect(null, password);
tr.sendMessage(message, message.getRecipients());

或者,正如所指出的,您可以使用验证器。但是,来自props的用户会被忽略,您必须显式地将其传递给PasswordAuthentication。如果你这样做了,那么你的奖励就是你可以使用静态Transport.send

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5592112

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档