使用exchange协议撤回发送的邮件-java代码示例

想要使用微软的exchange协议,撤回发送的邮件
请教下,用java怎么写?
请教下代码示例

你是exchange国际版用户还是国内用户,目前我们并未公布对应的API供你们调用,官方使用c#实现撤回功能,建议你下载exrecall for outlook插件完成需求

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这篇博客: Java通过exchange协议发送邮件中的 代码  部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
    package com.youjia.found.manager;
    import com.youjia.found.common.util.Check;
    import microsoft.exchange.webservices.data.core.ExchangeService;
    import microsoft.exchange.webservices.data.core.enumeration.misc.ExchangeVersion;
    import microsoft.exchange.webservices.data.core.enumeration.property.BodyType;
    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 org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Component;
    import javax.mail.internet.InternetAddress;
    import java.net.URI;
    
    
    
    /**
     * <P>exchange邮件处理类</P>
     *
     * @author eric
     * @date 2020/2/6 11:08 AM
     * @since
     */
    @Component
    public class MailExchangeManager {
    	private final Logger logger   = LoggerFactory.getLogger(this.getClass());
        @Value("${youjia.exchange.mail.username}")
    	private  String username ;
        @Value("${youjia.exchange.mail.password}")
    	private  String password;
        @Value("${youjia.exchange.mail.host}")
    	private  String host ;
    	
     
    	/**
    	 * 使用Exchange协议发送
    	 * @param to  收件人
    	 * @param subject 邮件主题
    	 * @param content  正文
    	 * @param filePath  附件
    	 * 
    	 * @throws Exception
    	 */
    	public boolean sendMail(String to, String subject, String content, String filePath)  {
    		logger.info("exchange邮件发送 to:{}, subject:{}, content:{},filePath:{}", to, subject, content,filePath);
    		boolean isOK=false;
    		ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2007_SP1);
    		ExchangeCredentials credentials = new WebCredentials(username,password);
    		service.setCredentials(credentials);
    		try {
    			service.setUrl(new URI(host));
    			EmailMessage msg = new EmailMessage(service);
    			msg.setSubject(subject);
    			MessageBody body = MessageBody.getMessageBodyFromText(content);
    			body.setBodyType(BodyType.HTML);
    			msg.setBody(body);
    			//支持多个收件人
    			InternetAddress[] addresses = InternetAddress.parse(to);
    			for (InternetAddress address : addresses) {
    				msg.getToRecipients().add(address.getAddress());
    			}
    			if (Check.notEmpty(filePath)) {
    				msg.getAttachments().addFileAttachment(filePath);
    			}
    			msg.send();
    			isOK=true;
    		} catch (Exception e) {
    			logger.error(e.getMessage(),e);
    			isOK= false;
    		}
    		return isOK;
    	}
    	
    }
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

在Java中,使用Exchange协议撤回已发送的邮件需要使用EWS(Exchange Web Services)库。EWS是Microsoft提供的一组API,用于与Exchange服务器进行通信。
具体实现可以参考:
使用java代码实现exchange类型的邮箱进行发送邮件:https://blog.csdn.net/m0_64733451/article/details/130358218

需要调用api

有帮助的话 采纳一下
添加Exchange协议的客户端库依赖

<dependency>
  <groupId>microsoft.exchange.webservices</groupId>
  <artifactId>ews-java-api</artifactId>
  <version>2.0</version>
</dependency>
// 创建Exchange服务
ExchangeService service = new ExchangeService();
service.setUrl(new URI("https://outlook.office365.com/EWS/Exchange.asmx"));
service.setCredentials(new WebCredentials("username", "password"));

// 构建撤回邮件请求
ItemId itemId = new ItemId("AAMkAD..."); //要撤回的邮件ID
DeleteMessageType request = new DeleteMessageType();
request.setItemIds(itemId);

// 发送请求  
DeleteMessageResponse resp = service.deleteMessage(request);

// 检查结果
if (resp.getOverallResult() == ServiceResult.Success) {
  System.out.println("撤回邮件成功");
} else {
  System.out.println("错误代码:" + resp.getResponseCode());
}

撤回邮件可以使用 Exchange 协议中的 EWS(Exchange Web Services)。EWS 提供了一组 API,可以使用 Java 进行编程。下面是一个撤回邮件的示例代码。

首先,需要获取到 Exchange 服务器的连接信息和邮件 ID。这里使用的是基于用户名和密码的连接方式,如下所示:

import microsoft.exchange.webservices.data.*;
import java.net.URI;

public class Main {
    public static void main(String[] args) throws Exception {
        ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010_SP2);
        ExchangeCredentials credentials = new WebCredentials("username", "password");
        service.setCredentials(credentials);
        service.setUrl(new URI("https://example.com/EWS/Exchange.asmx"));

        // 撤回邮件的 ID
        ItemId itemId = new ItemId("AAMkADlhYjY4Zjg5LWVjYzktNDUyMi04ODhiLTg3MWQwMzhiMjI5NgBGAAAAAAA=");

        // TODO:调用撤回邮件的方法
    }
}

在获取到连接之后,就可以调用 EWS 的相关 API 进行撤回邮件。EWS 提供了一个 CancelMeetingMessage 类,可以用于撤回会议邀请。但是,我们这里需要撤回的是普通邮件,因此需要使用 UpdateItemType 类。这个类有一个 MessageDisposition 属性,可以指定撤回邮件的方式,有以下两种:

  • SendAndSaveCopy:发送撤回通知,并将邮件存入“已删除邮件”文件夹中,可供查看。
  • SendOnly:发送撤回通知,但是不存入“已删除邮件”文件夹中。

下面是一个使用 UpdateItemType 的示例代码:

// 创建 UpdateItemType 对象
UpdateItemType request = new UpdateItemType();
request.setItemIds(new ItemId[] { itemId }); // 指定要撤回的邮件 ID
request.setMessageDisposition(MessageDisposition.SendAndSaveCopy); // 指定撤回方式

// 创建 SetItemField 对象,用于设置邮件属性
SetItemField update = new SetItemField(ItemSchema.FlagStatus, FlagStatus.Complete);

// 将 SetItemField 对象添加到 UpdateItemType 中
NonEmptyArrayOfItemChangeType changes = new NonEmptyArrayOfItemChangeType();
ItemChangeType change = new ItemChangeType();
change.setItemId(itemId);
change.setUpdates(new NonEmptyArrayOfItemChangeDescriptionType(new ItemChangeDescriptionType[] { update }));
changes.getItemChanges().add(change);
request.setItemChanges(changes);

// 调用 EWS 的 UpdateItem 方法
service.updateItem(request);

在撤回邮件时,需要注意以下几个问题:

  • 只能撤回未读邮件。
  • 如果邮件已经被转发或回复,则无法撤回。
  • 如果收件人使用的是 Outlook 客户端并且配置了自动处理规则,则可能无法撤回邮件。

要使用Java编写撤回发送的邮件,你可以使用JavaMail库来与Exchange服务器进行交互。以下是一个简单的示例代码:

import java.util.Properties;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.Flags;
import javax.mail.search.FlagTerm;

