Newsgroup: it.comp.lang.delphi
Titolo: Domande veloci MAPI

Ciao, sto usando MAPI per inviare mail tramite il client di posta.
Chiamo la funzione
SendMail(const Subject, Body, FileName,
                  SenderName, SenderEMail,
                  RecipientName, RecipientEMail: string): Integer;
1) a cosa servono i campi sender se poi vengono sempre utilizzati i
dati dell'account impostato sul client di posta ?
2) come faccio ad assocaire piu di un allegato ?
3) Come posso andare a capo nel body ?
Grazie

Nessuno mi aiuta ?
Dove trovo una funzione che gestisca piu allegati usando MAPI ?

 Dove trovo una funzione che gestisca piu allegati usando MAPI ?
guarda il componente TJvMapiMail delle Jedi. Funziona tra l'altro anche con 
Win7, a differenza di quello che hai postato.
Sandra 

 Sandra
Ora guardo grazie
Con il seguente codice riesco a gestire piu allegati ma forse ha
problemi con win7 !
function TFGestDoc.SendEMail(Handle: THandle; Mail: TStrings):
Cardinal;
type
  TAttachAccessArray = array [0..0] of TMapiFileDesc;
  PAttachAccessArray = ^TAttachAccessArray;
var
  MapiMessage: TMapiMessage;
  Receip: TMapiRecipDesc;
  Attachments: PAttachAccessArray;
  AttachCount: Integer;
  i1: integer;
  FileName: string;
  dwRet: Cardinal;
  MAPI_Session: Cardinal;
  WndList: Pointer;
begin
  dwRet := MapiLogon(Handle,
    PChar(''),
    PChar(''),
    MAPI_LOGON_UI or MAPI_NEW_SESSION,
    0, @MAPI_Session);
  if (dwRet <> SUCCESS_SUCCESS) then
  begin
    MessageBox(Handle,
      PChar('Error while trying to send email'),
      PChar('Error'),
      MB_ICONERROR or MB_OK);
  end
  else
  begin
    FillChar(MapiMessage, SizeOf(MapiMessage), #0);
    Attachments := nil;
    FillChar(Receip, SizeOf(Receip), #0);
    if Mail.Values['to'] <> '' then
    begin
      Receip.ulReserved := 0;
      Receip.ulRecipClass := MAPI_TO;
      Receip.lpszName := StrNew(PChar(Mail.Values['to']));
      Receip.lpszAddress := StrNew(PChar('SMTP:' + Mail.Values
['to']));
      Receip.ulEIDSize := 0;
      MapiMessage.nRecipCount := 1;
      MapiMessage.lpRecips := @Receip;
    end;
    AttachCount := 0;
    for i1 := 0 to MaxInt do
    begin
      if Mail.Values['attachment' + IntToStr(i1)] = '' then
        break;
      Inc(AttachCount);
    end;
    if AttachCount > 0 then
    begin
      GetMem(Attachments, SizeOf(TMapiFileDesc) * AttachCount);
      for i1 := 0 to AttachCount - 1 do
      begin
        FileName := Mail.Values['attachment' + IntToStr(i1)];
        Attachments[i1].ulReserved := 0;
        Attachments[i1].flFlags := 0;
        Attachments[i1].nPosition := ULONG($FFFFFFFF);
        Attachments[i1].lpszPathName := StrNew(PChar(FileName));
        Attachments[i1].lpszFileName :=
          StrNew(PChar(ExtractFileName(FileName)));
        Attachments[i1].lpFileType := nil;
      end;
      MapiMessage.nFileCount := AttachCount;
      MapiMessage.lpFiles := @Attachments^;
    end;
    if Mail.Values['subject'] <> '' then
      MapiMessage.lpszSubject := StrNew(PChar(Mail.Values
['subject']));
    if Mail.Values['body'] <> '' then
      MapiMessage.lpszNoteText := StrNew(PChar(Mail.Values['body']));
    showmessage(MapiMessage.lpszNoteText);
    WndList := DisableTaskWindows(0);
    try
    Result := MapiSendMail(MAPI_Session, Handle,
      MapiMessage, MAPI_DIALOG, 0);
    finally
      EnableTaskWindows( WndList );
    end;
    for i1 := 0 to AttachCount - 1 do
    begin
      StrDispose(Attachments[i1].lpszPathName);
      StrDispose(Attachments[i1].lpszFileName);
    end;
    if Assigned(MapiMessage.lpszSubject) then
      StrDispose(MapiMessage.lpszSubject);
    if Assigned(MapiMessage.lpszNoteText) then
      StrDispose(MapiMessage.lpszNoteText);
    if Assigned(Receip.lpszAddress) then
      StrDispose(Receip.lpszAddress);
    if Assigned(Receip.lpszName) then
      StrDispose(Receip.lpszName);
    MapiLogOff(MAPI_Session, Handle, 0, 0);
  end;
end;

 problemi con win7 !
scusami, errore mio prima, non intendevo dire Win 7, ma invece D2009/2010, 
cio� le versioni unicode di Delphi, dove le FillChar cos� come le hai 
postate tu non funzionano, per via della differente gestione delle stringhe. 
Meglio andare su un componente testato e aggiornato che dover poi rivedere a 
mano il codice qualora dovessi upgradarti ad un Delphi superiore.
Per quanto riguarda Win7, il problema principale � che, a meno che non lo 
installi tu a manina, non ha nessun client di posta (tantomeno MAPI) nel 
sistema. E questo � comunque, a prescindere da Delphi, un p� un problema ;) 
tienilo presente, ed eventualmente valuta l'invio tramite Outlook o diretto 
tramite SMTP.
Sandra 

Grazie mille, mi sai dare un link dove trovo un esempio per quellla
libreria di jedi ?

 libreria di jedi ?
gli esempi vengono installati con la JVCL
Sandra 

 sistema. E questo è comunque, a prescindere da Delphi, un pò un problema ;)
