C# 抑制Outlook字段打印

C# 抑制Outlook字段打印,c#,outlook,C#,Outlook,我们已经为Outlook编写了一个附加组件,将电子邮件归档到我们的CRM系统中。在此过程中,它将Outlook邮件ID保存为邮件本身的用户字段 例如 不幸的是,这是一个Huuugge数字,很像: “00000000 D502D779150E2F4580B1AADDF04ECDA6070097EF5A1237597748A4B4F9BFF54002080000006E9E4000068BB5B6DFC36924FAEC709A17D056583000002DEE350000” 问题是,当用户打印邮

我们已经为Outlook编写了一个附加组件,将电子邮件归档到我们的CRM系统中。在此过程中,它将Outlook邮件ID保存为邮件本身的用户字段

例如

不幸的是,这是一个Huuugge数字,很像:

“00000000 D502D779150E2F4580B1AADDF04ECDA6070097EF5A1237597748A4B4F9BFF54002080000006E9E4000068BB5B6DFC36924FAEC709A17D056583000002DEE350000”

问题是,当用户打印邮件时,Outlook坚持包含此字段(在“发件人/收件人”下),并且因为它没有空格,所以无法包装ID并压缩A4页面,直到它可以水平放置。这会产生微小的电子邮件打印输出

我有什么办法可以纠正这个问题吗?我曾想过用空格分隔的字段覆盖字段OriginalEntryID(导致问题的字段),但COM层出现了一个异常。我的下一步是尝试并抑制Outlook上此字段和其他用户定义字段的输出


有人知道如何做到这一点吗?

我想这可能会对我有所帮助:


您必须使用.NET Reflection来修复此问题(根据Microsoft支持部门的建议)。希望这将在VSTO SDK的未来版本中得到修复

禁止Outlook用户字段打印
static void SuppressUserPropertyPrinting(Outlook.MailItem邮件)
{
尝试
{//NET中的后期绑定:https://support.microsoft.com/en-us/kb/302902
类型userPropertyType;
长dispidMember=107;
long ulPropPrintable=0x4;//删除PDO_PRINT_SAVEAS
string dispMemberName=string.Format(“[DispID={0}]”,dispidMember);
对象[]dispParams;
if(message.UserProperties.Count==0)返回;//未找到任何道具(退出)
//将所有用户属性标记为已抑制
foreach(message.UserProperties.Cast()中的Outlook.UserProperty UserProperty)
{
如果(userProperty==null)继续;//未找到任何道具(转到下一步)
userPropertyType=userProperty.GetType();//用户属性类型
//调用IDispatch::Invoke以获取当前标志
对象标志=userPropertyType.InvokeMber(dispMemberName,BindingFlags.GetProperty,null,userProperty,null);
long lFlags=long.Parse(flags.ToString());//默认值为45-PDO_是自定义的| PDO_打印_保存为| PDO_打印_保存为|定义(参考:http://msdn.microsoft.com/en-us/library/ee415114.aspx)
//删除隐藏的属性可打印标志
lFlags&=~ulPropPrintable;//更改为41-//PDO_是自定义的| PDO_PRINT_SAVEAS_DEF(参考:http://msdn.microsoft.com/en-us/library/ee415114.aspx)
//将new flags属性放入参数数组中
dispParams=新对象[]{lFlags};
//调用IDispatch::Invoke设置当前标志
userPropertyType.InvokeMber(dispMemberName,BindingFlags.SetProperty,null,userProperty,dispParams);
}
}
catch{}//如果属性抑制不起作用,请安全地忽略
}
currentUserProperty = Constants.APPLICATION_NAME + "EntryID";
mailItem.UserProperties.Add(currentUserProperty,
       Microsoft.Office.Interop.Outlook.OlUserPropertyType.olText,
       Missing.Value,
       Missing.Value).Value = entryId;
static void SuppressUserPropertyPrinting(Outlook.MailItem message)
{
    try
    {   // Late Binding in .NET: https://support.microsoft.com/en-us/kb/302902
        Type userPropertyType;
        long dispidMember = 107;
        long ulPropPrintable = 0x4; // removes PDO_PRINT_SAVEAS
        string dispMemberName = String.Format("[DispID={0}]", dispidMember);
        object[] dispParams;

        if (message.UserProperties.Count == 0) return; // no props found (exit)

        // marks all user properties as suppressed
        foreach (Outlook.UserProperty userProperty in message.UserProperties.Cast<Outlook.UserProperty>())
        {
            if (userProperty == null) continue; // no prop found (go to next)
            userPropertyType = userProperty.GetType(); // user property type

            // Call IDispatch::Invoke to get the current flags
            object flags = userPropertyType.InvokeMember(dispMemberName, BindingFlags.GetProperty, null, userProperty, null);
            long lFlags = long.Parse(flags.ToString()); // default is 45 - PDO_IS_CUSTOM|PDO_PRINT_SAVEAS|PDO_PRINT_SAVEAS_DEF (ref: http://msdn.microsoft.com/en-us/library/ee415114.aspx)

            // Remove the hidden property Printable flag
            lFlags &= ~ulPropPrintable; // change to 41 - // PDO_IS_CUSTOM|PDO_PRINT_SAVEAS_DEF (ref: http://msdn.microsoft.com/en-us/library/ee415114.aspx)

            // Place the new flags property into an argument array
            dispParams = new object[] { lFlags };

            // Call IDispatch::Invoke to set the current flags
            userPropertyType.InvokeMember(dispMemberName, BindingFlags.SetProperty, null, userProperty, dispParams);
        }
    }
    catch { } // safely ignore if property suppression doesn't work
}