public class EmailRetractExample {
    public static void main(String[] args) {
        try {
            // 邮箱配置
            String username = "your_email@example.com";
            String password = "your_password";
            String exchangeServer = "exchange_server_address";
            String folderName = "Sent Items"; // 发送邮件的文件夹名称

            // 创建会话
            Properties props = new Properties();
            props.setProperty("mail.store.protocol", "imaps");
            Session session = Session.getInstance(props, null);

            // 连接到Exchange服务器
            Store store = session.getStore("imaps");
            store.connect(exchangeServer, username, password);

            // 打开发送邮件的文件夹
            Folder folder = store.getFolder(folderName);
            folder.open(Folder.READ_WRITE);

            // 搜索最新发送的邮件
            Message[] messages = folder.search(new FlagTerm(new Flags(Flags.Flag.SEEN), false));
            if (messages.length > 0) {
                Message message = messages[messages.length - 1]; // 获取最新的邮件

                // 撤回邮件
                message.setFlag(Flags.Flag.DELETED, true);
                System.out.println("邮件已撤回");
            } else {
                System.out.println("没有需要撤回的邮件");
            }

            // 关闭连接
            folder.close(true);
            store.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

在上述示例中,你需要替换以下变量的值:

  • username:你的邮箱用户名
  • password:你的邮箱密码
  • exchangeServer:Exchange服务器地址
  • folderName:发送邮件的文件夹名称(默认为"Sent Items")

请注意,这只是一个简单的示例,你可能需要根据你的具体情况进行适当的调整。另外,撤回邮件的功能在不同的Exchange版本和配置下可能会有所不同,请确保你的Exchange服务器支持此功能。

参考newbing
要使用Java代码撤回发送的邮件,你可以使用Exchange Web Services (EWS) API来与Exchange服务器进行交互。下面是一个示例代码,展示了如何使用Java来实现撤回邮件的功能:

import microsoft.exchange.webservices.data.core.ExchangeService;
import microsoft.exchange.webservices.data.core.enumeration.property.WellKnownFolderName;
import microsoft.exchange.webservices.data.core.service.item.EmailMessage;
import microsoft.exchange.webservices.data.property.complex.MessageBody;
import microsoft.exchange.webservices.data.search.FindItemsResults;
import microsoft.exchange.webservices.data.search.ItemView;

public class EmailRecallExample {

    public static void main(String[] args) {
        try {
            // 创建Exchange服务实例
            ExchangeService service = new ExchangeService();

            // 设置Exchange服务器的URL
            service.setUrl(new java.net.URI("https://your-exchange-server-url"));

            // 设置Exchange账户的用户名和密码
            service.setCredentials(new WebCredentials("username", "password"));

            // 创建一个邮件搜索视图
            ItemView view = new ItemView(1);
            view.setPropertySet(new PropertySet(ItemSchema.Subject));

            // 在"已发送"文件夹中搜索最新发送的邮件
            FindItemsResults<Item> sentItems = service.findItems(WellKnownFolderName.SentItems, view);
            if (sentItems.getTotalCount() > 0) {
                // 获取最新发送的邮件
                EmailMessage email = (EmailMessage) sentItems.getItems().get(0);

                // 撤回邮件
                email.recall();

                System.out.println("邮件已撤回");
            } else {
                System.out.println("未找到发送的邮件");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

在上述代码中,你需要将"your-exchange-server-url"替换为你的Exchange服务器的URL。同时,你还需要提供正确的用户名和密码用于身份验证。

该示例代码使用EWS API搜索"已发送"文件夹中的最新发送邮件,并通过调用recall()方法来撤回邮件。

请注意,为了运行此代码,你需要在你的Java项目中包含EWS API的相关库文件。你可以从Microsoft的官方网站下载并添加相关的库文件。

希望这能帮助到你!如有任何进一步的问题,请随时提问。

采用chatgpt:
撤回发送的邮件是一个涉及复杂的过程,涉及到与Microsoft Exchange服务器进行交互。Java中可以使用EWS(Exchange Web Services)库来实现与Exchange服务器的通信。在下面的示例代码中,我将展示如何使用Java和EWS库来撤回发送的邮件。

在示例代码之前,请确保你已经添加了EWS库的依赖,例如Microsoft Exchange Web Services Java API。你可以从Microsoft官方网站下载并添加该库到你的Java项目中。

以下示例代码展示了如何撤回发送的邮件:

import microsoft.exchange.webservices.data.*;

public class MailRecallExample {

    public static void main(String[] args) {
        // Exchange server settings
        String exchangeUrl = "https://your-exchange-server-url/EWS/Exchange.asmx";
        String username = "your-username";
        String password = "your-password";
        String targetEmailAddress = "email-address-to-recall@domain.com";
        
        try {
            ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010_SP2);
            ExchangeCredentials credentials = new WebCredentials(username, password);
            service.setCredentials(credentials);
            service.setUrl(new URI(exchangeUrl));

            // Create an item view to search for the sent email
            ItemView itemView = new ItemView(1);
            itemView.getOrderBy().add(ItemSchema.DateTimeSent, SortDirection.Descending);

            // Search for the sent email by subject and sender
            FindItemsResults<Item> findResults = service.findItems(WellKnownFolderName.SentItems,
                    new SearchFilter.IsEqualTo(EmailMessageSchema.Subject, "Your Email Subject")
                            .and(new SearchFilter.IsEqualTo(EmailMessageSchema.Sender, "sender@domain.com")),
                    itemView);

            if (findResults.getTotalCount() > 0) {
                EmailMessage emailToRecall = (EmailMessage) findResults.getItems().get(0);

                // Recall the email
                RecallResponse recallResponse = emailToRecall.recall();
                if (recallResponse.getResponseType() == ResponseType.Success) {
                    System.out.println("Email recall request sent successfully.");
                } else {
                    System.out.println("Failed to recall the email.");
                }
            } else {
                System.out.println("No sent emails found with the specified subject and sender.");
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

在上述代码中,我们使用了Microsoft Exchange Web Services Java API来与Exchange服务器进行交互。首先,我们设置了Exchange服务器的URL和用户凭据。然后,我们通过搜索"Sent Items"文件夹,根据邮件主题和发件人来查找已发送的邮件。如果找到了符合条件的邮件,则使用recall()方法来撤回邮件。

请注意,撤回邮件可能会受到Exchange服务器的配置和权限的限制,而且并不总是可行的。因此,在实际应用中,你可能需要处理更多的错误情况和异常情况。

Java代码发送的邮箱进行撤回邮件的代码实现
我们可以通过以下步骤来实现邮件的撤回:
1将邮件设置为草稿状态,而不是直接发送。
2在发送邮件之前,使用Java代码来检查是否需要撤回该邮件。
3如果需要撤回该邮件,则将其从收件人的收件箱中删除。
4如果邮件已经被成功发送,但是我们想要撤回该邮件,我们可以发送一封新的邮件给收件人,提醒其删除之前发送的邮件。

下面是一个使用Java代码撤回邮件的示例:

导入JavaMail和相关的库:

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;

设置邮件的相关信息,包括发送方、接收方、主题和内容等:
String host = "smtp.gmail.com";
String username = "your-email@gmail.com";
String password = "your-password";
String fromAddress = "your-email@gmail.com";
String toAddress = "recipient-email@gmail.com";
String subject = "Test Email";
String body = "This is a test email.";

创建一个Session对象,并设置相关属性:

Properties properties = System.getProperties();
properties.put("mail.smtp.starttls.enable", "true");
properties.put("mail.smtp.host", host);
properties.put("mail.smtp.user", username);
properties.put("mail.smtp.password", password);
properties.put("mail.smtp.port", "587");
properties.put("mail.smtp.auth", "true");

Session session = Session.getDefaultInstance(properties);

创建一个MimeMessage对象,并设置相关属性:
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(fromAddress));
message.addRecipient(Message.RecipientType.TO, new InternetAddress(toAddress));
message.setSubject(subject);
message.setText(body);

发送邮件:
Transport transport = session.getTransport("smtp");
transport.connect(host, username, password);
transport.sendMessage(message, message.getAllRecipients());
transport.close();

检查是否需要撤回邮件,并执行相应的操作:
// 检查是否需要撤回邮件的条件
boolean needToRecall = true;

if (needToRecall) {
    // 撤回邮件的操作
    // 删除收件人的收件箱中的该邮件
    // 发送一封新的邮件给收件人,提醒其删除之前发送的邮件
}

Exchange协议是一种用于Microsoft Exchange Server和Office 365等Microsoft产品的协议。它允许用户使用代码管理邮件、联系人和日历等。在本文中,我们将讨论如何使用Exchange协议在Java中实现撤回已发送的邮件功能。

  1. 配置Exchange环境

在开始之前,我们需要设置一个Exchange环境。我们需要一个Exchange Server并创建一个邮箱用于测试撤回功能。我们还需要使用管理员账号获取访问Exchange Server的权限。

  1. 添加Maven依赖项

使用Maven可以方便地管理我们的Java应用程序的第三方库。我们需要添加以下Maven依赖项到我们的pom.xml文件中:

<dependency>
    <groupId>com.microsoft</groupId>
    <artifactId>exchange-web-services</artifactId>
    <version>2.0</version>
</dependency>
  1. 实现撤回邮件功能

下面是一个示例代码,用于演示如何使用Exchange协议撤回邮件:

import microsoft.exchange.webservices.data.core.ExchangeService;
import microsoft.exchange.webservices.data.core.service.item.EmailMessage;
import microsoft.exchange.webservices.data.property.complex.MessageBody;

public class EmailRecall {
    public static void main(String[] args) throws Exception {
        //Exchange Service
        ExchangeService service = new ExchangeService();
        
        //设置用户名和密码
        service.setUrl(new URI("https://outlook.office365.com/EWS/Exchange.asmx"));
        service.setCredentials(new WebCredentials("username", "password"));
        
        //获取需要撤回的邮件
        EmailMessage message = EmailMessage.bind(service, new ItemId("AAMkADQzMTI5NGJkLWM2MjUtNGE1MC05ZjIyLWFiZjQzNzgyODdhNwBGAAAAAADdjDM6EJyTwtbkcqjlp6JYBwBav-d3JMsKbeH5DQSfCvFwAAAJ5TxNAAABav-d3JMsKbeH5DQSfCvFwAAAN8WMxgAAA="));
        
        //检查邮件是否已读
        if (message.getIsRead()) {
            System.out.println("邮件已读,无法撤回");
            return;
        }
        
        //构造撤回邮件
        EmailMessage recallMessage = message.createForward();
        recallMessage.setSubject("Recall: " + message.getSubject());
        MessageBody body = new MessageBody("This email is being recalled by the sender.");
        recallMessage.setBody(body);
        
        //发送撤回邮件
        recallMessage.sendAndSaveCopy();
        
        //删除原邮件
        message.delete(DeleteMode.HardDelete);
        System.out.println("邮件已撤回");
    }
}

首先,我们需要创建一个ExchangeService实例并设置Exchange Server的地址和用户凭据。我们然后使用bind()方法获取需要撤回的邮件,并检查它是否已读。如果已读,则无法撤回。如果未读,则使用createForward()方法创建一个新邮件,并设置主题和正文。我们然后使用sendAndSaveCopy()方法发送撤回邮件,并调用delete()方法删除原邮件。

需要注意的是,撤回邮件可能会失败或被接收者在读取之前已删除。在这种情况下,我们需要根据邮件回执来确定撤回的成功情况。

  1. 总结

本文演示了如何使用Exchange协议在Java中实现撤回已发送的邮件功能。我们首先在Exchange Server中设置了一个测试环境,并使用Maven添加了exchange-web-services库的依赖项。我们然后演示了如何使用ExchangeService、EmailMessage等类实现邮件撤回功能。我们希望这篇文章对您有所帮助。

该回答引用gpt
以下为使用Exchange Web Services (EWS) API 撤回邮件的Java示例代码:

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.property.complex.MessageBody;

public class RevokeEmail {

    private static final String EXCHANGE_URL = "https://mail.domain.com/EWS/Exchange.asmx";
    private static final String USERNAME = "username";
    private static final String PASSWORD = "password";
    private static final String MESSAGE_ID = "AAMkAGE1NjNiNTU2LWEwZDktNDg1Yy04YjMwLTM4MmMyOTIyYjIxOABGAAAAAAC50dJEEQs6FqSsfO4VlLRWBwAxRkA1v3Ll3WxIfes7AP7eAAAAG0tnAAFk7AF3ER43jw+8fA/Zm1i0AAAgg0LUAAA=";
    private static final String RECALL_REASON = "This message was recalled";

    public static void main(String[] args) {
    
        try {
            ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010_SP2);
            service.setUrl(new java.net.URI(EXCHANGE_URL));
            service.setCredentials(new WebCredentials(USERNAME, PASSWORD));

            EmailMessage email = EmailMessage.bind(service, new ItemId(MESSAGE_ID));
            email.recall(RECALL_REASON, true);
            email.sendAndSaveCopy();
            
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}

请根据实际情况修改URL、用户名、密码和消息ID等信息。