Получить тело из электронной почты Outlook [Drag’n’Drop] - PullRequest
9 голосов
/ 18 октября 2011

Я работаю с WPF и пытаюсь создать текстовое поле для перетаскивания.
В этом текстовом поле я хочу получить тело письма, которое я перетаскиваю из внешнего вида.
Код работает, но я думаю, что мне нужно что-то для «сброса» 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();
        }
    }

Ответы [ 3 ]

9 голосов
/ 20 октября 2011

Я переместил объявление 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
}
1 голос
/ 22 июня 2012

Я обновил ответ 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 и, возможно, больше.

0 голосов
/ 20 октября 2011

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

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


PS: MSDN Extract для ApplicationClass класса:

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

...