[delphi/ole] De body van een Outlook item opvragen

Pagina: 1
Acties:
  • 181 views sinds 30-01-2008
  • Reageer

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 15-05 14:44

_Thanatos_

Ja, en kaal

Topicstarter
Ik ben een import vanuit Outlook aan het maken, waarbij niet alleen een aantal properties van een item nodig zijn, maar ook de body. Nou kom ik hierbij 2 problemen tegen:
  1. Als ik de Body property van een item opvraag, dan geeft ie de body als plaintext terug, ook al staat er RTF in. Dus, hoe krijg ik de RTF?
  2. Als ik de Body property opvraag in Outlook 2000/SP2, Outlook XP of nieuwer dan krijg je een waarschuwing dat iets e-mail adressen probeert te vergaren. Of je het dan voor n minuten wil toestaan, of blokkeren. Ik vraag helemaal geen e-mail adressen op!
Volgens MSDN heeft een "item" ook een HTMLBody property, maar als ik die opvraag bij (in mijn geval) een TaskItem, dan krijg ik een exception met de mededeling dat de HTMLBody methode niet bestaat. Met daarbij dat áls HTMLBody al de RTF naar HTML zou omzetten, dan moet ik het weer terugconverteren naar RTF, en dat wil ik eigenlijk voorkomen.

In al mijn wanhoop heb ik nog een RTFBody geprobeerd, maar die bestaat dus ook niet... Iemand een idee?

日本!🎌


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Misschien dat OutlookSpy je verder kan helpen.

We adore chaos because we like to restore order - M.C. Escher


  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 15-05 14:44

_Thanatos_

Ja, en kaal

Topicstarter
Daarmee kan ik ook alleen de Body property vinden. En ook als ik daarmee de Body property opvraag, krijg ik dat schermpje van dat iets e-mail adressen probeert te vergaren. Dat schermpje moet toch te onderdrukken zijn, want mijn applicatie is toch echt geen spyware...

En RTF lijkt ook nergens uit te halen te zijn, en toch zit er echt RTF in :?

日本!🎌


  • alt-92
  • Registratie: Maart 2000
  • Niet online

alt-92

ye olde farte

Dat schermpje moet toch te onderdrukken zijn, want mijn applicatie is toch echt geen spyware...
is niet door je externe app te onderdrukken, want dat zou het hele fundament onder die "beveiliging" onderuit trekken.
Er is wel een manier om dat te onderdrukken maar dan heb je het over een aangepaste Office install + exchange server + Office Resource Kit utilities...

ik heb een 864 GB floppydrive! - certified prutser - the social skills of a thermonuclear device


Verwijderd

Lees hier eens:
http://www.dimastr.com/redemption/

Is een methode om van dat schermpje af te komen, andere methode is wat lastiger moet je een dll bouwen, die je laat signen etc.

Die HTML/RTF zal waarschijnlijk als attachment in de mail staan, of heb je misschien niet alle body parts bekeken?

[ Voor 25% gewijzigd door Verwijderd op 02-05-2004 22:05 ]


  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 15-05 14:44

_Thanatos_

Ja, en kaal

Topicstarter
Ah, ik zie dat je met Redemption ook de RTF body kan lezen. Wat cool 8)

日本!🎌


  • martijn_brinkers
  • Registratie: November 2001
  • Laatst online: 31-10-2025
De enige manier om onder deze security meldingen uit te komen wat onder alle omstandigheden werkt is door gebruik te maken van extended mapi. Die redemption library van Dmitry is een COM wrapper die de interface van Outlook nabootst maar onderhuids gebruik maakt van extended mapi.

  • RAPWare
  • Registratie: April 2002
  • Laatst online: 24-05 09:45
_Thanatos_ schreef op 02 mei 2004 @ 16:35:In al mijn wanhoop heb ik nog een RTFBody geprobeerd, maar die bestaat dus ook niet... Iemand een idee?
Heb je al eens naar Easy MAPI gekeken? Easy MAPI is een native Delphi Componentset rondom de Extended MAPI interfaces, waarmee je o.a. de RTF text, HTML text en plain text van messages kunt opvragen

Je kunt meer info vinden op :
http://www.rapware.nl/pro...age1.asp?SubMenu=EasyMAPI

Peter
p.wolters@rapware.com
http://www.rapware.com/

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 15-05 14:44

_Thanatos_

Ja, en kaal

Topicstarter
Heb je al eens naar Easy MAPI gekeken?
€€€!

日本!🎌


  • RAPWare
  • Registratie: April 2002
  • Laatst online: 24-05 09:45
Voor $49,- (=€ 41,53) heb je een Easy MAPI Lite licentie. Deze bevat alle functionaliteit. Je krijgt dan alleen geen sources.

De Outlook Redemption objecten kosten $199,-. Je hebt dan ook geen source en het is geen Delphi.

Peter.

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 15-05 14:44

_Thanatos_

Ja, en kaal

