.NET Создание текста электронной почты в Outlook из Word

Я пытаюсь сгенерировать тело электронного письма в Outlook 2007 из текста документа Word 2007 в VB. У меня есть доступ к библиотекам объектов Word и Outlook, и я могу читать из документа Word, чтобы получить строку и записать ее в Outlook, но мне нужно сохранить форматирование документа Word без изменений.

Цель состоит в том, чтобы позволить пользователям редактировать текстовый документ и всегда синхронизировать электронные письма, создаваемые моей программой, с документом.

Кто-нибудь знает как это сделать?


person Caleb Hearth    schedule 07.06.2010    source источник


Ответы (3)


Наконец-то я получил удовлетворительную работу. Это потребовало некоторых усилий, поэтому я решил поделиться тем, что в итоге использовал.

Private Sub CreateEmail()
    Dim wordApp As Word.ApplicationClass = New Word.ApplicationClass()

    Dim file As Object = "PATH TO WORD DOCUMENT"

    Dim nullobj As Object = System.Reflection.Missing.Value

    Dim doc As Word.Document = wordApp.Documents.Open( _
                file, nullobj, nullobj, nullobj, nullobj, nullobj, _
                nullobj, nullobj, nullobj, nullobj, nullobj, nullobj)
    doc.ActiveWindow.Selection.WholeStory()
    doc.ActiveWindow.Selection.Copy()
    Dim data As IDataObject = Clipboard.GetDataObject
    body = data.GetData(DataFormats.Html, True).ToString
    Dim delimiter As Char() = "<".ToCharArray()
    body = "<" + (body.Split(delimiter, 3))(2)
    doc.Close()
    My.Computer.Clipboard.SetText(body)
    SendMail()
End Sub

Private Sub DisplayMail()
    Dim Errmsg As String

    Try
        If Len(mailto) = 0 Then
            Errmsg = "You must designate a recipient."
            MsgBox(Errmsg, MsgBoxStyle.Exclamation, "Error")
            Exit Sub
        End If

        If GetOutlook() = True Then
            'Set the properties of the mail item
            mItem = CType(mOutlookApp.CreateItem(Outlook.OlItemType.olMailItem), Outlook.MailItem)
            mItem.Recipients.Add(mailto)
            mItem.BCC = bcc
            mItem.Subject = Me.subject
            mItem.HTMLBody = body

            'Save email to Outlook draft folder of the user
            mItem.Display()
        End If
    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try
End Sub
person Caleb Hearth    schedule 08.06.2010
comment
-1. Не очень эффективно, потому что вы: 1) открываете экземпляр Word, когда вам не нужно, 2) вы используете WholeStory, не учитывая того, что он не делает [верхние / нижние колонтитулы], и 3) вы ' re используют буфер обмена Windows, таким образом очищая все, что уже есть, без его восстановления. - person Todd Main; 24.06.2010

Замечательный материал, чтобы завершить здесь фрагменты кода, если вы хотите просто отправить слово doc как вложение из простого VBScript ...

Dim outlook, nameSpace, mailItem

Set outlook = WScript.CreateObject("Outlook.Application")
Set nameSpace = outlook.GetNameSpace("MAPI")
Set mailItem = outlook.CreateItem(0)

mailItem.Recipients.Add "recipient@address"
mailItem.Subject = "Mail Subject"
mailItem.Body = "The body of the mail item" & vbcrlf & _ 
        "Put whatever you want in here!"

mailItem.Attachments.Add("\\FULLUNC\PATH\TO Your File\Called\Whatever.doc").DisplayName = "Attached File"

mailItem.Send

nameSpace.Logoff
person blissapp    schedule 08.06.2010

Вот пример того, как это можно сделать из Outlook VBA (добавление ссылки на Word OM). Вы можете использовать это для переноса на .NET.

Sub CreateMail()
    Dim filePath As String
    filePath = """C:\\Users\\Me\\Desktop\\test.docx"""
    InsertBodyTextInOutlookWordEditor filePath
End Sub

Sub InsertBodyTextInOutlookWordEditor(filePath As String)
    Dim myMail As Outlook.MailItem
    Dim myInspector As Outlook.Inspector
    Dim wdDoc As Word.Document
    Dim wdRange As Word.Range

    On Error Resume Next
    Set myMail = Application.CreateItem(olMailItem)
    myMail.Subject = "Here's the latest..."
    myMail.Display
    Set myInspector = myMail.GetInspector
    Set wdDoc = myInspector.WordEditor
    If Not (wdDoc Is Nothing) Then
        Set wdRange = wdDoc.Range(0, wdDoc.Characters.Count)
        wdRange.Fields.Add Range:=wdRange, Type:=wdFieldEmpty, Text:= _
        "INCLUDETEXT  " & filePath, _
        PreserveFormatting:=True
    End If
End Sub
person Todd Main    schedule 08.06.2010