[delphi] e-mail bericht opstellen

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

  • banaan-X
  • Registratie: Februari 2001
  • Niet online
Het kan dus wel! (http://gathering.tweakers.net/forum/list_messages/233155/1?limit=25)

Namelijk met MapiMessage (uses Mapi):
code:
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
procedure TWin2kAppForm.FileSend1Execute(Sender: TObject);
var
  MapiMessage: TMapiMessage;
  MError: Cardinal;
begin
  with MapiMessage do
  begin
    ulReserved := 0;
    lpszSubject := nil;
    lpszNoteText := PChar(RichEdit1.Lines.Text);
    lpszMessageType := nil;
    lpszDateReceived := nil;
    lpszConversationID := nil; 
    flFlags := 0;
    lpOriginator := nil;
    nRecipCount := 0;
    lpRecips := nil;
    nFileCount := 0;
    lpFiles := nil;
  end;

  MError := MapiSendMail(0, Application.Handle, MapiMessage,
    MAPI_DIALOG or MAPI_LOGON_UI or MAPI_NEW_SESSION, 0);
  if MError <> 0 then MessageDlg(SSendError, mtError, [mbOK], 0);
end;

Dit komt uit een voorbeeld van Delphi. En deze code werkt goed.

Dus ik leuk al die waardes invullen:
code:
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
/////////// Stuur mail procedure /////////

procedure Tform1.StuurMail(var bestandsnaam : String);
var
  MapiMessage: TMapiMessage;
  MError: Cardinal;
  Geadresseerde : PMapiRecipDesc;
  Bijlagen : PMapiFileDesc;
begin

  Geadresseerde.lpszName := 'Systeem Administrator';
  Geadresseerde.lpszAddress := 'SMTP:xxx@hccnet.nl';
  Bijlagen.lpszPathName := PChar(bestandsnaam);
  Bijlagen.lpszFileName := 'antwoorden.dat';

  with MapiMessage do
  begin
    ulReserved := 0;
    lpszSubject := 'antwoorden';
    lpszNoteText := 'Uw gegevens zijn opgenomen en klaar om te versturen'+#13+'U kunt dit bericht nu versturen';
    lpszMessageType := nil;
    lpszDateReceived := nil;
    lpszConversationID := nil;
    flFlags := 0;
    lpOriginator := nil;
    nRecipCount := 1;
    lpRecips := Geadresseerde;
    nFileCount := 1;
    lpFiles := Bijlagen;
  end;

  MError := MapiSendMail(0, Application.Handle, MapiMessage,
    MAPI_DIALOG or MAPI_LOGON_UI or MAPI_NEW_SESSION, 0);
  if MError <> 0 then MessageDlg('Het opstellen van een e-mailbericht is helaas mislukt'+#13+'Stuur uw gegevens handmatig op.', mtError, [mbOK], 0);
end;

bevat: GetCurrentDir + '\' + filename

Nu crasht ie op deze regel: " Bijlagen.lpszPathName := PChar(bestandsnaam);"

Dus dan haal ik dat attachment eruit. Maar dan doet het nog steeds niet... Ik krijg "Het opstellennen van een ...".

Waarom werkt t nou niet als ik alles mooi invul? :(

  • banaan-X
  • Registratie: Februari 2001
  • Niet online
Na wat uittesten kan ik melden dat hij die melding niet geeft als ik de geadresseerde op nil zet. Dus daar zit een fout, maar wat?

[update]

inmiddels dit ervan gemaakt:
code:
1
2
3
  Geadresseerde.lpszName := PChar('Systeem Administrator');
  Geadresseerde.lpszAddress := PChar('SMTP:petxx@hccnet.nl');
  Geadresseerde.ulRecipClass := 1;

(en de attachments nog even uit), nu start het nieuwe bericht wel, dut kun je ook versturen, maar als dat gebeurt is crasht het programma weer... Runtimer error 216 (AccessViolation)
Misschien dat ik de andere waarde in de Geadresseerde ooko nog in moet vullen. Deze zijn:
ulEIDSize
The size, in bytes, of the entry identifier pointed to by the lpEntryID member.
lpEntryID
Pointer to an opaque entry identifier used by a messaging system service provider to identify the message recipient. Entry identifiers have meaning only for the service provider; client applications will not be able to decipher them. The messaging system uses this member to return valid entry identifiers for all recipients or senders listed in the address book.
Ik snap alleen niet wat ik daar in moet vullen, hij moet gewoon een standaard bericht versturen.

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:39
Heb het toch in die vorige post gezegd dat je het met de MAPI moest doen?

https://fgheysels.github.io/


  • banaan-X
  • Registratie: Februari 2001
  • Niet online
Op woensdag 26 september 2001 22:59 schreef whoami het volgende:
Heb het toch in die vorige post gezegd dat je het met de MAPI moest doen?
Dat kan ik niet ontkennen :) Maar er werd mij daar ook zo veel dingen aangeraden dat ik er niet meer uitkwam...

Maar goed, enig idee waarom het programma crasht na afsluiten (kom ik net achter) als Geadresseerde of Bijlage wordt opgenomen in de functie? of misschien waarom de manier waarop ik nu attachments opneem niet kan?

[update]
Ik krijg trouwens deze warning: "[Warning] wpenq.pas(332): Variable 'Geadresseerde' might not have been initialized". Zou dat er iets mee te maken hebben?

Verwijderd

Jouw variabele 'Geaddresseerde' is van het type PMapiRecipDesc, wat een pointer is [kun je zien aan de P*] naar een record van type TMapiRecipDesc.

Dus Geaddresseerde wijst naar een geheugenlocatie waar een record van type TMapiRecipDesc [zou moeten] staat. Maar omdat jij niets gealloceerd of geinitialiseerd hebt wijst Geaddresseerde naar een of andere geheugenplaats waar je geen toegang tot hebt, wat resulteert in een access violation.

Oplossing: maak de variable Geaddresseerde van het type TMapiRecipDesc, en als je een pointer nodig hebt gebruik je @Geaddresseerde dus bv:
code:
1
MapiMessage.lpRecips := @Geaddresseerde

Misschien moet je hem nog typecasten; doe dan PMapiRecipDesc(@Geaddresserde).

Voor de variabele Bijlagen natuurlijk hetzelfde verhaal.

  • banaan-X
  • Registratie: Februari 2001
  • Niet online
Op woensdag 26 september 2001 23:48 schreef DiFool het volgende:
Jouw variabele 'Geaddresseerde' is van het type PMapiRecipDesc, wat een pointer is [kun je zien aan de P*] naar een record van type TMapiRecipDesc.

Dus Geaddresseerde wijst naar een geheugenlocatie waar een record van type TMapiRecipDesc [zou moeten] staat. Maar omdat jij niets gealloceerd of geinitialiseerd hebt wijst Geaddresseerde naar een of andere geheugenplaats waar je geen toegang tot hebt, wat resulteert in een access violation.

Oplossing: maak de variable Geaddresseerde van het type TMapiRecipDesc, en als je een pointer nodig hebt gebruik je @Geaddresseerde dus bv:
code:
1
MapiMessage.lpRecips := @Geaddresseerde

Misschien moet je hem nog typecasten; doe dan PMapiRecipDesc(@Geaddresserde).

Voor de variabele Bijlagen natuurlijk hetzelfde verhaal.
Ik heb er nu dit van gemaakt:
code:
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
procedure Tform1.StuurMail(var bestandsnaam : String);
var
  MapiMessage: TMapiMessage;
  MError: Cardinal;
  Geadresseerde : PMapiRecipDesc;
  Bijlagen : PMapiFileDesc;
begin

  Geadresseerde.lpszName := PChar('Systeem Administrator');
  Geadresseerde.lpszAddress := PChar('SMTP:fdg@hccnet.nl');
  Geadresseerde.ulRecipClass := 1;

//  Bijlagen.ulReserved := 0;
  // If neither flag is set, the attachment is treated as a data file. Bijlagen.flFlags
//  Bijlagen.nPosition := 86;
//  Bijlagen.lpszPathName := PChar(bestandsnaam);
//  Bijlagen.lpszFileName := 'antwoorden.dat';
//  Bijlagen.lpFileType := nil;

  with MapiMessage do
  begin
    ulReserved := 0;
    lpszSubject := pChar('WorkPace Enquete antwoorden');
    lpszNoteText := PChar('Uw gegevens zijn opgenomen en klaar om te versturen. Vergeet echter niet '+bestandsnaam+' als attachment op te nemen! U kunt dit bericht nu versturen.');
    lpszMessageType := nil;
    lpszDateReceived := nil;
    lpszConversationID := nil;
    flFlags := 0;
    lpOriginator := nil;
    nRecipCount := 1;
    lpRecips := PMapiRecipDesc(@Geadresseerde);
    nFileCount := 0;//1;
    lpFiles := nil;//PMapiFileDesc(Bijlagen);
  end;

  MError := MapiSendMail(0, Application.Handle, MapiMessage,
    MAPI_DIALOG or MAPI_LOGON_UI or MAPI_NEW_SESSION, 0);
  if MError <> 0 then MessageDlg('Het opstellen van een e-mailbericht is helaas mislukt'+#13+'Stuur uw gegevens handmatig op.' + InttoStr(MError), mtError, [mbOK], 0);
end;

Maar ik nou dit doe, of "lpRecips := (@Geadresseerde);" Nu stelt ie niet eens meer een e-mailbericht op, MError = 15 (in die popup dus).

En met deze regel: " @Geadresseerde.lpszName := PChar('Systeem Administrator');" kan ie niet compileren: "[Error] wpenq.pas(332): Left side cannot be assigned to"

Verwijderd

Ik zei:
Oplossing: maak de variable Geaddresseerde van het type TMapiRecipDesc, en als je een pointer nodig hebt gebruik je @Geaddresseerde dus bv:
Dus doe zoiets
code:
1
2
3
4
5
6
procedure Tform1.StuurMail(var bestandsnaam : String);
var
  MapiMessage: TMapiMessage;
  MError: Cardinal;
  Geadresseerde : TMapiRecipDesc;
  Bijlagen : TMapiFileDesc;

  • banaan-X
  • Registratie: Februari 2001
  • Niet online
Op donderdag 27 september 2001 09:42 schreef DiFool het volgende:
Ik zei:
[..]

Dus doe zoiets
code:
1
2
3
4
5
6
procedure Tform1.StuurMail(var bestandsnaam : String);
var
  MapiMessage: TMapiMessage;
  MError: Cardinal;
  Geadresseerde : TMapiRecipDesc;
  Bijlagen : TMapiFileDesc;
Oh... Ik was helemaal over die ene letter heengelezen... |:(
Ik ga het als ik weer thuis ben meteen proberen (zit nu nog op school).

  • banaan-X
  • Registratie: Februari 2001
  • Niet online
Op donderdag 27 september 2001 14:31 schreef banaan-X het volgende:

Ik ga het als ik weer thuis ben meteen proberen
Maar het werkt helaas niet. Ik heb Geadresseerde nu van het type TMapiRecipDesc gemaakt.

En vervolgens de lpRecips-regel vervangen:
"lpRecips := PMapiRecipDesc(Geadresseerde);"
(want zonder die cast geeft ie dus dat het incompatible types zijn)

(verder is alles hetzelfde)

Maar nu geeft ie nog weer een error:
"[Error] wpenq.pas(354): Invalid typecast". Wat nu te doen? :?

Verwijderd

code:
1
lpRecips := PMapiRecipDesc(@Geadresseerde);

Let op de @
Pagina: 1