Topicstarter
Mja, nu je het zegt, het is idd die redistributable version die ik nodig heb, en geld kost... Beetje zonde voor een freeware-project.

Maar ik begrijp dat het dus ook in native Delphi kan, met EMAPI? Is dat makkelijk aan te spreken?

日本!🎌


  • martijn_brinkers
  • Registratie: November 2001
  • Laatst online: 31-10-2025
Makkelijk wil ik niet zeggen, moeilijk echter ook niet :). Kijk op de site van Dmitry voor delphi extended mapi wrappers. Daar kom je een heel eind mee. Verder is het vooral veel experimenteren want er is heel veel niet of slecht gedocumenteerd.

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 15-05 14:44

_Thanatos_

Ja, en kaal

Topicstarter
och, het gaat me alleen om de RTF body zonder dat ik die "beveiligings"melding krijg. Voor de rest kan ik volgens mij gewoon de standaard OLE-functionaliteit van Outlook gebruiken...

日本!🎌


  • RAPWare
  • Registratie: April 2002
  • Laatst online: 24-05 09:45
TijnFLiP schreef op 05 mei 2004 @ 15:40:
Makkelijk wil ik niet zeggen, moeilijk echter ook niet :). Kijk op de site van Dmitry voor delphi extended mapi wrappers. Daar kom je een heel eind mee. Verder is het vooral veel experimenteren want er is heel veel niet of slecht gedocumenteerd.
Ik zou het eerder andersom willen zeggen.

De RTF text uitlezen is alles behalve makkelijk. Dit vereist behoorlijk wat MAPI kennis. Verder is de documentatie hierover juist erg goed.

http://msdn.microsoft.com..._opening_message_text.asp

http://msdn.microsoft.com...ook_pr_rtf_compressed.asp

Verder moet je er wel rekening mee houden dat de RTF tekst ook RTF gecodeerde HTML kan bevatten.

Peter.

  • martijn_brinkers
  • Registratie: November 2001
  • Laatst online: 31-10-2025
De RTF text uitlezen is alles behalve makkelijk. Dit vereist behoorlijk wat MAPI kennis. Verder is de documentatie hierover juist erg goed.
Kan jij me dan vertellen waar staat uitgelegd hoe de HTML is gecodeerd in de RTF? ;-)

Er is wel wat documentatie over maar dat is voorzover ik weet niet volledig. Bijv. hoe om te gaan met verschillende codepages. Een goede RTF -> HTML converter vraagt toch e.e.a ge-experimenteer.

M'n punt ging eigenlijk meer over MAPI in het algemeen in combinatie met Outlook. Het enige verschenen boek hierover is niet meer leverbaar.

  • RAPWare
  • Registratie: April 2002
  • Laatst online: 24-05 09:45
