【问题标题】:Get id from just sended email从刚刚发送的电子邮件中获取 id
【发布时间】:2021-06-18 12:59:33
【问题描述】:

我尝试获取我刚刚通过Java EWS API 发送的电子邮件的 ID。 我的目标是在获得该 ID 后将其存储到数据库中。

这是我正在尝试的:

    try {
        String isiEmail     = generateIsiEmail(nmBank, jenis, tglAw, tglAk, produk);
        EmailMessage mail   = new EmailMessage(service);
        mail.setSubject(jdlEmail);
        mail.setBody(new MessageBody(isiEmail));

        //set to cc 
        mail.getToRecipients().add(new EmailAddress(from.replaceAll("\\s", "")));                   
        String[] too = to.split("\\;");
        for (int i = 0; i <too.length; i++) { 
            mail.getToRecipients().add(new EmailAddress(too[i].replaceAll("\\s", "")));                 
        }           
        String[] ccc = cc.split("\\;");
        for (int i = 0; i <ccc.length; i++) {
            mail.getCcRecipients().add(new EmailAddress(ccc[i].replaceAll("\\s", "")));
        }           
        mail.sendAndSaveCopy();
    } catch (ServiceLocalException e) {
        e.printStackTrace();
    } catch (Exception e) { 
        e.printStackTrace();
    }

感谢您的帮助。

