PST 파일 생성 및 관리
기존 PST 파일을 파싱하는 것뿐만 아니라, Aspose.Email은 처음부터 PST 파일을 생성하는 방법을 제공합니다. 이 기사에서는 Outlook PST 파일을 생성하고 하위 폴더 또는 메시지를 추가하는 방법을 보여줍니다.
PST 파일 생성
로컬 디스크에 새 PST 파일을 만들려면 다음을 사용해야 합니다: PersonalStorage class. 이 클래스를 사용하면 .NET 응용 프로그램에서 PST 파일을 생성, 읽기 및 조작할 수 있습니다. 한 줄의 코드로 스토리지 파일을 처음부터 생성합니다:
// Create new PST
using var pst = PersonalStorage.Create(path, FileFormatVersion.Unicode);
PST에 하위 폴더 추가
Root 폴더에 접근한 뒤 호출하여 PST 파일 루트에 하위 폴더를 추가합니다. AddSubFolder 메서드.
다음 코드 스니펫은 Inbox라는 하위 폴더를 추가하는 방법을 보여줍니다:
// Add new folder "Test"
pst.RootFolder.AddSubFolder("Inbox");
폴더 컨테이너 클래스 확인
새 폴더를 만들거나 기존 폴더에 항목을 추가할 때, 새로운 항목 또는 폴더의 컨테이너 클래스가 부모 폴더의 컨테이너 클래스와 일치하도록 하여 PST 저장 파일 내의 조직 계층 구조를 유지하는 것이 중요합니다. 이를 위해 Aspose.Email은 EnforceContainerClassMatching 속성 FolderCreationOptions class. 이 속성은 추가되는 폴더의 컨테이너 클래스가 부모 폴더의 컨테이너 클래스와 일치하는지 확인하도록 강제할지 여부를 지정합니다. ’true’로 설정하면 컨테이너 클래스가 일치하지 않을 경우 예외가 발생합니다. 기본값은 ‘false’입니다.
다음 코드 예제는 다음의 사용을 보여줍니다: EnforceContainerClassMatching 컨테이너 클래스가 일치하지 않는 폴더를 추가할 때 예외를 발생시킬지 여부를 제어하는 속성:
using (var pst = PersonalStorage.Create("storage.pst", FileFormatVersion.Unicode))
{
// Create a standard Contacts folder with the IPF.Contacts container class.
var contacts = pst.CreatePredefinedFolder("Contacts", StandardIpmFolder.Contacts);
// An exception will not arise. EnforceContainerClassMatching is false by default.
contacts.AddSubFolder("Subfolder1", "IPF.Note");
// An exception will occur as the container class of the subfolder being added (IPF.Note)
// does not match the container class of the parent folder (IPF.Contact).
contacts.AddSubFolder("Subfolder3", new FolderCreationOptions {EnforceContainerClassMatching = true, ContainerClass = "IPF.Note"});
}
참고: PST에서 폴더를 생성할 때 컨테이너 클래스 일치를 강제 적용하면 예외가 발생할 수 있으므로 적절히 처리하여 예기치 않은 동작을 방지하십시오.
폴더 컨테이너 클래스 변경
때때로 폴더 컨테이너 클래스를 변경해야 할 필요가 있습니다. 일반적인 예로, 서로 다른 유형(약속, 메시지 등)의 메시지를 동일한 폴더에 추가하는 경우가 있습니다. 이러한 경우, 폴더 내 모든 요소가 올바르게 표시되도록 폴더 클래스를 변경해야 합니다. 다음 코드 조각은 PST에서 폴더의 컨테이너 클래스를 변경하는 방법을 보여줍니다.
using var pst = PersonalStorage.FromFile("PersonalStorage1.pst");
var folder = pst.RootFolder.GetSubFolder("Inbox");
folder.ChangeContainerClass("IPF.Note");
PST에 파일 추가
Microsoft Outlook의 핵심 기능은 이메일, 캘린더, 작업, 연락처 및 저널 항목을 관리하는 것입니다. 또한 파일을 PST 폴더에 추가할 수 있으며, 이렇게 추가된 PST는 문서 기록을 유지합니다. Aspose.Email은 메시지, 연락처, 작업 및 저널 항목을 PST에 추가하는 것과 동일한 방식으로 폴더에 파일을 추가하는 기능을 제공합니다. 다음 코드 조각은 Aspose.Email을 사용하여 PST 폴더에 문서를 추가하는 방법을 보여줍니다.
using (var personalStorage = PersonalStorage.Create(dataDir + "Ps1_out.pst", FileFormatVersion.Unicode))
{
var folder = personalStorage.RootFolder.AddSubFolder("Files");
// Add Document.doc file with the "IPM.Document" message class by default.
folder.AddFile(dataDir + "attachment_1.doc", null);
}
PST 파일에 메시지 추가
Aspose.Email을 사용하면 생성하거나 로드한 PST 파일의 하위 폴더에 메시지를 추가할 수 있습니다. 이 문서는 디스크에서 두 개의 메시지를 PST의 Inbox 하위 폴더에 추가합니다. 다음을 사용하십시오: PersonalStorage 및 FolderInfo PST 파일에 메시지를 추가하기 위한 클래스들. PST 파일의 Inbox 폴더에 메시지를 추가하려면:
- FolderInfo 클래스의 인스턴스를 생성하고 Inbox 폴더의 내용을 로드합니다.
- 디스크에서 Inbox 폴더로 메시지를 추가하려면 다음을 호출합니다: FolderInfo.AddMessage() 메서드. FolderInfo 클래스는 다음을 노출합니다 AddMessages 대량의 메시지를 폴더에 추가하여 디스크 I/O 작업을 감소시키고 성능을 향상시키는 메서드입니다.
다음 코드 조각은 Inbox라는 PST 하위 폴더에 메시지를 추가하는 방법을 보여줍니다.
// Create new PST
var personalStorage = PersonalStorage.Create(dataDir, FileFormatVersion.Unicode);
// Add new folder "Inbox"
personalStorage.RootFolder.AddSubFolder("Inbox");
// Select the "Inbox" folder
var inboxFolder = personalStorage.RootFolder.GetSubFolder("Inbox");
// Add some messages to "Inbox" folder
inboxFolder.AddMessage(MapiMessage.FromFile(RunExamples.GetDataDir_Outlook() + "MapiMsgWithPoll.msg"));
성능 향상을 위한 일괄 메시지 추가
PST에 개별 메시지를 추가하면 디스크에 대한 I/O 작업이 증가하여 성능이 저하될 수 있습니다. 성능을 개선하려면 대량 모드로 메시지를 추가하여 I/O 작업을 최소화할 수 있습니다. AddMessages 메서드를 사용하면 메시지를 일괄 추가할 수 있으며 다음 시나리오에서 사용할 수 있습니다. 또한, MessageAdded 폴더에 메시지가 추가될 때 발생하는 이벤트.
다른 PST에서 메시지 추가
다른 PST에서 메시지를 추가하려면, 다음을 사용합니다: FolderInfo.EnumerateMapiMessages 값을 반환하는 메서드 IEnumerable<MapiMessage>:
using var srcPst = PersonalStorage.FromFile(@"source.pst", false);
using var destPst = PersonalStorage.FromFile(@"destination.pst");
// Get the folder by name
var srcFolder = srcPst.RootFolder.GetSubFolder("SomeFolder");
var destFolder = destPst.RootFolder.GetSubFolder("SomeFolder");
destFolder.MessageAdded += new MessageAddedEventHandler(OnMessageAdded);
destFolder.AddMessages(srcFolder.EnumerateMapiMessages());
// Handles the MessageAdded event.
static void OnMessageAdded(object sender, MessageAddedEventArgs e)
{
Console.WriteLine($"Added: {e.EntryId}");
}
디렉터리에서 메시지 추가
디렉터리에서 메시지를 추가하려면, 다음을 생성합니다: GetMessages(string pathToDir) 다음과 같은 값을 반환하는 명명된 반복자 메서드 IEnumerable<MapiMessage>:
using var pst = PersonalStorage.FromFile(@"storage.pst");
var folder = pst.RootFolder.GetSubFolder("SomeFolder");
folder.MessageAdded += OnMessageAdded;
folder.AddMessages(GetMessages(@"MessageDirectory"));
// Named iterator method to read messages from directory.
static IEnumerable<MapiMessage> GetMessages(string pathToDir)
{
string[] files = Directory.GetFiles(pathToDir, "*.msg");
foreach (var file in files)
{
yield return MapiMessage.Load(file);
}
}
// Handles the MessageAdded event.
static void OnMessageAdded(object sender, MessageAddedEventArgs e)
{
Console.WriteLine($"Added: {e.EntryId}");
}
디스크에서 메시지 로드
다음 코드 조각은 디스크에서 메시지를 로드하는 방법을 보여줍니다.
private static void AddMessagesInBulkMode(string fileName, string msgFolderName)
{
using (PersonalStorage personalStorage = PersonalStorage.FromFile(fileName))
{
FolderInfo folder = personalStorage.RootFolder.GetSubFolder("myInbox");
folder.MessageAdded += OnMessageAdded;
folder.AddMessages(new MapiMessageCollection(msgFolderName));
}
}
static void OnMessageAdded(object sender, MessageAddedEventArgs e)
{
Console.WriteLine(e.EntryId);
Console.WriteLine(e.Message.Subject);
}
IEnumerable 구현
다음 코드 조각은 IEnumerable 구현을 사용하는 방법을 보여줍니다.
public class MapiMessageCollection : IEnumerable<MapiMessage>
{
private string path;
public MapiMessageCollection(string path)
{
this.path = path;
}
public IEnumerator<MapiMessage> GetEnumerator()
{
return new MapiMessageEnumerator(path);
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
public class MapiMessageEnumerator : IEnumerator<MapiMessage>
{
private readonly string[] files;
private int position = -1;
public MapiMessageEnumerator(string path)
{
string path1 = RunExamples.GetDataDir_Outlook();
files = Directory.GetFiles(path1);
}
public bool MoveNext()
{
position++;
return (position < files.Length);
}
public void Reset()
{
position = -1;
}
object IEnumerator.Current
{
get
{
return Current;
}
}
public MapiMessage Current
{
get
{
try
{
return MapiMessage.FromFile(files[position]);
}
catch (IndexOutOfRangeException)
{
throw new InvalidOperationException();
}
}
}
public void Dispose()
{
}
}