TijnFLiP schreef op 06 mei 2004 @ 08:58:Kan jij me dan vertellen waar staat uitgelegd hoe de HTML is gecodeerd in de RTF? ;-)
Officieel ondersteunt MAPI geen HTML (zie: http://support.microsoft.com/?id=268440).

Dit wil echter niet zeggen dat je geen HTML boodschappen kunt versturen en/of ontvangen. Je moet alleen dezelfde truuk toepassen die Microsoft zelf ook gebruikt. Aangezien dit een MS truuk is en geen standaard MAPI is dit dus ook niet gedocumenteerd.

Met een beetje reverse engineering ben je er echter vrij snel achter hoe de truuk werkt.

Peter.

  • martijn_brinkers
  • Registratie: November 2001
  • Laatst online: 31-10-2025
Officieel ondersteunt MAPI geen HTML (zie: http://support.microsoft.com/?id=268440).
Dat was m'n hele punt. Soms zal je, om een goede plugin te maken voor outlook, gebruik moeten maken van niet gedocumenteerd features. Iets dat microsoft ook doet. Is niet moeilijk maar wel veel (uitzoek) werk.

Btw. Zit er bij easy mapi ook een RTF naar Html converter? dus die uit de RTF de embedded Html haalt? en zo ja kan deze ook omgaan met verschillende code pages (dus thai, chinees etc.)?

  • RAPWare
  • Registratie: April 2002
  • Laatst online: 24-05 09:45
dus die uit de RTF de embedded Html haalt?
Ja. Je krijgt de HTML source als messagetext geretourneerd.
En als je een HTML messagetext zet (bij een nieuwe message) wordt deze naar RTF-Encoded-HTML gecodeerd.
en zo ja kan deze ook omgaan met verschillende code pages (dus thai, chinees etc.)?
Hier heb ik nog nooit naar gekeken. Als je mij een voorbeeld HTML message stuurt (een gezipped .msg file) dan kan ik er wel even naar kijken.

Peter.

  • DPLuS
  • Registratie: April 2000
  • Niet online

DPLuS

 

Om de beveiligingswaarschuwingen te omzeilen heb ik gebruik gemaakt van de ClickYes tool:
http://www.express-soft.com/mailmate/clickyes.html

Op de site vind je ook voorbeelden hoe je dit moet implementeren in je code, zoals bijv. in Delphi:

Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
procedure SomeProc;
var
  wnd: HWND;
  uClickYes: UINT;

begin
// Register a message to send
  uClickYes:=RegisterWindowMessage('CLICKYES_SUSPEND_RESUME');

// Find ClickYes Window by classname
  wnd:=FindWindow('EXCLICKYES_WND',nil);

// Send the message to Resume ClickYes
  SendMessage(wnd, uClickYes, 1, 0);

// ...
// Do some Actions
// ...

// Send the message to Suspend ClickYes
  SendMessage(wnd, uClickYes, 0, 0);

end; 



En omdat ik het irritant vond dat het icoontje van clickyes maar in de taakbalk bleef staan, terwijl mijn eigen VB-app niet actief was, post ik maar meteen de VB code waarin te zien is hoe ik het ClickYes tooltje automatisch start en sluit bij het sturen van een e-mail...
Moet je zelf maar converteren naar Delphi, maar zal geen probleem zijn...

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
Private Sub Command1_Click()

Dim blnDoOutlook As Boolean
blnDoOutlook = False

On Error Resume Next

Set objOutlook = GetObject(, "Outlook.Application")

If Err.Number = 429 Then 'If objOutlook Is Nothing Then
    Set objOutlook = CreateObject("Outlook.Application")
    blnDoOutlook = True
End If

On Error GoTo 0

If blnDoOutlook = True Then
    objOutlook.Explorers.Add(objOutlook.Explorers.Application.GetNamespace("MAPI").GetDefaultFolder(olFolderOutbox), olFolderDisplayNormal).Display
    objOutlook.ActiveExplorer.WindowState = olMinimized
End If

Dim Retval As Long
Retval = ShellExecute(Me.hwnd, "open", App.Path & "\ClickYes.exe", vbNullString, App.Path, vbMinimizedNoFocus)
If Retval <= 32 Then
    MsgBox "ClickYes.exe was not started succesfully!", vbCritical
End If

Set objMail = objOutlook.CreateItem(olMailItem)
objMail.Recipients.Add(txtEmail).Type = olTo
objMail.Subject = "Test E-mail"
objMail.Send

Set objMail = Nothing

If blnDoOutlook = True Then
    objOutlook.ActiveExplorer.Close
    objOutlook.Quit
    blnDoOutlook = False
End If

Set objOutlook = Nothing

Dim lpClassName As String
Dim lpCaption As String
Dim Handle As Long
Const WM_DESTROY = &H2 ' CLICKYES proces sluit alleen via WM_DESTROY
'Const WM_CLOSE = &H10 ' Emuleert ALT+F4

lpClassName = "EXCLICKYES_WND"
lpCaption = vbNullString

'Determine the handle to the window.
Handle = FindWindow(lpClassName$, lpCaption$)

If Handle <> 0 Then
    'Post a message to window to end its existence.
    PostMessage Handle, WM_DESTROY, 0&, 0&
Else
    MsgBox "No handle found for window: EXCLICKYES_WND", vbCritical
End If

Command1.Caption = "Verstuurd!"
Screen.MousePointer = vbDefault

End Sub


HTH

[ Voor 60% gewijzigd door DPLuS op 06-05-2004 16:07 ]


  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 15-05 14:44

_Thanatos_

Ja, en kaal

Topicstarter
Op zich wel een leuke hack, dat ClickYes ding >:)

Maar begreep ik nou goed dat je met Easy MAPI ook de RTF body kan opvragen? HTML is trouwens niet van belang, omdat het om taakitems gaat. Daar kan vgs mij geen HTML in...

日本!🎌


  • RAPWare
  • Registratie: April 2002
  • Laatst online: 24-05 09:45
_Thanatos_ schreef op 07 mei 2004 @ 12:52:Maar begreep ik nou goed dat je met Easy MAPI ook de RTF body kan opvragen? HTML is trouwens niet van belang, omdat het om taakitems gaat. Daar kan vgs mij geen HTML in...
Ja... je kunt met behulp van Easy MAPI de RTF body opvragen.

Easy MAPI V2:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
procedure SetRTFMesasgeText(ATask: TRwIPMTask);
var
  MemStream: TMemoryStream;
begin
  MemStream := TMemoryStream.Create;
  try
    ATask.SaveMessageTextToStream(MemStream, mtofMessageFormat);
    MemStream.Position := 0;
    if ATask.MessageFormat = mfRTF then 
      MemoRTFText.Lines.LoadFromStream(MemStream);
  finally
    MemStream.Free;
  end;
end;


Easy MAPI V3
code:
1
2
3
4
5
6
7
8
procedure SetRTFMesasgeText(ATask: IRwIPMTask);
var
  MessageTextFormat: TRwMapiMessageTextFormat;
begin
  MsgText := ATask.GetMessageText(MessageTextFormat);
  if MessageTextFormat = mtfRTF then
    MemoRTFText.Text := MsgText;
end;
Pagina: 1