Se non erro esiste, ma non outlook express...
Mi pare che si chiami Windows Mail.
A.

 ha scritto nel messaggio 
news:c90c9046-683d-436b...@36g2000yqu.googlegroups.com...
---
Se non erro esiste, ma non outlook express...
Mi pare che si chiami Windows Mail.
---
Windows Mail � la versione per Vista del vetusto OE, e per Win7 non � in 
dotazione (anche se pu� essere installato con un p� di smanettamento, vedi 
google).
Per Win7 ci sarebbe Windows Live Mail che, a parte il fatto che � una vera 
porcheria e fa enormi pasticci nell'importare messaggi da una vecchia 
installazione di WMail o OE, non � MAPI. Probabilmente Microsoft con Win7 
vorrebbe spingere la gente a migrare a Office e Outlook (che non � MAPI 
nemmeno lui, tra l'altro, ma pu� essere gestito tramite COM)
Sandra 

 google).
no grazie!
1) per almeno 6 mesi non usero win7... Aspetto che il parco buoi
palnetario faccia da beta tester.. :-D
2) non uso ne OE ne altri client di posta di Microsoft...
Uso solo thunderbird in ufficio xche DEVO. Altrimenti ormai vado via
webmail.
E' un po che non tozzo su invio di email.
Quando ho dovuto farlo usavo Indy e mi attaccavo direttamente ai
server pop3, smtp/imap bypassando mapi e clients di posta vari.. Non
puoi mai sapere cosa usa un cliente..
A.

Ciao, purtroppo devo consegnare il lavoro a breve e per il momento
devo mantenere il codice che ho messo sopra se possibile.
Funziona correttamente con Outlook Express ma non con Thunderbird in
quanto la funzione MapiSendMail mi resituisce sempre 0 (email inviata
correttamente) anche se invece di inviare il messaggio chiudo la
finestra di nuovo messaggio.
Sapete come mai e come posso risolvere ?

 Sapete come mai e come posso risolvere ?
In google veritas:
http://kb.mozillazine.org/MAPI_Support

Anche con thunderbird predefinito non funziona .... e non riesco
nemmmeno a compilare gli esempi della JVCL perchè mi da errore :-(

 nemmmeno a compilare gli esempi della JVCL perchè mi da errore :-(
Sei un utente finale? Hai sbagliato ng....
A.

Ho scaricato la versione completa da qui
http://sourceforge.net/projects/jvcl/files/
Ho due cartelle: JCL e JVCL
che devo fare ora ?
Se clicco su install ho errori
Se per utente finale ti riferisci ad utente un po imepdito è cosi ....

> Se clicco su install ho errori
ANCORA?? CI PRENDI PER IL CULO??
DOBBIAMO ANDARE A LOURDES E PREGARE LA MADONNA DI FARCI IL MIRACOLO DI
FARTI SCRIVERE I FOTTUTI ERRORI CHE OTTIENI?? E CHE CAZZO!
A.


Alberto, Posso capire che uno si arrabbi perchï¿œ viene trollato.. ma se 
ti irrita in questo modo, forse e' meglio che lo ignori.. a che serve 
alzare i toni cosï¿œ ? :-)
E poi, per favore, non usare il maiuscolo... :-O
"Don't feed Alberto."
:-D
-- 
Morde

> "Don't feed Alberto."
Touche'. Anzi, TOUCHE'.
Rotfl.
A.

Ho risolto l'installazione seguendo questo link a chi interessa
http://www.festra.com/wwwboard/messages/13303.html

Utilizzando questa porzione di codice preso dagli esempi funziona però
per ora ho lo stesso problema che avevo prima con thunderbird.
Io ho bisogno di settare un ordine come inviato o no e devo
intercettare il caso in cui, una volta aperto il nuovo messaggio sul
client di posta, non venga inviato ma cancellato
JvMail1.Clear;
JvMail1.Recipient.AddRecipient('
pi...@gmail.com
');
//if CcEdit.Text <> '' then JvMail1.CarbonCopy.AddRecipient
(CcEdit.Text);
JvMail1.Subject := 'test';
JvMail1.Body.Text := 'test';
JvMail1.Attachment.add(ExtractFilePath(Application.ExeName) + 'Stampe
\ordine_1.pdf');
JvMail1.SendMail;
Devo solo capire come fare ...

Ok.
A.

 client di posta, non venga inviato ma cancellato
Detto senza mezzi termini, non ho capito un tubazzo.
A.


Non riesco a trovare nulla, sendMail non restituisce nulla !
Allora
1) schermata con dati ordine
2) click sul bottone invia mail (contenente dati ordine)
3) mi si apre un nuovo messaggio in outlook express con tutti i campi
prevalorizzati da codice
4) a questo punto l'utente ha sostanzialmente due possibilitaà
  a) premere su invio
  b) chiuderela finestra non salvando nemmeno il messaggio come bozza
