首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用python将EML (MIME)转换为MSG

用python将EML (MIME)转换为MSG
EN

Stack Overflow用户
提问于 2022-05-31 20:53:51
回答 2查看 924关注 0票数 0

我正在尝试使用python将EML文件转换为MSG (Outlook)文件。使用不同的例子,我能够收集这段代码,但是它不起作用。它创建了一个msg文件,但是Outlook无法读取该文件,其大小比输入的eml文件大两倍。我有点迷茫了,有什么想法吗?

代码语言:javascript
运行
复制
from win32com.mapi import mapi
from win32com.mapi import mapitags
import win32com.client
import pythoncom
from win32com import storagecon

import ctypes
import platform
import winreg
import uuid 
import sys
import os

mapi.MAPIInitialize((mapi.MAPI_INIT_VERSION, mapi.MAPI_MULTITHREAD_NOTIFICATIONS))

IconvOLE = ctypes.OleDLL(r'C:\Program Files (x86)\Microsoft Office\root\Office16\OUTLMIME.DLL')
clsid_class = uuid.UUID(str(mapi.CLSID_IConverterSession)).bytes_le
iclassfactory = uuid.UUID(str(pythoncom.IID_IClassFactory)).bytes_le
com_classfactory = ctypes.c_long(0)
IconvOLE.DllGetClassObject(clsid_class, iclassfactory, ctypes.byref(com_classfactory))
MyFactory = pythoncom.ObjectFromAddress(com_classfactory.value, pythoncom.IID_IClassFactory)
cs =  MyFactory.CreateInstance (None, str(mapi.IID_IConverterSession))

eml = mapi.OpenStreamOnFileW(r"C:\test.eml")

stg = pythoncom.StgCreateDocfile(r"C:\test.msg",
    storagecon.STGM_CREATE | storagecon.STGM_READWRITE | storagecon.STGM_TRANSACTED)

msg = mapi.OpenIMsgOnIStg(0, None, stg, None, 0, mapi.MAPI_UNICODE)

cs.MIMEToMAPI(eml, msg, win32com.mapi.mapi.CCSF_SMTP | win32com.mapi.mapi.CCSF_INCLUDE_BCC)

msg.SaveChanges(0)

mapi.MAPIUninitialize()
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-06-06 13:20:18

因此,在我从Outlook x86迁移到x64之后,它就开始工作了,并添加了以下注册表项:

代码语言:javascript
运行
复制
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{4E3A7680-B77A-11D0-9DA5-00C04FD65685}]
@="CLSID_IConverterSession"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{4E3A7680-B77A-11D0-9DA5-00C04FD65685}\InprocServer32]
@="C:\\Program Files\\Microsoft Office\\root\\Office16\\OUTLMIME.DLL"
"ThreadingModel"="Both"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{9EADBD1A-447B-4240-A9DD-73FE7C53A981}]
@="CLSID_IMimeMessage"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{9EADBD1A-447B-4240-A9DD-73FE7C53A981}\InprocServer32]
@="C:\\Program Files\\Microsoft Office\\root\\Office16\\OUTLMIME.DLL"
"ThreadingModel"="Both"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{9EADBD1A-447B-4240-A9DD-73FE7C53A981}\Typelib]
@="{9EADBD25-447B-4240-A9DD-73FE7C53A981}"

键是您可以在其中找到的密钥的副本:

代码语言:javascript
运行
复制
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\REGISTRY\MACHINE\Software\Classes\CLSID

工作代码:

代码语言:javascript
运行
复制
mapi.MAPIInitialize((mapi.MAPI_INIT_VERSION, mapi.MAPI_MULTITHREAD_NOTIFICATIONS))


inf = mapi.OpenStreamOnFile(r"C:\Users\xxx\raw.eml")

stg = pythoncom.StgCreateDocfile(r"C:\Users\xxx\raw.msg",
    storagecon.STGM_CREATE | storagecon.STGM_READWRITE | storagecon.STGM_SHARE_EXCLUSIVE | storagecon.STGM_TRANSACTED)

msg = mapi.OpenIMsgOnIStg(0, None, stg, None, 0, mapi.MAPI_UNICODE)

cs = pythoncom.CoCreateInstance(mapi.CLSID_IConverterSession, None, pythoncom.CLSCTX_INPROC_SERVER, mapi.IID_IConverterSession)


cs.MIMEToMAPI(inf, msg, 0)

msg.SaveChanges(0)

mapi.MAPIUninitialize()
票数 0
EN

Stack Overflow用户

发布于 2022-05-31 21:41:07

首先,大小并不重要,特别是当您比较不同的文件格式时。其次,尝试在SSView (它显示IStorage级别上的数据)或OutlookSpy (我是它的作者-单击OpenIMsgOnIStg按钮)这样的实用工具中打开MSG文件-它将在MAPI级别上显示MSG文件数据。

也许最重要的是,从Outlook2016开始,IConverterSession接口只在代码运行在outlook.exe地址空间(即代码是COM/VSTO外接程序或Outlook )时才能工作。此外,您的代码从不检查IConverterSession::MIMEToMAPI是否返回成功的返回代码。

如果使用赎罪是一种选择(我也是它的作者),它允许将EML文件转换为MSG,而无需使用Outlook转换器(在VB脚本中):

代码语言:javascript
运行
复制
    set Session = CreateObject("Redemption.RDOSession")
    Session.MAPIOBJECT = Application.Session.MAPIOBJECT 'not required
    set Msg = Session.CreateMessageFromMsgFile("c:\temp\test.msg")
    Msg.Sent = true
    Msg.Import "c:\temp\test.eml", 1024 '1024 is olRfc822
    Msg.Save
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72454016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档