MailItem 附件 - 检查文件是否已附加
MailItem Attachments - Check if File Already Attached
我知道如何将文件添加到 MailItem.Attachments,但如何检查文件是否已添加到附件?
比如我有文件名"C:\myFolder\myFile.txt"
。如何检查此文件是否已附加?我需要这个来防止将文件重复附加到新电子邮件。
这是我目前的情况:
var mItem = Outlook.Interfaces.HostAddIn.Application.ActiveInspector().CurrentItem as MailItem;
if (mItem != null)
{
//this works fine but I need to check if already attached first like below
//mItem.Attachments.Add(localFilePath);
bool found = false;
string attachments = "";
for (int i = 1; i <= mItem.Attachments.Count; i++)
{
attachments +=
"DisplayName: " + mItem.Attachments[i].DisplayName //shows just myFile.txt, no path
+ " / FileName: " + mItem.Attachments[i].FileName //shows just myFile.txt, no path
+ " / PathName: " + mItem.Attachments[i].PathName; //shows ""
//I tried here PathName, FileName, DisplayName but all return just name, without the path
if (mItem.Attachments[i].PathName == localFilePath)
{
found = true;
}
}
if (!found)
{
mItem.Attachments.Add(localFilePath); //attach only if not already attached
}
}
你所拥有的几乎是你能做的最好的 - FileName
将匹配,PathName
将始终为空,DisplayName
将与 [=10= 相同].
您还可以比较旧文件和现有文件的大小,但不要使用 Attachment.Size
,因为它包括 MAPI 指定属性的大小加上实际文件数据。
另外不要忘记检查 Attachmeent.Type == olByValue
:您只需要常规附件。
您还可以(如果文件名匹配)将现有附件保存到临时文件夹 (Attachment.SaveAsFile
) 并比较文件大小。如果它们匹配,您还可以比较上下文(例如计算 CRC)。
请注意,您无法单独使用 OOM 直接访问附件数据,您需要扩展 MAPI (IAttach::OpenProperty(PR_ATTACH_DATA_BIN, IID_IStream, ...)
) 或 Redemption(我是其作者 - Attachment.AsText/AsArray
/等)。否则您将需要使用 Attachment.SaveAsFile
然后删除临时文件。
我遇到了类似的问题,并尝试使用 mail.Attachment.Contains()
方法,但这总是返回 true
。不知道为什么。
所以我根据上面对 Dmit's
回答的评论做了以下操作。
这将检查文件附件是否存在,仅通过 名称。当然,您需要检查文件大小、CRC 等,以确保它是 100% 相同的文件。
FileInfo fInfo = new FileInfo(lFile);
if (errLine.Split(":")[0] == fInfo.Name)
{
Attachment logfile = new Attachment(lFile);
bool attachmentFound = false;
foreach (Attachment att in mail.Attachments)
{
if (att.Name == logfile.Name)
{
attachmentFound = true;
break;
}
}
if (!attachmentFound)
mail.Attachments.Add(logfile);
}
我知道如何将文件添加到 MailItem.Attachments,但如何检查文件是否已添加到附件?
比如我有文件名"C:\myFolder\myFile.txt"
。如何检查此文件是否已附加?我需要这个来防止将文件重复附加到新电子邮件。
这是我目前的情况:
var mItem = Outlook.Interfaces.HostAddIn.Application.ActiveInspector().CurrentItem as MailItem;
if (mItem != null)
{
//this works fine but I need to check if already attached first like below
//mItem.Attachments.Add(localFilePath);
bool found = false;
string attachments = "";
for (int i = 1; i <= mItem.Attachments.Count; i++)
{
attachments +=
"DisplayName: " + mItem.Attachments[i].DisplayName //shows just myFile.txt, no path
+ " / FileName: " + mItem.Attachments[i].FileName //shows just myFile.txt, no path
+ " / PathName: " + mItem.Attachments[i].PathName; //shows ""
//I tried here PathName, FileName, DisplayName but all return just name, without the path
if (mItem.Attachments[i].PathName == localFilePath)
{
found = true;
}
}
if (!found)
{
mItem.Attachments.Add(localFilePath); //attach only if not already attached
}
}
你所拥有的几乎是你能做的最好的 - FileName
将匹配,PathName
将始终为空,DisplayName
将与 [=10= 相同].
您还可以比较旧文件和现有文件的大小,但不要使用 Attachment.Size
,因为它包括 MAPI 指定属性的大小加上实际文件数据。
另外不要忘记检查 Attachmeent.Type == olByValue
:您只需要常规附件。
您还可以(如果文件名匹配)将现有附件保存到临时文件夹 (Attachment.SaveAsFile
) 并比较文件大小。如果它们匹配,您还可以比较上下文(例如计算 CRC)。
请注意,您无法单独使用 OOM 直接访问附件数据,您需要扩展 MAPI (IAttach::OpenProperty(PR_ATTACH_DATA_BIN, IID_IStream, ...)
) 或 Redemption(我是其作者 - Attachment.AsText/AsArray
/等)。否则您将需要使用 Attachment.SaveAsFile
然后删除临时文件。
我遇到了类似的问题,并尝试使用 mail.Attachment.Contains()
方法,但这总是返回 true
。不知道为什么。
所以我根据上面对 Dmit's
回答的评论做了以下操作。
这将检查文件附件是否存在,仅通过 名称。当然,您需要检查文件大小、CRC 等,以确保它是 100% 相同的文件。
FileInfo fInfo = new FileInfo(lFile);
if (errLine.Split(":")[0] == fInfo.Name)
{
Attachment logfile = new Attachment(lFile);
bool attachmentFound = false;
foreach (Attachment att in mail.Attachments)
{
if (att.Name == logfile.Name)
{
attachmentFound = true;
break;
}
}
if (!attachmentFound)
mail.Attachments.Add(logfile);
}