Quello che devo fare è
caso a --> settare flag ordine inviato a true
caso b --> settare flag ordine inviato a false

 caso b --> settare flag ordine inviato a false
Secondo me da OE non lo fai.
A.


Ci sono riuscito con la funzione sendmail postata all'inizio che mi
restitusice
0  nel caso a
1  nel caso b
Però questo solo in OE; con Thunderbird ad es mi restituisce sempre e
comunque 0

 comunque 0
..ma il link che ho postato ieri..?
A.

 comunque 0
evidentemente Thunderbird non ha la stessa gestione di OE del protocollo 
MAPI. Puoi segnalare la cosa al supporto di Thunderbird, oppure dire al 
cliente di usare OE, non mi pare ci siano altre soluzioni, a parte scriverti 
tu, a manina, un client email.
Sandra

 manina, un client email.
Mi sembra di ricordare che nei demo forniti con delphi/indy ci sia un 
client di email giï¿œ implementato. Googlando si trovano client email giï¿œ 
pronti in delphi.
Sarebbe la strada migliore, imho, in quanto l'OP avrebbe il controllo 
delle logiche da applicare all'invio.
Ciao
-- 
Morde

 Morde
Ho già realizzato un client come dice qui tramite componenti INDY
http://www.devarticles.com/c/a/Delphi-Kylix/Creating-an-Email-Client-with-Borland-Delphi/
Ma il cliente dice che ha problemi di invio mail con il suo server ...
provo a ritornare su questa soluzione.
Grazie !!

 provo a ritornare su questa soluzione.
Fatti dire quali problemi e di che natura ha il cliente con il suo 
server.. perchï¿œ un client per sua stessa natura non dovrebbe dare 
problemi specifici: lui parla tramite il protocollo smtp al server, 
pertanto non capisco quali problemi possano esserci che tu usi un 
client fatto da te o acquistato a 300 euro..
Approfondisci.
ciao
-- 
Morde

 3) Come posso andare a capo nel body ?
Inserisci degli "\n" o dei caratteri #13 o #10  (CR LF)
Ultima nota TJvMapiMail non funzia con "Outsuk" per diversi motivi.
Primo dei quali il MAPI a cui si riferisce è quello "Simpled". Outsuk
usa invece Extended MAPI, una tech. proprietaria (non uso altri
aggettivi) e poco documentata di M$.
Gp

 Grazie !!
Con il mio server di posta ovviamente funziona tutto correttamente,
forse il problema è dovuto al fatto che il loro server richiede una
autenticazione :-(
Faccio cosi
SMTP.Host := '
authsmtp.pippo.it
';
SMTP.AuthenticationType := atLogin;
SMTP.Username := '
sm...@pippo.it
';
SMTP.Password  := 'pluto';
SMTP.Port := 25;
SMTP.Connect(1000);
SMTP.Send(MailMessage);

 email come appena sopra ?
pu� essere che il suo server richieda l'SSL, come ad esempio fa gmail. 
Altrimenti non so, almeno finch� sto tizio non ti dice che problemi ha nello 
specifico. Digli che sei un programmatore, e che se vuole un indovino 
accenda qualche tv locale e si metta a chiamare gli 899 ;)
Sandra 

 Sandra
Eh ma allora come mai con certi tipi di connessione funziona
correttamente ?
ora mi faccio dire che errore viene visualizzato !!

> ora mi faccio dire che errore viene visualizzato !!
Alla fine ci siamo arrivati....
A.

 ora mi faccio dire che errore viene visualizzato !!
Ascolta, qui siamo in un newsgroup usenet, non in una chat dove ogni 30 
secondi scrivi quello che ti passa per la testa.
Se facessimo tutti cosï¿œ, il ng si popolerebbe di messaggini alla 
twitter.. in gergo si chiama "rumore" perchï¿œ nasconde la materia 
tecnica che ï¿œ sempre il TOPIC al quale dobbiamo tendere.
Quindi, il mio consiglio ï¿œ di evitare di mandare messaggi privi di 
contenuti e spunti, tipo questo a cui sto rispondendo.
Ciao
-- 
Morde