9

我正在尝试使用我的应用程序中使用 JavaMail 的 Exchange 身份验证来执行此操作。有人可以给我一个指导吗?身份验证后,我需要发送邮件,这是我使用 JavaMail 的主要原因。我发现的所有链接都讨论了这个问题,但我认为这一定是从 Java 中轻松完成的任务。提前致谢。

4

9 回答 9

7

这是个好问题!我已经解决了这个问题。

首先,您应该导入 jar ews-java-api-2.0.jar。如果您使用 maven,您可以将以下代码添加到您的pom.xml

<dependency>
  <groupId>com.microsoft.ews-java-api</groupId>
  <artifactId>ews-java-api</artifactId>
  <version>2.0</version>
</dependency>

其次,你应该新建一个名为MailUtil.java.Some Exchange Servers 的 java 类默认不启动SMTP服务,所以我们使用Microsoft Exchange WebServices(EWS)代替SMTP服务。

MailUtil.java

package com.spacex.util;


import microsoft.exchange.webservices.data.core.ExchangeService;
import microsoft.exchange.webservices.data.core.enumeration.misc.ExchangeVersion;
import microsoft.exchange.webservices.data.core.service.item.EmailMessage;
import microsoft.exchange.webservices.data.credential.ExchangeCredentials;
import microsoft.exchange.webservices.data.credential.WebCredentials;
import microsoft.exchange.webservices.data.property.complex.MessageBody;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.net.URI;

/**
 * Exchange send email util
 *
 * @author vino.dang
 * @create 2017/01/08
 */
public class MailUtil {

    private static Logger logger = LoggerFactory.getLogger(MailUtil.class);



    /**
     * send emial
     * @return
     */
    public static boolean sendEmail() {

        Boolean flag = false;
        try {
            ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010_SP1); // your server version
            ExchangeCredentials credentials = new WebCredentials("vino", "abcd123", "spacex"); // change them to your email username, password, email domain
            service.setCredentials(credentials);
            service.setUrl(new URI("https://outlook.spacex.com/EWS/Exchange.asmx")); //outlook.spacex.com change it to your email server address
            EmailMessage msg = new EmailMessage(service);
            msg.setSubject("This is a test!!!"); //email subject
            msg.setBody(MessageBody.getMessageBodyFromText("This is a test!!! pls ignore it!")); //email body
            msg.getToRecipients().add("123@hotmail.com"); //email receiver
//        msg.getCcRecipients().add("test2@test.com"); // email cc recipients
//        msg.getAttachments().addFileAttachment("D:\\Downloads\\EWSJavaAPI_1.2\\EWSJavaAPI_1.2\\Getting started with EWS Java API.RTF"); // email attachment
            msg.send(); //send email
            flag = true;
        } catch (Exception e) {
            e.printStackTrace();
        }

        return flag;

    }


    public static void main(String[] args) {

        sendEmail();

    }
}

如果您想了解更多详细信息,请参阅https://github.com/OfficeDev/ews-java-api/wiki/Getting-Started-Guide

于 2017-01-08T03:28:39.763 回答
6

身份验证后我需要发送邮件

下面的示例适用于 Exchange 服务器:

Properties properties = new Properties();
properties.put("mail.transport.protocol", "smtp");
properties.put("mail.smtp.host", "mail.example.com");
properties.put("mail.smtp.port", "2525");
properties.put("mail.smtp.auth", "true");

final String username = "username";
final String password = "password";
Authenticator authenticator = new Authenticator() {
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(username, password);
    }
};

Transport transport = null;

try {
    Session session = Session.getDefaultInstance(properties, authenticator);
    MimeMessage mimeMessage = createMimeMessage(session, mimeMessageData);
    transport = session.getTransport();
    transport.connect(username, password);
    transport.sendMessage(mimeMessage, mimeMessage.getAllRecipients());
} finally {
    if (transport != null) try { transport.close(); } catch (MessagingException logOrIgnore) {}
}
于 2009-11-11T12:30:27.290 回答
3

为我工作:

Properties props = System.getProperties();
// Session configuration is done using properties. In this case, the IMAP port. All the rest are using defaults
props.setProperty("mail.imap.port", "993");
// creating the session to the mail server
Session session = Session.getInstance(props, null);
// Store is JavaMails name for the entity holding the mails
Store store = session.getStore("imaps");
// accessing the mail server using the domain user and password
store.connect(host, user, password);
// retrieving the inbox folder
Folder inbox = store.getFolder("INBOX");

这段代码是基于java邮件下载的示例代码。

于 2009-11-11T11:43:06.180 回答
3

微软发布了用于连接 Exchange Web 服务的开源 API

https://github.com/OfficeDev/ews-java-api

于 2015-02-03T22:27:24.887 回答
1

Exchange 默认不启动SMTP服务,所以我们不能SMTP protocol用来连接到 Exchange 服务器并尝试发送电子邮件。BalusC 可以很好地处理上述代码,因为您的邮件服务器管理员在 Exchange 上启用了 SMTP 服务。而在大多数情况下 SMTP 被禁用。我也在寻找解决方案。

是我找到的最好的答案,但令人沮丧的是,您必须在 60 天后付款。

于 2010-07-10T08:12:24.193 回答
0

某些 Exchange 服务器未启用 smtp 协议。
在这些情况下,您可以使用DavMail

于 2012-09-27T23:53:50.357 回答
0

上面建议的包基本上是在生命的尽头。

来自https://github.com/OfficeDev/ews-java-api

从 2018 年 7 月 19 日开始,Exchange Web 服务 (EWS) 将不再接收功能更新。虽然该服务将继续接收安全更新和某些非安全更新,但产品设计和功能将保持不变。此更改也适用于 Java 和 .NET 的 EWS SDK。更多信息在这里:https ://developer.microsoft.com/en-us/graph/blogs/upcoming-changes-to-exchange-web-services-ews-api-for-office-365/

于 2020-10-20T17:23:51.300 回答
0

解决了

只需将以下内容添加到您的 pom.xml 依赖项中

    <dependency>
        <groupId>javax.xml.ws</groupId>
        <artifactId>jaxws-api</artifactId>
        <version>2.3.1</version>
    </dependency>

JAVA 11+ 中似乎缺少 jaxws-api

于 2021-03-14T09:20:22.723 回答
0

正如 Populus 在之前的评论中提到的,尝试了 ews-java-api。它是在带有 jdk1.6 的 Java SE 环境中完成的,它的工作原理就像一个魅力。
这些是我必须与我的示例相关联的库:

  • commons-cli-1.2.jar
  • commons-codec-1.10.jar
  • commons-lang3-3.1.jar
  • commons-logging-1.2.jar
  • ews-java-api-2.0.jar
  • httpclient-4.4.1.jar
  • httpcore-4.4.5.jar

希望能帮助到你。

于 2016-07-05T15:20:02.390 回答