Identificativo articolo: 312105 - Ultima modifica: venerdì 20 gennaio 2006 - Revisione: 3.0

How to Salvare i messaggi di posta elettronica di Outlook inviati in una cartella diversa da Posta inviata

Questo articolo è stato precedentemente pubblicato con il codice di riferimento I312105
Espandi tutto | Chiudi tutto

Sommario

In questo articolo viene descritto come automatizzare Microsoft Outlook 2002 per l'invio di messaggi di posta elettronica a livello di programmazione da Visual FoxPro (VFP) 7.0 e salvare tali messaggi in una cartella diversa da Posta inviata.

Informazioni

Gli sviluppatori creano spesso applicazioni in VFP per l'esecuzione di operazioni di posta elettronica globali. Dopo l'invio dei messaggi, è preferibile a volte salvarli in una cartella diversa dalla cartella predefinita Posta inviata. In questo modo i messaggi inviati dall'applicazione vengono mantenuti separati dagli altri messaggi inviati tramite lo stesso client, semplificandone la ricerca in un secondo tempo.

Sebbene sia possibile specificare a livello di programmazione una cartella in cui salvare i messaggi di posta elettronica inviati, tramite la costante CDO CdoPR_SENTMAIL_ENTRYID, l'impostazione viene ignorata perché la libreria CDO (1.x) codifica il valore inserito nel campo PR_SENTMAIL_ENTRYID specificando la cartella Posta inviata. Per ulteriori informazioni, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito:
192083  (http://support.microsoft.com/kb/192083/ ) PRB: Setting PR_SENTMAIL_ENTRYID in CDO (1.x) Is Not Retained
Per risolvere il problema, utilizzare il metodo COPYTO() dell'oggetto messaggio di posta elettronica per ricollocare il messaggio in una cartella scelta dall'utente prima dell'invio.

Il codice di esempio riportato di seguito consente di eseguire una copia del messaggio prima che venga inviato, anziché spostarlo o copiarlo dopo l'invio. Questa impostazione è dovuta al fatto che i messaggi di Outlook non vengono in genere inviati immediatamente, ma possono rimanere nella cartella Posta in uscita per un breve intervallo. Di conseguenza, il codice in esecuzione in un ciclo che si basa sul fatto che un messaggio sia inserito nella cartella predefinita Posta inviata potrebbe generare un errore.

Il solo inconveniente di questo approccio è il fatto che una copia del messaggio si troverà nella cartella alternativa Posta inviata anche se il messaggio non è stato inviato. Non si tratta tuttavia di un aspetto negativo grave, perché molto spesso gli utenti desiderano conservare i messaggi inviati per riferimento, non come prova dell'avvenuta consegna.

NOTA: il codice riportato di seguito è stato scritto e verificato con VFP 7.0. Con piccole modifiche funzionerà con qualsiasi versione di VFP. È stato verificato con Outlook 2002 da Microsoft Office XP, ma dovrebbe funzionare anche con Office 2000.

Con il codice di VFP 7.0 riportato di seguito verranno eseguite le seguenti operazioni:
  1. Accesso a MAPI.SESSION.
  2. Scrittura di un nuovo messaggio di posta elettronica.
  3. Ricerca nell'archivio messaggi dell'ID della cartella specificata dall'utente come cartella Posta inviata alternativa.
  4. Copia del messaggio in corso nella cartella Posta inviata alternativa e successivo invio del messaggio.
Per utilizzare questo esempio di codice, attenersi alla procedura descritta di seguito:
  1. Aprire Outlook, creare una nuova cartella e denominarla "My Sent Items". È possibile creare la cartella come sottocartella in un archivio messaggi qualsiasi.
  2. Copiare il codice sottostante in un nuovo programma in VFP 7.0.
  3. Salvare ed eseguire il programma.
*-----------------------------------
* AUTHOR:   Trevor Hancock
* CREATED:  12/05/01 11:58:05 AM
* ABSTRACT: This sample code sends an e-mail message to the address
*           you specify. It then saves this message to a folder other
*           than the default Sent Items Outlook folder.
*
*           To use this code, create a new folder in Outlook named
*           "My Sent Items". You can later rename this folder to anything
*           you like, provided that you change the 1st #DEFINE
*           below accordingly.
*-----------------------------------
#DEFINE New_Sent_Folder              "My Sent Items"
#DEFINE CdoDefaultFolderSentItems    3

*--    Define our variables.
LOCAL loSession AS "mapi.session", ;
	loMessage AS OBJECT, ;
	loRecip AS OBJECT, ;
	loSentItems AS OBJECT, ;
	loSentMsg AS OBJECT, ;
	lcToWho AS STRING, ;
	lcSampleAddress AS STRING, ;
	lcNewSentFolderID AS STRING, ;
	loMsgCopy AS OBJECT


PUBLIC gcFolderID
gcFolderID = ""

*--    Set up the e-mail message.
lcSampleAddress = "trevorh@MICROSOFT.COM"
lcToWho = INPUTBOX("What address do you want to send the sample to?", + ;
	"Sample Message", lcSampleAddress)

*--    Cancel if an e-mail address is not specified.
IF EMPTY(lcToWho)
	MESSAGEBOX("Sample Canceled", "", 0, 3000)
	RETURN .F.
ENDIF

*--    Logon to MAPI and make the message.
loSession = CREATEOBJECT("mapi.session")
loSession.Logon()
lcNewSentFolderID = FindNewFolder(loSession)
loMessage = loSession.Outbox.MESSAGES.ADD


WITH loMessage
	.Subject = "Test Message"
	.TEXT = "Test Body"
	loRecip = .Recipients.ADD
	loRecip.NAME = ALLTRIM(lcToWho)
	loRecip.Resolve
	.UPDATE()
*--	Copy the msg to our alternate Sent Items folder.
	loMsgCopy = .CopyTo(lcNewSentFolderID)
	loMsgCopy.UPDATE()
*--	Passing .F. here to the SEND() method prevents a copy
*--	of this message being saved to the default Sent Items folder.
	.SEND(.F.)
ENDWITH

*--    Clean up.
loSession.Logoff
RELEASE ALL
CLEAR ALL


*~~~~~~~~~~~~~~~~~~~~~~~~~
FUNCTION FindNewFolder(lpoSession AS OBJECT)
	LOCAL loInfoStores AS OBJECT, ;
		loRootFolder AS OBJECT, ;
		liStoreCnt AS INTEGER

*-- Get an obj reference to the message stores in Outlook.
	loInfoStores = lpoSession.InfoStores

*-- Walk through the message store(s) (except any
*-- Public Folders) looking for a folder with the same name
*-- as the "New_Sent_Folder" constant.
	FOR liStoreCnt = 1 TO loInfoStores.COUNT
		IF !("PUBLIC FOLDERS" $ UPPER(loInfoStores.ITEM(liStoreCnt).NAME))
			loRootFolder = loInfoStores.ITEM(liStoreCnt).RootFolder
			WalkSubFolders(loRootFolder)

			IF !EMPTY(gcFolderID)
				RETURN gcFolderID
			ENDIF
		ENDIF
	ENDFOR


*~~~~~~~~~~~~~~~~~~~~~~~~~
FUNCTION WalkSubFolders(lpoFolder AS OBJECT)
	IF !EMPTY(gcFolderID)
		RETURN
	ENDIF

	IF UPPER(lpoFolder.NAME) = UPPER(New_Sent_Folder)
		gcFolderID = loFolder.ID
		RETURN
	ENDIF

	LOCAL loFolder AS OBJECT
	FOR EACH loFolder IN lpoFolder.Folders
		IF loFolder.Folders.COUNT > 0
			WalkSubFolders(loFolder)
			IF !EMPTY(gcFolderID)
				EXIT
			ENDIF
		ELSE
			IF UPPER(loFolder.NAME) = UPPER(New_Sent_Folder)
				gcFolderID = loFolder.ID
				EXIT
			ENDIF
		ENDIF
	NEXT
Microsoft fornisce esempi di programmazione a scopo puramente illustrativo, senza alcuna garanzia di qualsiasi tipo, sia espressa che implicita, ivi incluse, senza limitazioni, le garanzie implicite di commerciabilità o idoneità per uno scopo particolare. In questo articolo si presume che l'utente conosca il linguaggio di programmazione in questione e gli strumenti utilizzati per creare ed eseguire il debug delle procedure. Gli esperti Microsoft sono autorizzati a fornire spiegazioni in merito alla funzionalità di una particolare procedura, ma in nessun caso a modificare questi esempi per fornire funzionalità aggiuntive o a creare procedure atte a soddisfare specifiche esigenze. Se si dispone di esperienza di programmazione limitata, si consiglia di contattare un Microsoft Certified Partner o la filiale Microsoft locale per informazioni sulla consulenza tecnica. Per ulteriori informazioni in merito ai Microsoft Certified Partner, visitare il seguente sito Web:
http://mcspreferral.microsoft.com/default.asp?lan=4 (http://mcspreferral.microsoft.com/default.asp?lan=4)
Per ulteriori informazioni sulle opzioni di supporto disponibili e su come contattare Microsoft, visitare il seguente sito Web Microsoft:
http://support.microsoft.com/ (http://support.microsoft.com/)

Le informazioni in questo articolo si applicano a
  • Microsoft Visual FoxPro 7.0 Professional Edition
  • Microsoft Outlook 2002 Standard Edition
Chiavi: 
kbcodesnippet kbcomt kbgrpdsfox kbhowto kbhowtomaster kboop kbvfp700 KB312105
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.
 

Traduzione articoli

 

Related Support Centers