使用Npgsql将outlook电子邮件移动到postgresql db的最快方法

时间:2015-01-04 08:00:04

标签: c# outlook outlook-addin npgsql

我在outlook公共文件夹中有大约200 000封电子邮件。

导出到pst有点快,但我不知道psts是否可靠。完美解码它(附件)变得非常头疼。 python lib不保存附件。 Java lib不为所有电子邮件导入html正文。

所以,我想保存到postgresql db。

我正在使用Npgsql,但它很慢(我正在使用它的方式)。

我当前的缓慢方式:

sql = "insert into tablename (a,b,c) values (:aa, :bb, :cc)";  
cmd = (sql, con) #I am skipping full commands as I am reading from mind, dont think I made mistake in my code.  

NpgsqlParameter pa = new NpgsqlParameter(":aa", sometype)
#same for other 3

pa.value = somevalue

cmd.Parameters.Add(pa)
#add others also

如果我评论数据库保存部分,它真的很快(比如10秒内的1000封邮件),但是对于数据库部分它是大约10封邮件,持续2秒。

我认为原因是,我有10个列(htmlbody,body,headerstring等),我正在为这10个列创建新的NpgsqlParameter,为每个邮件设置值,这让我感觉很慢。

我无法像

一样
"...values('"+htmlbody+"', '"+header_string+"'..

因为错误

syntax error at or near..so I started using npgsqlparameter.  

另外,我只是在解析header_string失败的情况下保存在字段下面(对于某些电子邮件而言,特别是那些在headerstring开头有'microsoft ..version 2'的电子邮件失败了)。它们是否足以表示完整的电子邮件,以防万一,headertring无用?

    sender_entry_id 
    foldername text,
    subject text,

    headerstring text,
    num_of_attachments int,

    body text,
    body_html text,

    bcc text,
    tooo text,
    frm text,
    cc text,
    conversation_id text,
    conversation_index text,
    conversation_topic text,
    message_class text,
    senton timestamp

另外,我收到此错误

System.Runtime.InteropServices.COMException (0x80040304): The operation failed.

at Microsoft.Office.Interop.Outlook.PropertyAccessorClass.GetProperty(String SchemaName)

将一些附件保存为byte []变量。这是代码:

 const string PR_ATTACH_DATA_BIN =
"http://schemas.microsoft.com/mapi/proptag/0x37010102";

 byte[] attachmentData =
 (byte[])attachment.PropertyAccessor.GetProperty(
     PR_ATTACH_DATA_BIN);  #attachment is Outlook.Attachment

2 个答案:

答案 0 :(得分:1)

PropertyAccessor类的GetProperty方法无法读取大的PT_BINARY值(> 64kB)。这就是你在代码中得到异常的原因。

您可以使用低级代码(扩展MAPI)以IStream打开附件数据:

IAttach::OpenProperty(PR_ATTACH_DATA_BIN, IID_IStream).

答案 1 :(得分:1)

您可以先将附件保存到临时文件(Attachment.SaveAsFile),然后读取其数据。

正如Eugene所提到的,您可以使用扩展MAPI将附件数据作为IStream访问,但是在C#中无法访问它,只能在C ++或Delphi中访问。

如果使用Redemption是一个选项,则可以使用RDOAttachmentAttachment对象公开的AsText和AsArray属性(由Safe * Item对象返回)。