Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Получить текст из электронной почты Outlook [Drag’n’Drop]

Автор вопроса: jefsmiОтветов: 3

Я работаю с WPF и пытаюсь создать текстовое поле с перетаскиванием.
В этом текстовом поле я хочу получить тело письма, которое я перетаскиваю из Outlook.
Код работает, но я думаю, что мне нужно что-то, чтобы "сбросить" ActiveExplorer, потому что теперь он показывает только последнее "НОВОЕ" электронное письмо, которое я перетаскиваю в текстовое поле.

Пример:

Перетащите электронную почту 1 -> Текстовое поле - показывает электронную почту 1

Перетащите электронное письмо 2 -> Текстовое поле - показывает электронное письмо 2

Перетащите электронную почту 1 -> Текстовое поле - показывает электронную почту 2, а электронная почта 1 не будет отображаться, потому что она уже существует в ActiveExplorer, и она покажет электронную почту 2.


Надеюсь, мой вопрос вам немного ясен..
Заранее спасибо!

XAML-код:

    <TextBox
    Name="myTextbox"
    AllowDrop="True"
    PreviewDragEnter="email_DragEnter"
    PreviewDrop="email_Drop" />

Код XAML позади:

    private void email_DragEnter(object sender, DragEventArgs e)
    {
        e.Effect = DragDropEffects.Copy;
    }

    private void email_Drop(object sender, DragEventArgs e)
    {
        Outlook.ApplicationClass oApp = new Outlook.ApplicationClass();
        Outlook.Explorer oExplorer = oApp.ActiveExplorer();
        Outlook.Selection oSelection = oExplorer.Selection;

        foreach (object item in oSelection)
        {
            Outlook.MailItem mi = (Outlook.MailItem)item;
            myTextbox.Text = mi.Body.ToString();
        }
    }

drag-and-dropoutlookwpf

Ответы

Ответ 1 · рейтинг 9 · L.B

Я переместил объявление oApp из события DragDrop, как показано ниже, и оно работает, как и ожидалось.

void Startup()
{
    _Outlook = new Outlook.Application();
}

Outlook.Application _Outlook = null;

private void Form1_DragEnter(object sender, DragEventArgs e)
{
    e.Effect = DragDropEffects.Copy;
}

private void Form1_DragDrop(object sender, DragEventArgs e)
{
    richTextBox1.Text = "";
    Outlook.Explorer oExplorer = _Outlook.ActiveExplorer();
    Outlook.Selection oSelection = oExplorer.Selection;

    foreach (object item in oSelection)
    {
        Outlook.MailItem mi = (Outlook.MailItem)item;
        richTextBox1.AppendText(mi.Body.ToString() + "\n----------------------------------------\n");
    }
}

--------РЕДАКТИРОВАТЬ--------

ИЛИ Возможно ли, что вы отображаете только последний элемент из-за этого цикла?

foreach (object item in oSelection)
{
    Outlook.MailItem mi = (Outlook.MailItem)item;
    myTextbox.Text = mi.Body.ToString(); //<--- Only last items text
}

Ответ 2 · рейтинг 1 · Laoujin

Я обновил ответ LB. Его DragEnter EventHandler автоматически предположил, что пользователь добавил что-то из Outlook.

В результате, если пользователь вставлял что-то еще (файл, выделенный текст и т. д.), код все равно просматривал выбранные в данный момент электронные письма в Outlook и игнорировал то, что на самом деле было удалено.

Код:

Private _Outlook As Outlook.Application = Nothing

Private Sub Form_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
    _Outlook = New Outlook.Application()
End Sub

Private Sub Form_DragEnter(ByVal sender As Object, ByVal e As DragEventArgs) Handles Me.DragEnter
    Dim outlookRequiredFormats = New String() { _
        "RenPrivateSourceFolder", _
        "RenPrivateMessages", _
        "RenPrivateItem", _
        "FileGroupDescriptor", _
        "FileGroupDescriptorW", _
        "FileContents", _
        "Object Descriptor"}

    If outlookRequiredFormats.All(Function(requiredFormat) e.Data.GetDataPresent(requiredFormat)) Then
        e.Effect = DragDropEffects.Copy
    Else
        e.Effect = DragDropEffects.None
    End If
End Sub

Private Sub Form_DragDrop(ByVal sender As Object, ByVal e As DragEventArgs) Handles Me.DragDrop
    Dim oExplorer As Outlook.Explorer = _Outlook.ActiveExplorer()
    Dim oSelection As Outlook.Selection = oExplorer.Selection
    Dim i As Integer = 0
    For Each item As Object In oSelection
        Dim mi As Outlook.MailItem = DirectCast(item, Outlook.MailItem)
        mi.SaveAs("C:\YourPath\message" & i & ".msg")
        i += 1
    Next

Существует прямое приведение выбранного элемента Outlook к Outlook.MailItem. Таким образом, код работает только с реальными электронными письмами. Также можно обрабатывать Outlook.MeetingItem, Outlook.ContactItem, Outlook.NoteItem и, возможно, больше.

Ответ 3 · Timothée Bourguignon

Используя версию 14.0.0.0 Microsoft.Office.Interop.Outlook.dll, я не могу использовать объект Outlook.ApplicationClass.

Вместо этого я использовал Outlook.Application в приведенном вами примере, и он работает как шарм (протестировано с Windows 7 и Outlook 2007 SP2). Я могу перетаскивать электронные письма по желанию.


PS: Извлечение MSDN для класса ApplicationClass:

Этот класс поддерживает инфраструктуру .NET Framework и не предназначен для непосредственного использования в вашем коде

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы