|
i have to parse the contents of an email..that is., get the from and to address, subject and the contents of the mailmessage.in what format should i store my mail mesage??in the rich text format or the message format?which is the best possible way for it??
after storing it.,how should i use the MAPIReadmail,MAPIFindnext functons to retrieve the mail contents??whatis the work of the message identifier in this process?
kindly help me in doing this!!
ranjani
|
|
|
|
|
Hi,
storing format is on your choise.
corresponding question 2,. - use following tecknique:
<br />
if( mapi.Logon( _T(""), _T("") ) )<br />
{<br />
while (mapi.FindNext (MAPI_LONG_MSGID, Msg_ID) == TRUE)<br />
{<br />
...<br />
bRes = mapi.ReadMail (Msg_ID, MAPI_PEEK, ...);<br />
...<br />
}<br />
}<br />
mapi.Logoff();<br />
}<br />
Vitali
|
|
|
|
|
hi
thanxx for ur reply!
what is bRes varable in the above mentioned code of urs?
what is Msg_ID? what is the parameter to be passed insteadof Msg_ID in the function call?
how do i know the message id of a certain message?are there any special functoins to know it??
ranjani
|
|
|
|
|
Read what MSDN say:
1)message id
>>An ASCII string used by Simple MAPI to access an incoming message. A >>message identifier is valid only during the session in which it is assigned >>a value by the MAPIFindNext function, and does not correspond to the >>message reference used by CMC. For more information, see Receiving a >>Message: Simple MAPI Sample.
2)
ULONG FAR PASCAL MAPIFindNext(
LHANDLE lhSession,
ULONG ulUIParam,
LPTSTR lpszMessageType,
LPTSTR lpszSeedMessageID,
FLAGS flFlags,
ULONG ulReserved,
LPTSTR lpszMessageID
)
...MessageID Pointer to a string containing the message identifier seed for the request. If the lpszSeedMessageID parameter is NULL or points to an empty string, MAPIFindNext retrieves the first message that matches the type specified in the lpszMessageType parameter.
I think this is clear
Vitali
|
|
|
|
|
thank u so much..
but sorry again!!
what do u mean by 'a session assigned'?
and what is a 'message type'?
ranjani
|
|
|
|
|
following is the code i got from msdn for parsing mails
i have doubts in it like..
in the readnextmsg function what is ..c:\\pst\\myprofile.pro???
what shud i use in my program instead of that..and in the findnext function..whats OL??what are the parameters to be passed to the functions...so that i can autmate the process of receiving mails in my inbox!
thank u
here's the code
#include<stdio.h>
#include<stdlib.h>
#include<iostream.h>
#include<conio.h>
#include<windows.h>
#include<mapi.h>
//assumption::character interface being used.
//the Simple MAPI functions for reading messages can't
//log on implicitly and require an explicit session handle.
/*the client application defines needed variables and
logs on to get a session handle/*
ULONG ReadNextUnreadMsg()
{
ULONG err;
LHANDLE lhSession; // Need a session for MAPIFindNext.
CHAR rgchMsgID[513]; // Message IDs should be >= 512 CHARs + a null.
MapiMessage *lpMessage; // Used to get a message back from MAPIReadmail
int i, // Ubiquitous loop counter.
totalLength; // Number of characters printed on a line.
err = MAPILogon(0L, // ulUIParam; 0 always valid.
"c:\\pst\\myprofil.pro",// Shouldn't hardcode this.
NULL, // No password needed.
0L, // Use shared session.
0L, // Reserved; must be 0.
&lhSession); // Session handle.
if (err != SUCCESS_SUCCESS) // Make sure MAPILogon succeeded.
{
printf("Error: could not log on\r\n");
return(err);
}
//next..the client searches for the first unread message in the //default folder in the store - probably the user's Inbox.
//Since there might not be any unread messages in the folder, //the client first tests the return value from the MAPIFindNext
//function against MAPI_E_NO_MESSAGES before checking against //SUCCESS_SUCCESS. If the call is successful, the client will have
///a valid message identifier to use to retrieve the first// unread message
/* */
// find the first unread message
err = MAPIFindNext(lhSession, // explicit session required
0L, // always valid ulUIParam
NULL, // NULL specifies interpersonal messages
NULL, // seed message ID; NULL=get first message
MAPI_LONG_MSGID | // needed for 512 byte rgchMsgID.
MAPI_UNREAD_ONLY, // only get unread messages.
0L, // reserved; must be 0
rgchMsgID);// buffer to get back a message ID.
if (err == MAPI_E_NO_MESSAGES) // make sure a message was found
{
printf("No unread messages.\r\n");
return(err);
}
if (err != SUCCESS_SUCCESS) // make sure MAPIFindNext didn't fail
{
printf("Error while searching for messages\r\n");
return(err);
}
//The client can now be sure it is safe to retrieve the message. //However, it is a good idea to check the return value from
//the MAPIReadMail function. If the call fails, the memory pointed //to by the client's lpMessage pointer will not be accessible by
//the client. The client should not try to display a message at //that location. Note that this example sets the
//MAPI_SUPPRESS_ATTACH flag so the returned message will not
//have any attachments in it and Simple MAPI will not create any //temporary files for them.
// retrieve the message
err = MAPIReadMail(lhSession, // Explicit session required.
0L, // Always valid ulUIParam.
rgchMsgID, // The message found by MAPIFindNext.
MAPI_SUPPRESS_ATTACH, // TO DO: handle attachments.
0L, // Reserved; must be 0.
&lpMessage); // Location of the returned message.
if(err != SUCCESS_SUCCESS) // Make sure MAPIReadMail succeeded.
{
printf("Error retrieving message %s\r\n",rgchMsgID);
return(err);
}
//Now, the client can display the message. As expected, //it begins by displaying the addressing information attached
//to the message before displaying the subject line and message text.// When displaying the addressing information, it is best if you
//can display friendly names. However, since friendly names are
//not always available, you must verify that each recipient //structure's lpszName member points to a valid string,
// and that the string is not a null string.
// Display the sender's name or address; use the friendly name// if it is present.
if((lpMessage->lpOriginator->lpszName != NULL) &&
lpMessage->lpOriginator->lpszName[0] != '\0')
printf("From: %s\r\n",lpMessage->lpOriginator->lpszName);
else
printf("From: %s\r\n",lpMessage->lpOriginator->lpszAddress);
//Displaying the recipients' addresses is complicated by the //need to avoid breaking a recipient's name or address across
//two lines. This code can be further improved by differentiating //between recipients based on their ulRecipClass members so that
//they can be properly displayed as To, CC, or BCC recipients.// As this code shows, handling recipient data can be the most
// complex part of reading a message.// Display the recipients' names or addresses. To Do: enhance
// this code to separate the recipients into lists of MAPI_TO,// MAPI_CC, and MAPI_BCC recipients for separate display.
if(lpMessage->nRecipCount == 0)
printf("Warning: no recipients present for this message\r\n");
else
for(i = 0; i < lpMessage->nRecipCount; i++) // For each recipient...
{
// This code uses lstrlen to calculate the length of strings and
// to validate that the strings have some content, since the
// length is needed anyway. This avoids the more verbose checks
// as were done for lpMessage->lpOriginator->lpszName earlier.
// lpszT references a name or address; simplifies later code.
// length is the length of the name or address.
LPSTR lpszT = lpMessage->lpRecips[i]->lpszName;
int length = lstrlen(lpszT);
if(i == 0) // First recipient; need to do some initialization.
{
printf("Recipients:");
totalLength = 11; // since strlen("Recipients:") = 11.
}
// Decide whether to use the friendly name or the address.
if(length == 0)
length = lstrlen(lpszT=lpMessage->lpRecips[i]->lpszAddress);
// Verify that the line has room for this name or address. If
// not, print a CR LF pair to go to the next line.
if(totalLength + length + 1 > LINE_WIDTH)
{
printf("\r\n");
totalLength = 0;
}
printf(" %s",lpszT); // Finally, print the name or address.
totalLength += length + 1;// Maintain the line length.
// If there are more addresses, separate them with semicolons.
if(i < (lpMessage->nRecipCount - 1))
{
printf(";");
totalLength++;
}
}
//Now, the client displays the subject line and message text if //they are present. Note that the message text can be printed
//with a simple call to the C library function printf. Since //the message was read with the MAPI_SUPPRESS_ATTACH flag set,
//there will be no attachments in it.// Display the subject and message body. Not printing anything
//for the subject is fine, but something should always be //printed for the message body since it is the last thing
//that this function displays.
if(lpMessage->lpszSubject != NULL && // Standard validity check
lpMessage->lpszSubject[0] != '\0')
printf("Subject: %s\r\n",lpMessage->lpszSubject);
if(lpMessage->lpszNoteText != NULL && // Standard validity check
lpMessage->lpszNoteText[0] != '\0')
printf("Message Text:\r\n%s",lpMessage->lpszNoteText;
else
printf("No message text.\r\n");
//Finally, the client releases the memory that the MAPIReadMail //function allocated for the message, closes the session,
//and returns a successful return value.
MAPIFreeBuffer(lpMessage);
MAPILogoff(lhSession, // The session.
0L, // 0 always valid for ulUIParam.
0L, // No logoff flags.
0L); // Reserved; must be 0.
return SUCCESS_SUCCESS; // Inform the caller of our success.
} // End of ReadNextUnreadMsg
ranjani
|
|
|
|
|
ranjjj wrote:
in the readnextmsg function what is ..c:\\pst\\myprofile.pro???
The second parameter to MAPILogon() is a pointer to a null-terminated profile name string, in this case "c:\\pst\\myprofile.pro". Notice the comment that warns against hard-coding the value!!
ranjjj wrote:
and in the findnext function..whats OL??
It's one of the parameters. In this case, it's a 0 (zero) followed by an 'L' for long.
ranjjj wrote:
what are the parameters to be passed to the functions
MSDN lays all of this out in detail. It's best to not grab a bunch of code and try to use it (as is). From personal experience, take one statement at a time, type it in manually so that you have a FULL understanding of exactly what is happening. Copying and pasting code, especially as a beginner, will be your ultimate demise.
|
|
|
|
|
what is "a pointer to a null terminated profile namestring"?
what profile do u mean here?
what should i use in my program instead of this!!
ranjani
|
|
|
|
|
ranjjj wrote:
i have to parse the contents of an email..that is., get the from and to address, subject and the contents of the mailmessage.
These are in standard locations in the message's header.
ranjjj wrote:
in what format should i store my mail mesage??in the rich text format or the message format?which is the best possible way for it??
That depends on what you're going to do with it.
|
|
|
|
|
i have to parse the contents of the mail message!!what format is the best to choose for this purpose??
what is message identifier?whats the work of Msg_ID in this?
ranjani
|
|
|
|
|
ranjani wrote:
thank u so much..
but sorry again!!
what do u mean by 'a session assigned'?
and what is a 'message type'?
'Session assigned' mean that the Id's is NONconstants
and can be different in two sessions for same email.
Vitali
|
|
|
|
|
what is the II parameter to be passed on to the mapilogon function "c:\\pst\\myprofil.pro"..what do u "pointer to a null terminated string"??
explain the following code to me plzzz:
MAPILogon(0L, // ulUIParam; 0 always valid.
"c:\\pst\\myprofil.pro",// Shouldn't hardcode this.
NULL, // No password needed.
0L, // Use shared session.
0L, // Reserved; must be 0.
&lhSession);
thanxxxx
ranjani
|
|
|
|
|
Numbers of email clients can be installed under
same OS login. Therefore in the second parameter
user should specify path to the files with his profile.
|
|
|
|
|
sorry for the trouble!
which email client do u mean?
andd what is the use of specifu=ying the path in the mapilogon function??
kindly help me ..
thanxx
ranjani
|
|
|
|
|
Microsoft Outlook Internet Settings is the profile setup on my computer.,with the information services..outlook address book and microsfot exchange server..how do i know the path of the file where it's stored!!
ranjani
|
|
|
|
|
Hi,
Don't worry.
If you specify this parameter as NULL MS Outlook Express
will show login dialog if it neccessry( in case if login
requed user name and password).
Vitali
http://www.creative-case.com
|
|
|
|
|
Hi,
I have an MFC application build on win2k.Both the Release and Debug versions work fine.But the exe crashes on the XP machine.What could be the problem
Pls help.
Thanks
|
|
|
|
|
Hi,
Perform check all libs and components on XP that your App used.
All of them shoul be instlled and on the new XP computer.
Vitali
|
|
|
|
|
Hello all
I am trying to develope a proxy server for shoutcast server . Usually the DFP Plug In of winAmp enables connection to a shoutcast server and streams the voice data in mp3 format to it . The listeners connect to the Shoutcast server at its port and ip and listen to the broadcast coming out of the shoutcast server .
In order to reduce the latency in trnasmission I am trying to write a simple proxy server that will take the stream from the DSP plugin and redirect the stream to the shoutcast server but the problem is the DSP plugin is not connecting to the server . I am not able to figure out how to create appropriate server and with what type? I found out that the DSP Plug in is a TCP type so in server side what kind oof sockets should be created is it CSocket or CAsyncSocket ot SOCKET type ? How will it get the connection esablished from another application like DSP plugin ? please help me
|
|
|
|
|
Hi,
I am writing a third-party filepacker/launcher for a game engine. I have no access to the game code so everything has to be done externally. Because of this, at the moment I have had to resort to zipping the files (all game files, executable and all) up with password protection (using the excellent ZipArchive library from www.artpol-software.com), and then having the launcher extract the files to a temporary directory on the hard-drive when started and run the game from there (the files are deleted when the game closes). This means that anybody can easily find the files by alt-tabbing out of the game and searching the hard-drive (and it also means that more hard-drive space is required).
I was wondering if anybody here had any suggestions of how I could better protect these files. I had thought of trying to extract and run them from memory, but this seems an almost impossible task, and besides which, it would consume precious memory that the game requires to run (as I understand it).
There is a tool that does something similar to what I want to do, called Thinstall (from www.thinstall.com). It compresses all files into a single EXE and runs them without having to extract them anywhere. (I don't want to use Thinstall because 1) I don't want a single EXE but want a resource file too, and 2) my program does a lot of stuff very specific to the game engine I'm using, whereas Thinstall is a general tool not designed with just games in mind anyway.) This is how the creator of Thinstall describes how it works:
"Thinstall works by compressing all of your files, including the [main game/program] EXE into a single EXE. Thinstall also inserts a small 75k program in front of everything, which is what is actually loaded when the user double-clicks your exe. The thinstall-loader then decompresses the [main game/program] EXE directly into memory and patches it up so that it no longer makes calls to the operating system for file loading, DLL loading, Process creation, Threads, Resource Loading, Directory operations, etc. Thinstall then runs [the game/program] in memory. When [the game/program] tries to read a file or load a DLL, it will go through Thinstall. Thinstall loads the file or DLL directly from the archive built into the EXE. Thinstall decompresses small blocks of the file at a time directly into memory as the application reads it, so nothing ever goes to disk and the memory required is very small."
(Of course, the programmer of Thinstall is way out of my league when it comes to coding.). The packer and launcher have been written using the Windows API, the ZipArchive library, and *no* MFC. I have hacked my way through the programming (with a lot of help from people here), but I am still a novice at C++, so if anybody does have any suggestions, I would be really grateful if you could explain it as simply as possible and tell me where to look for examples of what I need to do if there are any, or suggest which functions I should look into using.
This is probably a lot to ask, but it's worth a go.
Any suggestions would be really appreciated.
Many thanks,
KB
P.S. I have asked this question before - I am not trying to "spam", I am just hoping that I have explained what I want to do better this time around now that I have seen what Thinstall does.
|
|
|
|
|
Kayembi wrote:
I have asked this question before - I am not trying to "spam", I am just hoping that I have explained what I want to do better this time around now that I have seen what Thinstall does.
Don't worry about that This is one of the best-explained questions I have seen. If every question was like this, we would certainly not be upset
As for Thinstall, obviously, the application must still be able to access the disk for loading/saving documents etc... My guess (and I haven't looked at it, so I'm not sure) is that when it traps the file loading, it checks to see if the requested file is actually in the archive. If it is, it loads it from the archive. But if it's not, it allows the request to go through to the disk. If your resource file is not given to Thinstall, then you should be able to access it as per usual.
If I'm way off the mark here, please let me know
Ryan "Punctuality is only a virtue for those who aren't smart enough to think of good excuses for being late" John Nichol "Point Of Impact"
|
|
|
|
|
Hi,
Many thanks for you reply. That sounds about right, as Thinstall allows saving and loading from disk, so if I can work out any of the rest of it I will have to do as you say, and check the contents of the archive for files first, then check the disk...
My main problem, though, is how to get my launcher EXE to tell the game engine (or game EXE) to load the files it needs to run from my .pak file instead of from the hard-drive. Currently the Game EXE looks on the hard-drive in its own directory or in any other directories that have been defined. The reason I mention Thinstall is that it seems to be the only program anywhere that does something similar to what I would like to do - ie. tell the game not to look on the hard-drive, but in an archived file and run from there.
I guess what I need to do is pretty much what the author of Thinstall said that his program does - somehow patch up the game EXE so that whenever it needs to load a file, it gets it from the archive/loads it into memory and somehow accesses it from there.
I'm probably trying to do something that is way past my ability here, as I am not a very proficient coder. But any other suggestions (or even better, pointers to example projects/code that do something similar - I have looked everywhere and can find none) will be much appreciated. And please feel free to over-explain and stress the functions you are thinking of (if any), because I'm still learning all this stuff.
Thanks again,
KB
|
|
|
|
|
I've just read that the way Thinstall does it, is it has its launcher executable load a Virtual Operating System and a Virtual File System:
"The VOS is loaded into memory by Windows as a normal application, and does not require any special drivers, reboots, or adminstrator access to run. The VOS occupies about 90k of disk space and around 1MB of memory while running depending on which components are loaded. Once the VOS has been loaded it will load an EXE from the package archive into the same process. The VOS reroutes Windows API calls to itself before the application is run, giving the application new abilities."
So I guess that the game EXE and all its files are running together in what it thinks is just a normal directory, because the VOS has "tricked" it into "thinking" so... Now I'm getting very daunted.
Thanks,
KB
|
|
|
|
|
|
I have the following problem.
I create a dialog box. After it is shown I want it to automatically perform some tasks. To keep it simple, in this example it only has to show a messagebox. If I use the OnSetFocus() Windows Message Handler the messagebox is shown the first time before the dialog is visible. Another problem with the OnSetFocus() is that it wil be putting a messagebox on the screen on and on because every time I click the OK button of the messagebox, the dialog gets his focus back again.
Does anybody know how to achieve this on such a way that I don't get the above mentioned problems?
Thnxx!
|
|
|
|
|