Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Indy IdAttachment, zu viele Paramenter ?? (https://www.delphipraxis.net/50147-indy-idattachment-zu-viele-paramenter.html)

hitmiccs 21. Jul 2005 09:14


Indy IdAttachment, zu viele Paramenter ??
 
Hallo.

Ich versuche gerade, mit IdAttachment (Indy 10) eine EMail mit Anhang zu verschicken, wenn ich aber
Delphi-Quellcode:
TIdAttachment.Create(msg.MessageParts,btDatei);
benutze kommt die Fehlermeldung: Zu viele Parameter...

Ich hab mit der Forensuche ein paar Beiträge mit diesem Thema gefunden und bei den anderen soll das so funktionieren, hier der Rest von der Mail-versende-Prozedur:
Delphi-Quellcode:
procedure Tbtagesbericht.send_per_mailClick(Sender: TObject);
var msg: TIdMessage;
   smtp: TIdSMTP;
   atta: TIdAttachment;
   pfad: string;
begin
  msg:=TidMessage.Create;
  smtp:=TidSMTP.Create(nil);
   msg.Clear;
   msg.Body.Text:='Archivdatei vom '+DatetoStr(Now);
   msg.From.Address := 'lalilu@gmx.de';
   msg.Recipients.EMailAddresses := 'lalilu@gmx.de';
   msg.Subject := 'Zeugs halt';
//   pfad:=ExtractFilePath('Maengeldatenbank.exe');
//   pfad:= pfad+btDateiname;

   TIdAttachment.Create(msg.MessageParts,btDatei);

   smtp.Host := 'mail.gmx.net';
   smtp.Username := 'lalilu@gmx.de';
   smtp.Password := 'gehtkeinenwasan';
   smtp.Port := 25;
   // Am Server Anmelden und abschicken
   SMTP.Connect;
   SMTP.Send(Msg);
   sleep(3000);
   showmessage('Datei wurde versendet!');
end;
Ohne die TIdAttachment-Geschichte funktioniert alles, die Mail kommt auch an, nur fehlt halt die Datei, und das wäre das wichtigste :(

Danke für evtl. Lösungsvorschläge!

:EDIT:

Ich hab jetzt auch mal folgenden Code ausprobiert:
Delphi-Quellcode:
Procedure SendMail(Subject,Mailtext,
                   FromName,FromAdress,
                   ToName,ToAdress,
                   AttachedFileName,
                   DisplayFileName:string;
                   ShowDialog:boolean);
var
  MapiMessage : TMapiMessage;
  MError     : Cardinal;
  Empfaenger : Array[0..1] of TMapiRecipDesc;
  Absender   : TMapiRecipDesc;
  Datei      : Array[0..1] of TMapiFileDesc;
begin
  with MapiMessage do begin
    ulReserved := 0;

    // Betreff
    lpszSubject := PChar(Subject);

    // Body
    lpszNoteText := PChar(Mailtext);

    lpszMessageType := nil;
    lpszDateReceived := nil;
    lpszConversationID := nil;
    flFlags := 0;

    // Absender festlegen
    Absender.ulReserved:=0;
    Absender.ulRecipClass:=MAPI_ORIG;
    Absender.lpszName:= PChar(FromName);
    Absender.lpszAddress:= PChar(FromAdress);
    Absender.ulEIDSize:=0;
    Absender.lpEntryID:=nil;
    lpOriginator := @Absender;

    // Empfänger festlegen (Hier: nur 1 Empfänger)
    nRecipCount := 1;

    Empfaenger[0].ulReserved:=0;
    Empfaenger[0].ulRecipClass:=MAPI_TO;
    Empfaenger[0].lpszName:= PChar(ToName);
    Empfaenger[0].lpszAddress:= PChar(ToAdress);
    Empfaenger[0].ulEIDSize:=0;
    Empfaenger[0].lpEntryID:=nil;
    lpRecips := @Empfaenger;

    // Dateien anhängen (Hier: nur 1 Datei)
    nFileCount := 1;

    // Name der Datei auf der Festplatte
    Datei[0].lpszPathName:= PChar(AttachedFilename);

    // Name, der in der Email angezeigt wird
    Datei[0].lpszFileName:= PChar(DisplayFilename);
    Datei[0].ulReserved:=0;
    Datei[0].flFlags:=0;
    Datei[0].nPosition:=Cardinal(-1);
    Datei[0].lpFileType:=nil;
    lpFiles := @Datei;

  end;

  // Senden
  if ShowDialog then
    MError := MapiSendMail(0, Application.Handle,
      MapiMessage, MAPI_DIALOG or MAPI_LOGON_UI, 0)
  else
    // Wenn kein Dialogfeld angezeigt werden soll:
    MError := MapiSendMail(0, Application.Handle, MapiMessage, 0, 0);

  Case MError of
    MAPI_E_AMBIGUOUS_RECIPIENT:
      MessageDlg('Empfänger nicht eindeutig. (Nur möglich, wenn Emailadresse nicht angegeben.)',mterror,[mbok],0);
   
    MAPI_E_ATTACHMENT_NOT_FOUND:
      MessageDlg('Datei zum Anhängen nicht gefunden',mterror,[mbok],0);
   
    MAPI_E_ATTACHMENT_OPEN_FAILURE:
      MessageDlg('Datei zum Anhängen konnte nicht geöffnet werden.',mterror,[mbok],0);

    MAPI_E_BAD_RECIPTYPE:
      MessageDlg('Empfängertyp nicht MAPI_TO, MAPI_CC oder MAPI_BCC.',mterror,[mbok],0);

    MAPI_E_FAILURE:
      MessageDlg('Unbekannter Fehler.',mterror,[mbok],0);

    MAPI_E_INSUFFICIENT_MEMORY:
      MessageDlg('Nicht genug Speicher.',mterror,[mbok],0);

    MAPI_E_LOGIN_FAILURE:
      MessageDlg('Benutzerlogin (z.B. bei Outlook) fehlgeschlagen.',mterror,[mbok],0);

    MAPI_E_TEXT_TOO_LARGE:
      MessageDlg('Text zu groß.',mterror,[mbok],0);

    MAPI_E_TOO_MANY_FILES:
      MessageDlg('Zu viele Dateien zum Anhängen.',mterror,[mbok],0);

    MAPI_E_TOO_MANY_RECIPIENTS:
      MessageDlg('Zu viele Empfänger angegeben.',mterror,[mbok],0);

    MAPI_E_UNKNOWN_RECIPIENT: MessageDlg('Empfänger nicht in Adressbuch gefunden. '+
     '(Nur möglich, wenn Emailadresse nicht angegeben.)',mterror,[mbok],0);

    MAPI_E_USER_ABORT:
      MessageDlg('Benutzer hat Senden abgebrochen oder MAPI nicht installiert.',mterror,[mbok],0);

    SUCCESS_SUCCESS:
      MessageDlg('Erfolgreich !!! (Aber Absenden nicht garantiert.)',mtinformation,[mbok],0);

  End;
end;
Jedoch kommt beim klick auf "Senden" ein fenster mit der Meldung: "Benutzer hat senden abgebrochen oder MAPI nicht installiert." Ich hab keine Ahnung was ich noch machen soll, will doch nur ne kleine Datei per Email verschicken :(

TStringlist 21. Jul 2005 17:41

Re: Indy IdAttachment, zu viele Paramenter ??
 
Hallo,

ist schon eine kleine Weile her, dass ich da mal mit Indy9 herumgekurvt bin, aber zur Not könnte man ja in der fraglichen Zeile auch den zweiten Parameter erstmal weglassen und den Filenamen (des zu attachenden Files) dann nachtragen:

Delphi-Quellcode:
with TIdAttachment.Create(msg.MessageParts) do begin
  Filename := APfad;
end;
Dann gibt's nämlich keine Compiler-Errors mehr, sondern nur noch mehr Warnungen ala:

[Warnung] Unit1.pas(50): W1020 Instanz von 'TIdAttachment' mit der abstrakten Methode 'TIdAttachment.OpenLoadStream' wird angelegt

Wenn du das Ganze dann startest, gibt's als nächstes eine Exception und zwar eben auch wieder von so einer ähnlich lautenden Klasse: EAbstractError ...was ja mehr oder weniger wieder gut zu den Warnungen davor passt. Wahrscheinlich werden also zum Stream-mäßigen Verpacken eines solchen Attachments Methoden benötigt, die diese Klasse noch nicht besitzt. Das ist also alles so ähnlich wie das Verhältnis zwischen TStrings und seinem Nachkommen: TStringlist. Ergo (wenn ich jetzt nichts gänzlichst auf dem Holzweg bin) müsste es dementsprechend also bei Indy10 event. ein Nachfolge-Objekt von TIdAttachment geben, welches diese davor noch fehlenden Methoden dann besitzt und für den normalen Anwendungszweck damit auch das geeignetere wäre. Leider habe ich aber momentan noch keine Indy10-Hilfe gedownloaded, so dass du event. also mal selbst +/- etwas in diese Richtung forschen müsstest.


PS. Ok, ich habe auch das noch schnell gemacht, weil's mich selbst mal wieder interessiert hat :-) ...und es war wie ich es vermutet hatte. Die Klasse die du dafür jetzt zu benutzten hast lautet nun: TIdAttachmentFile (...und zufälligerweise klappt es damit dann auch).

hitmiccs 3. Aug 2005 07:45

Re: Indy IdAttachment, zu viele Paramenter ??
 
Danke, TStringlist, das hat schon mal geholfen, nur leider bekomme ich jetzt, egal was ich eingebe, nen anderen Fehler...

Das Programm compiliert ohne Fehlermeldungen, wenn ich jetzt aber meinen Button klicke kommt der Fehler "Datei nicht gefunden. Das System konnte den angegebenen Pfad/Datei nicht finden."

Egal wo ich die Datei hintue, ins Programmverzeichnis, in nen extra Ordner, egal ob ich mit ExtractFilePath den Pfad hole oder ihn manuell eingebe, nix funktioniert... waaaaaaaahhhh, werd noch wahsinnig. Kannst du mir evtl. dabei auch noch helfen?

TStringlist 3. Aug 2005 13:06

Re: Indy IdAttachment, zu viele Paramenter ??
 
Also, bei mir funktionierte es eigentlich. Deine Schwierigkeiten kann mir jetzt auch nicht anders erklären, als dass du da vielleicht doch irgendwie einen winzigen Schreibfehler eingebaut hast. Event. öffnest du ja mal den Ordner in dem die jeweilige Datei liegt und kopierst dann aus der Adressleiste des Explorers dessen Adresse. Anschließend 'insert'est du sie einfach in deinen Quellcode, noch einen Backslash dazu + dem Dateiname + der Datei-Extention und dann sollte es eigentlich klappen.

Ansonsten wüsste ich da jetzt im Moment auch nicht weiter.

FunkyGT 7. Sep 2005 14:37

Re: Indy IdAttachment, zu viele Paramenter ??
 
hallo,

versuch es doch mal mit

Delphi-Quellcode:
TIdAttachmentFile.Create(MessageParts,'c:\test.log');
ich hatte das gleiche problem, so funzt es bei mir

Gruß Funky

renekr 15. Feb 2006 20:54

Re: Indy IdAttachment, zu viele Paramenter ??
 
Hallo,
Ich habe mal eine Generelle Frage?

Wo oderwie binde ich das TIdAttachment ein?


Habe Indy 10 installeirt aber finde es nicht in den Componenten.

Edit:
Also ich habe nun die IdAttachmentFile in die uses rein und geht halbwegs.


danke


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:26 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz