Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用C语言将PST转换为多个EML文件#_C#_Email_Outlook_Eml_Pst - Fatal编程技术网

C# 用C语言将PST转换为多个EML文件#

C# 用C语言将PST转换为多个EML文件#,c#,email,outlook,eml,pst,C#,Email,Outlook,Eml,Pst,我需要创建一个解析PST文件并将邮件转换为多个EML文件的应用程序。基本上,我需要做的是与要求相反的事情 是否有实现此功能的示例代码或指南?您可以使用能够打开PST并将消息提取为.EML(以及其他格式)的库。Redemption是一个COM对象(32或64位),可以在C#中使用,没有任何问题。下面是一个控制台应用程序示例代码,演示了这一点: using System; using System.IO; using System.Text; using Redemption; namespace

我需要创建一个解析PST文件并将邮件转换为多个EML文件的应用程序。基本上,我需要做的是与要求相反的事情

是否有实现此功能的示例代码或指南?

您可以使用能够打开PST并将消息提取为.EML(以及其他格式)的库。Redemption是一个COM对象(32或64位),可以在C#中使用,没有任何问题。下面是一个控制台应用程序示例代码,演示了这一点:

using System;
using System.IO;
using System.Text;
using Redemption;

namespace DumpPst
{
    class Program
    {
        static void Main(string[] args)
        {
            // extract 'test.pst' in the 'test' folder
            ExtractPst("test.pst", Path.GetFullPath("test"));
        }

        public static void ExtractPst(string pstFilePath, string folderPath)
        {
            if (pstFilePath == null)
                throw new ArgumentNullException("pstFilePath");

            RDOSession session = new RDOSession();
            RDOPstStore store = session.LogonPstStore(pstFilePath);
            ExtractPstFolder(store.RootFolder, folderPath);
        }

        public static void ExtractPstFolder(RDOFolder folder, string folderPath)
        {
            if (folder == null)
                throw new ArgumentNullException("folder");

            if (folderPath == null)
                throw new ArgumentNullException("folderPath");

            if (folder.FolderKind == rdoFolderKind.fkSearch)
                return;

            if (!Directory.Exists(folderPath))
            {
                Directory.CreateDirectory(folderPath);
            }

            foreach(RDOFolder child in folder.Folders)
            {
                ExtractPstFolder(child, Path.Combine(folderPath, ToFileName(child.Name)));
            }

            foreach (var item in folder.Items)
            {
                RDOMail mail = item as RDOMail;
                if (mail == null)
                    continue;

                mail.SaveAs(Path.Combine(folderPath, ToFileName(mail.Subject)) + ".eml", rdoSaveAsType.olRFC822);
            }
        }

      /// <summary>
      /// Converts a text into a valid file name.
      /// </summary>
      /// <param name="fileName">The file name.</param>
      /// <returns>
      /// A valid file name.
      /// </returns>
      public static string ToFileName(string fileName)
      {
          return ToFileName(fileName, null, null);
      }

      /// <summary>
      /// Converts a text into a valid file name.
      /// </summary>
      /// <param name="fileName">The file name.</param>
      /// <param name="reservedNameFormat">The reserved format to use for reserved names. If null '_{0}_' will be used.</param>
      /// <param name="reservedCharFormat">The reserved format to use for reserved characters. If null '_x{0}_' will be used.</param>
      /// <returns>
      /// A valid file name.
      /// </returns>
      public static string ToFileName(string fileName, string reservedNameFormat, string reservedCharFormat)
      {
          if (fileName == null)
              throw new ArgumentNullException("fileName");

          if (string.IsNullOrEmpty(reservedNameFormat))
          {
              reservedNameFormat = "_{0}_";
          }

          if (string.IsNullOrEmpty(reservedCharFormat))
          {
              reservedCharFormat = "_x{0}_";
          }

          if (Array.IndexOf(ReservedFileNames, fileName.ToLowerInvariant()) >= 0 ||
              IsAllDots(fileName))
              return string.Format(reservedNameFormat, fileName);

          char[] invalid = Path.GetInvalidFileNameChars();

          StringBuilder sb = new StringBuilder(fileName.Length);
          foreach (char c in fileName)
          {
              if (Array.IndexOf(invalid, c) >= 0)
              {
                  sb.AppendFormat(reservedCharFormat, (short)c);
              }
              else
              {
                  sb.Append(c);
              }
          }

          string s = sb.ToString();

          // directory limit is 255
          if (s.Length > 254)
          {
              s = s.Substring(0, 254);
          }

          if (string.Equals(s, fileName, StringComparison.Ordinal))
          {
              s = fileName;
          }
          return s;
      }

