想要使用微软的exchange协议,撤回发送的邮件
请教下,用java怎么写?
请教下代码示例
12条回答 默认 最新
- 这一次有糖 2023-07-31 01:53关注
获得1.80元问题酬金 解决 1无用
关注
获得2.40元问题酬金 不知道你这个问题是否已经解决, 如果还没有解决的话:- 这篇博客: 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协议发送邮件中的 代码 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
- 阳光宅男xxb 2023-08-07 03:24关注
获得1.80元问题酬金 解决 无用评论 打赏 举报 - GIS工具开发 2023-08-07 06:56关注
获得1.20元问题酬金 解决 无用评论 打赏 举报 - 一起看海呦 2023-07-31 01:44关注解决评论 打赏 举报 编辑记录无用 1
关注
撤回邮件可以使用 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 客户端并且配置了自动处理规则,则可能无法撤回邮件。
解决评论 打赏 举报无用 1- 大同大 2023-08-07 03:57关注
要使用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服务器支持此功能。
解决评论 打赏 举报无用 1 - Minuw 2023-08-07 15:53关注
参考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的官方网站下载并添加相关的库文件。
希望这能帮助到你!如有任何进一步的问题,请随时提问。
解决评论 打赏 举报无用 1 - CF2301_77400554X 2023-07-31 01:50关注
采用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服务器的配置和权限的限制,而且并不总是可行的。因此,在实际应用中,你可能需要处理更多的错误情况和异常情况。
解决评论 打赏 举报无用 2在EWS Java API中,确实没有提供recall()方法来撤回邮件。感谢你指出这一点。
如果你想在Java中实现撤回邮件功能,可以考虑使用其他方法,例如利用EWS API发送撤回邮件的请求。以下是一个修改后的示例代码:
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); // Create a Recall request RecallRequest recallRequest = new RecallRequest(ConflictResolutionMode.AlwaysOverwrite, MessageDisposition.SaveOnly); RecallResponse recallResponse = (RecallResponse) emailToRecall.getService().internalCreateResponseObject(recallRequest, emailToRecall.getId(), null); recallResponse.send(); if (recallResponse.getOverallResult() == ServiceResult.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(); } } }
在上述代码中,我们使用了EWS API中的RecallRequest和RecallResponse类来发送撤回邮件的请求。这样,我们可以模拟在Outlook中点击"撤回"按钮的操作,但是仍然需要在Outlook客户端中完成撤回的实际动作。
请注意,这种方法依赖于Outlook客户端的操作,因此只有在Outlook客户端已经设置好的情况下才能成功撤回邮件。在某些情况下,撤回邮件可能会失败或被拒绝,具体取决于Outlook客户端的配置和服务器设置。
如果你希望实现更复杂的撤回功能,可以考虑使用Outlook插件或其他客户端应用程序,这样可以更直接地与Outlook进行交互。但是,使用插件可能涉及更复杂的开发和部署过程。
赞回复 - yy64ll826 2023-07-31 09:07关注
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) { // 撤回邮件的操作 // 删除收件人的收件箱中的该邮件 // 发送一封新的邮件给收件人,提醒其删除之前发送的邮件 }
解决评论 打赏 举报无用 2 - 大黄鸭duck. 2023-07-31 13:21关注
Exchange协议是一种用于Microsoft Exchange Server和Office 365等Microsoft产品的协议。它允许用户使用代码管理邮件、联系人和日历等。在本文中,我们将讨论如何使用Exchange协议在Java中实现撤回已发送的邮件功能。
- 配置Exchange环境
在开始之前,我们需要设置一个Exchange环境。我们需要一个Exchange Server并创建一个邮箱用于测试撤回功能。我们还需要使用管理员账号获取访问Exchange Server的权限。
- 添加Maven依赖项
使用Maven可以方便地管理我们的Java应用程序的第三方库。我们需要添加以下Maven依赖项到我们的pom.xml文件中:
<dependency> <groupId>com.microsoft</groupId> <artifactId>exchange-web-services</artifactId> <version>2.0</version> </dependency>
- 实现撤回邮件功能
下面是一个示例代码,用于演示如何使用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()方法删除原邮件。
需要注意的是,撤回邮件可能会失败或被接收者在读取之前已删除。在这种情况下,我们需要根据邮件回执来确定撤回的成功情况。
- 总结
本文演示了如何使用Exchange协议在Java中实现撤回已发送的邮件功能。我们首先在Exchange Server中设置了一个测试环境,并使用Maven添加了exchange-web-services库的依赖项。我们然后演示了如何使用ExchangeService、EmailMessage等类实现邮件撤回功能。我们希望这篇文章对您有所帮助。
解决评论 打赏 举报无用 2 - 妖王辣妹儿 2023-07-31 01:46关注
该回答引用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等信息。
解决评论 打赏 举报无用 3