【问题讨论】:

    标签: java exchangewebservices


    【解决方案1】:

    我自己解决了。 这一步我已经完成了。 我使用 ExtendedPropertyDefinition 参考本教程 https://docs.microsoft.com/en-us/previous-versions/office/developer/exchange-server-2010/dd633654(v%3dexchg.80) ,但我从 C# 修改为 java 编程语言,

    1. 设置 ExtendedPropertyDefinition 然后将 uuidToStr 保存到数据库

          UUID uuid = UUID.randomUUID();
          ExtendedPropertyDefinition epd = new ExtendedPropertyDefinition(uuid, "NamaId", MapiPropertyType.String);
          String uuidToStr = uuid.toString();
      
          String isiEmail     = generateIsiEmail(nmBank, jenis, tglAw, tglAk, produk);
          EmailMessage mail   = new EmailMessage(service);
          mail.setSubject(jdlEmail);
          mail.setBody(new MessageBody(isiEmail)); 
      
          //set to cc 
          mail.getToRecipients().add(new EmailAddress(from.replaceAll("\\s", "")));                   
          String[] too = to.split("\\;");
          for (int i = 0; i <too.length; i++){
              mail.getToRecipients().add(new EmailAddress(too[i].replaceAll("\\s", "")));                 
          }           
          String[] ccc = cc.split("\\;");
          for (int i = 0; i <ccc.length; i++){
              mail.getCcRecipients().add(new EmailAddress(ccc[i].replaceAll("\\s", "")));
          }           
          mail.setExtendedProperty(epd, "isiId"); 
          mail.sendAndSaveCopy();     
      
    2. 从数据库中获取基于 ExtendedPropertyDefinition uuidToStr 的邮件

          UUID uuid = UUID.fromString("cc59cdbf-aad4-4cd1-a4f0-e7819c56b884");
          ExtendedPropertyDefinition epd = new ExtendedPropertyDefinition(uuid, "NamaId", MapiPropertyType.String);
      
          ItemView view2 = new ItemView(3);
          SearchFilter sf = new SearchFilter.IsEqualTo(epd,"isiId");
          FindItemsResults<Item> fir = service.findItems(WellKnownFolderName.SentItems, sf, view2);
          for (Item itm : fir.getItems()){
              System.out.println(itm.getId());
              System.out.println(itm.getSubject());  
          }
      

    完成;

    【讨论】:

      【解决方案2】:

      您应该使用InternetMessageId 属性。

      调用FindItems 方法在已发送邮件文件夹中搜索邮件。然后实例化一个EmailMessage 对象,以便您可以访问InternetMessageId 属性:

      ItemView view = new ItemView(100); // You can change this to your needs.
      view.PropertySet = new PropertySet(BasePropertySet.IdOnly, EmailMessageSchema.InternetMessageId);
      FindItemsResults<Item> results = service.FindItems(WellKnownFolderName.SentItems, view);
      foreach (Item item in results)
      {
          if (item is EmailMessage)
          {
              EmailMessage emailMsg = item as EmailMessage;
              Console.WriteLine(emailMsg.InternetMessageId);
          }
      }
      

      【讨论】:

      • 没错,你的方法是如何在发送邮件文件夹中查找邮件并获取它的属性。如果我无法从我刚刚发送的电子邮件中获取 ID,我会使用它。但我的问题是,可以从我刚刚发送的电子邮件中获取 ID(发送后抓取它的 ID / 发送后抓取)。
      • 对不起,也许我误解了你,但我很确定我发布的答案符合你的要求。当您调用SendAndSaveCopy() 方法时,电子邮件的副本会保存到已发送邮件文件夹中。
      • 在 EWS 中,当您发送消息时它是异步的,这就是为什么在发送操作中不返回 ID,因为它不可用。所以上面的答案是最好的方法。
      • @MadDev 是的,你的答案是对的,错过了关于 EWS 异步运行的解释,就像 Glen Scales 所说的那样。感谢 Glen Scales 和 ManDev
      【解决方案3】:

      我正在使用C# EWS Api,但是这个逻辑对你有用。 首先,您必须将电子邮件保存在草稿中,然后才能获取电子邮件 ID

      EmailMessage emailMessage = new EmailMessage(service);
      emailMessage.From = email.From;
      emailMessage.Subject = email.Subject;
      emailMessage.Body = new MessageBody(BodyType.HTML, email.Body);
      
      foreach (var toAddress in email.To)
      {
        emailMessage.ToRecipients.Add(toAddress);
      }
      
      // Send message and save copy by default to sentItems folder
      emailMessage.Save();
      emailMessage.Load();
      
      // Get Email Conversation Id.
      string ConversationId = emailMessage.ConversationId.UniqueId;
      string EmailMessageId;
      
      emailMessage.SendAndSaveCopy();
      
      
      // Get Email Message Id by InternetMessageId.
      List<SearchFilter> searchFilterCollection = new List<SearchFilter>();
                  searchFilterCollection.Add(new SearchFilter.ContainsSubstring(EmailMessageSchema.InternetMessageId, InternetMessageId));
      
      // Create the search filter.
      SearchFilter searchFilter = new SearchFilter.SearchFilterCollection(LogicalOperator.Or, searchFilterCollection.ToArray());
      
      ItemView view = new ItemView(50);
      view.PropertySet = new PropertySet(BasePropertySet.IdOnly, EmailMessageSchema.InternetMessageId);
                  FindItemsResults<Item> results = service.FindItems(WellKnownFolderName.SentItems, searchFilter, view);
      
                  
      if (results.Items.Count > 0)
      {
       Item item = results.Items[0];
       EmailMessage message = EmailMessage.Bind(service, item.Id);
      
       EmailMessageId = message.Id.UniqueId;
      }
      

      【讨论】:

        【解决方案4】:

        我相信解决方案是这样的:

        EmailMessage em = EmailMessage.bind( service, item.getId(),
                           new PropertySet( EmailMessageSchema.InternetMessageId) );
        

        解释:

        我们必须将项目绑定到电子邮件消息,但不是获取所有信息,而是仅通过 PropertySet 参数询问 ID 和我们想要的任何其他属性。

        找到 -> Exchange Web Services get Message Message-ID

        【讨论】:

        • 让我先试试
        • 我认为您的答案是当我们知道 ID 时如何从电子邮件中获取任何其他属性。但我的问题是我如何从我刚刚发送的电子邮件中获取 ID(在发送并获取它的 ID 之后)
        猜你喜欢
        • 1970-01-01
        • 2014-08-23
        • 2015-08-14
        • 2014-04-19
        • 1970-01-01
        • 1970-01-01
        • 2011-02-23
        • 1970-01-01
        • 2018-05-14
        相关资源
        最近更新 更多