      private static bool IsAllDots(string fileName)
      {
          foreach (char c in fileName)
          {
              if (c != '.')
                  return false;
          }
          return true;
      }

      private static readonly string[] ReservedFileNames = new[]
      {
          "con", "prn", "aux", "nul",
          "com0", "com1", "com2", "com3", "com4", "com5", "com6", "com7", "com8", "com9",
          "lpt0", "lpt1", "lpt2", "lpt3", "lpt4", "lpt5", "lpt6", "lpt7", "lpt8", "lpt9"
      };
    }
}
使用系统;
使用System.IO;
使用系统文本;
使用赎回;
命名空间转储PST
{
班级计划
{
静态void Main(字符串[]参数)
{
//在“测试”文件夹中提取“test.pst”
ExtractPst(“test.pst”,Path.GetFullPath(“test”);
}
公共静态void ExtractPst(字符串pstFilePath、字符串folderPath)
{
if(pstFilePath==null)
抛出新ArgumentNullException(“pstFilePath”);
RDOSession session=新RDOSession();
RDOPstStore store=session.LogonPstStore(pstFilePath);
ExtractPstFolder(store.RootFolder,folderPath);
}
公共静态文件夹(RDOFolder文件夹、字符串文件夹路径)
{
如果(文件夹==null)
抛出新的ArgumentNullException(“文件夹”);
if(folderPath==null)
抛出新ArgumentNullException(“folderPath”);
if(folder.FolderKind==rdoFolderKind.fkSearch)
返回;
如果(!Directory.Exists(folderPath))
{
CreateDirectory(folderPath);
}
foreach(文件夹.Folders中的RDOFolder子文件夹)
{
ExtractPstFolder(子,Path.Combine(folderPath,ToFileName(child.Name));
}
foreach(文件夹.Items中的变量项)
{
RDOMail mail=作为RDOMail的项目;
if(mail==null)
继续;
SaveAs(Path.Combine(folderPath,ToFileName(mail.Subject))+“.eml”,rdoSaveAsType.olRFC822);
}
}
/// 
///将文本转换为有效的文件名。
/// 
///文件名。
/// 
///有效的文件名。
/// 
公共静态字符串ToFileName(字符串文件名)
{
返回ToFileName(文件名,null,null);
}
/// 
///将文本转换为有效的文件名。
/// 
///文件名。
///用于保留名称的保留格式。如果为null,将使用“{0}”。
///用于保留字符的保留格式。如果为空,将使用“\ux{0}”。
/// 
///有效的文件名。
/// 
公共静态字符串ToFileName(字符串文件名、字符串reservedNameFormat、字符串reservedCharFormat)
{
如果(文件名==null)
抛出新的ArgumentNullException(“文件名”);
if(string.IsNullOrEmpty(reservedNameFormat))
{
reservedNameFormat=“\u{0}\u0”;
}
if(string.IsNullOrEmpty(reservedCharFormat))
{
reservedCharFormat=“\ux{0}\ux”;
}
if(Array.IndexOf(ReservedFileNames,fileName.ToLowerInvariant())>=0||
IsAllDots(文件名))
返回string.Format(reservedNameFormat,文件名);
char[]无效=路径。GetInvalidFileNameChars();
StringBuilder sb=新的StringBuilder(fileName.Length);
foreach(文件名中的字符c)
{
if(Array.IndexOf(无效,c)>=0)
{
sb.AppendFormat(reservedCharFormat,(缩写)c);
}
其他的
{
sb.附加(c);
}
}
字符串s=sb.ToString();
//目录限制为255
如果(s.长度>254)
{
s=s.子串(0254);
}
if(string.Equals(s,fileName,StringComparison.Ordinal))
{
s=文件名;
}
返回s;
}
私有静态bool IsAllDots(字符串文件名)
{
foreach(文件名中的字符c)
{
如果(c!='。)
返回false;
}
返回true;
}
私有静态只读字符串[]ReservedFileNames=new[]
{
“con”、“prn”、“aux”、“nul”,
“com0”、“com1”、“com2”、“com3”、“com4”、“com5”、“com6”、“com7”、“com8”、“com9”,
“lpt0”、“lpt1”、“lpt2”、“lpt3”、“lpt4”、“lpt5”、“lpt6”、“lpt7”、“lpt8”、“lpt9”
};
}
}
您可以使用能够打开PST并将消息提取为.EML(以及其他格式)的库。Redemption是一个COM对象(32或64位),可以在C#中使用,没有任何问题。下面是一个控制台应用程序示例代码,演示了这一点:

using System;
using System.IO;
using System.Text;
using Redemption;

namespace DumpPst
{
    class Program
    {
        static void Main(string[] args)
        {
            // extract 'test.pst' in the 'test' folder
            ExtractPst("test.pst", Path.GetFullPath("test"));
        }

        public static void ExtractPst(string pstFilePath, string folderPath)
        {
            if (pstFilePath == null)
                throw new ArgumentNullException("pstFilePath");

            RDOSession session = new RDOSession();
            RDOPstStore store = session.LogonPstStore(pstFilePath);
            ExtractPstFolder(store.RootFolder, folderPath);
        }

        public static void ExtractPstFolder(RDOFolder folder, string folderPath)
        {
            if (folder == null)
                throw new ArgumentNullException("folder");

            if (folderPath == null)
                throw new ArgumentNullException("folderPath");

            if (folder.FolderKind == rdoFolderKind.fkSearch)
                return;

            if (!Directory.Exists(folderPath))
            {
                Directory.CreateDirectory(folderPath);
            }

            foreach(RDOFolder child in folder.Folders)
            {
                ExtractPstFolder(child, Path.Combine(folderPath, ToFileName(child.Name)));
            }

            foreach (var item in folder.Items)
            {
                RDOMail mail = item as RDOMail;
                if (mail == null)
                    continue;

                mail.SaveAs(Path.Combine(folderPath, ToFileName(mail.Subject)) + ".eml", rdoSaveAsType.olRFC822);
            }
        }

      /// <summary>
      /// Converts a text into a valid file name.
      /// </summary>
      /// <param name="fileName">The file name.</param>
      /// <returns>
      /// A valid file name.
      /// </returns>
      public static string ToFileName(string fileName)
      {
          return ToFileName(fileName, null, null);
      }

      /// <summary>
      /// Converts a text into a valid file name.
      /// </summary>
      /// <param name="fileName">The file name.</param>
      /// <param name="reservedNameFormat">The reserved format to use for reserved names. If null '_{0}_' will be used.</param>
      /// <param name="reservedCharFormat">The reserved format to use for reserved characters. If null '_x{0}_' will be used.</param>
      /// <returns>
      /// A valid file name.
      /// </returns>
      public static string ToFileName(string fileName, string reservedNameFormat, string reservedCharFormat)
      {
          if (fileName == null)
              throw new ArgumentNullException("fileName");

          if (string.IsNullOrEmpty(reservedNameFormat))
          {
              reservedNameFormat = "_{0}_";
          }

          if (string.IsNullOrEmpty(reservedCharFormat))
          {
              reservedCharFormat = "_x{0}_";
          }

          if (Array.IndexOf(ReservedFileNames, fileName.ToLowerInvariant()) >= 0 ||
              IsAllDots(fileName))
              return string.Format(reservedNameFormat, fileName);

          char[] invalid = Path.GetInvalidFileNameChars();

          StringBuilder sb = new StringBuilder(fileName.Length);
          foreach (char c in fileName)
          {
              if (Array.IndexOf(invalid, c) >= 0)
              {
                  sb.AppendFormat(reservedCharFormat, (short)c);
              }
              else
              {
                  sb.Append(c);
              }
          }

          string s = sb.ToString();

          // directory limit is 255
          if (s.Length > 254)
          {
              s = s.Substring(0, 254);
          }

          if (string.Equals(s, fileName, StringComparison.Ordinal))
          {
              s = fileName;
          }
          return s;
      }

      private static bool IsAllDots(string fileName)
      {
          foreach (char c in fileName)
          {
              if (c != '.')
                  return false;
          }
          return true;
      }

      private static readonly string[] ReservedFileNames = new[]
      {
          "con", "prn", "aux", "nul",
          "com0", "com1", "com2", "com3", "com4", "com5", "com6", "com7", "com8", "com9",
          "lpt0", "lpt1", "lpt2", "lpt3", "lpt4", "lpt5", "lpt6", "lpt7", "lpt8", "lpt9"
      };
    }
}
使用系统;
使用System.IO;
使用系统文本;
使用赎回;
命名空间转储PST
{
班级计划
{
静态void Main(字符串[]参数)
{
//在“测试”文件夹中提取“test.pst”
ExtractPst(“test.pst”,Path.GetFullPath(“test”);
}
公共静态void ExtractPst(字符串pstFilePath、字符串folderPath)
{
if(pstFilePath==null)
抛出新ArgumentNullException(“pstFilePath”);
RDOSession session=新RDOSession();
RDOPstStore store=session.LogonPstStore(pstFilePath);
ExtractPstFolder(store.RootFolder,folderPath);
}
公共静态文件夹(RDOFolder文件夹、字符串文件夹路径)
{
如果(文件夹==null)
抛出新的ArgumentNullException(“文件夹”);
if(folderPath==null)
抛出新ArgumentNullException(“folderPath”);
if(folder.FolderKind==rdoFolderKind.fkSearch)