PyQT5:拖放然后下载outlook电子邮件(.msg)

2024-03-29 11:56:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在查看所有的拖放教程,但我找不到任何允许我拖动然后下载.msg文件的内容,就好像我只是将它从outlook拖到windows目录一样。在阅读QDataStream时,我原以为可以将mimedata写入QFile以创建.msg文件,但应用程序一旦命中out就崩溃了<;<;事件.mimeData()行。你知道吗

import sys
import os
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *

class TestListView(QListWidget):
    trigger = pyqtSignal()
    def __init__(self, type, parent=None):
        super(TestListView, self).__init__(parent)
        self.setAcceptDrops(True)
        self.setIconSize(QtCore.QSize(72, 72))

    def dragEnterEvent(self, event):
        if event.mimeData().hasFormat("FileContents"):
            event.acceptProposedAction()

    def dragMoveEvent(self, event):
        if event.mimeData().hasFormat("FileContents"):
            event.acceptProposedAction()

    def dropEvent(self, event):
        if event.mimeData().hasFormat("FileContents"):
            event.acceptProposedAction()
           # print(event.mimeData().data())
            file = QFile('test.msg')
            file.open(QIODevice.WriteOnly)
            out = QDataStream(file)
            #print(event.mimeData().text())
            #trying to capture mimedata to create the actual .msg
            out << event.mimeData()
        else:
            event.ignore()

class MainForm(QMainWindow):

    def __init__(self, parent=None):
        super(MainForm, self).__init__(parent)
        self.view = TestListView(self)
        #self.view.trigger.connect(self.emailDropped)
        self.setCentralWidget(self.view)

    def emailDropped(self, l):

        for url in l:
            print(url)

def main():
    app = QApplication(sys.argv)
    form = MainForm()
    form.show()
    app.exec_()

if __name__ == '__main__':
    main()

下面是回归事件.mimeData().formats()当我试图拖入一封电子邮件时-

['application/x-qt-windows-mime;value="RenPrivateSourceFolder"', 'application/x-qt-windows-mime;value="RenPrivateLatestMessages"', 'application/x-qt-windows-mime;value="RenPrivateMessages"', 'application/x-qt-windows-mime;value="RenPrivateItem"', 'application/x-qt-windows-mime;value="FileGroupDescriptor"', 'application/x-qt-windows-mime;value="FileGroupDescriptorW"', 'application/x-qt-windows-mime;value="FileNameW"', 'application/x-qt-windows-mime;value="FileContents"', 'application/x-qt-windows-mime;value="Object Descriptor"', 'text/plain', 'application/x-qt-windows-mime;value="CSV"', 'application/x-qt-windows-mime;value="DragImageBits"', 'application/x-qt-windows-mime;value="DragContext"']

Tags: fromimportselfeventapplicationinitvaluewindows
2条回答

不能让它只与qt模块一起工作,但我可以使用win32下载.msgcom客户端. 我的想法是,由于我将从outlook客户端拖动,我可以使用win32com下载当前突出显示的选择。你知道吗

import win32com.client as win32

def dropEvent(self, event):
    if event.mimeData().hasFormat("FileContents"):
        event.acceptProposedAction()
        outlook = win32.Dispatch("Outlook.Application")
        selection = outlook.ActiveExplorer().Selection
        count = selection.Count + 1
        for i in range(1,count):
            message = selection.Item(i)
            name = re.sub('[^A-Za-z0-9]+', ' ', str(message.subject))
            message.SaveAs(os.path.join(r'C:\Users\path',name + '.msg'))
            self.trigger.emit(name)

:此答案是在OP提供的一些澄清之后编辑的,因此它不是«实际»答案,因为它没有提供最终的预期结果。你知道吗


QDataStream<<操作数不接受python字符串或QObject:

>>> stream << self.something.text()
TypeError: unsupported operand type(s) for <<: 'QDataStream' and 'str'

操作数仅适用于已知的兼容和可序列化的Qt类型(请参阅PyQt^{}的文档),如QByteArray、QdateTime等。否则,最好使用QDataStream.write*方法:

>> stream.writeQString(self.something.text())

问题编辑和评论后更新

Outlook使用的msg格式不被视为“通用”标准,我无法为您的问题提供明确完整的答案。您需要深入研究^{} Outlook Item file format以了解如何编写自己的文件。你知道吗

也就是说,mime数据对象的每个和任何字段都可以通过mimeData.data([format])进行访问,该mimeData.data([format])返回一个QByteArray,该QByteArray准备写入一个QDataStream,该QDataStream与一个打开的QFile一起使用。这也是out << event.mimeData()不起作用的原因:它是一个QObject,不能直接序列化。你知道吗

例如,根据您之前提供的格式,您可以使用以下方法访问“FileNameW”项:

mimeData.data('application/x-qt-windows-mime;value="FileNameW"')

现在由您按照上面给出的文档“构建”自己的msg文件。我知道这不是一个实际的答案,但我不使用Outlook,甚至不能提供最简单的示例,因为我无法相应地测试它。你知道吗

最后一个建议是:记住在最后调用file.close(),否则文件根本不会被写入。你知道吗

相关问题 更多 >