#include #include #include #include /** * Print the message to stdout * * @param msg message * @return 0: succeed, others: error - see mu_strerror */ int messageDumpToScreen(message_t msg) { char szBuffer[2048 + 1] = ""; size_t nBytes = 0; stream_t stream = 0; message_get_stream(msg, &stream); stream_open(stream); while (stream_sequential_readline (stream, szBuffer, sizeof(szBuffer), &nBytes) == 0 && nBytes) printf("%s", szBuffer); return 0; } /** * parse RFC822 message file and get message type * * @param pMsg message * @param pszFileName RFC822 message file name * @return 0: succeed, others: error - see mu_strerror */ int messageLoadFromFile(message_t * pMsg, const char *pszFileName) { stream_t stream = 0; file_stream_create(&stream, pszFileName, MU_STREAM_READ); stream_open(stream); message_create(pMsg, NULL); message_set_stream(*pMsg, stream, NULL); return 0; } /** * attach file to message * * @param msg original message * @param msg message added the attach file * @param pszFileName file name * @return 0: succeed, others: error - see mu_strerror */ int messageAddAttachFile(message_t msg, message_t *pNewMsg, const char *pszFileName) { mime_t mime = 0; message_t attachFileMsg; size_t nParts = 0; int i = 0; message_get_num_parts(msg, &nParts); mime_create(&mime, NULL, 0); // copy every part to mime object for (i = 1; i <= nParts; i++) { message_t part = 0; message_get_part(msg, i, &part); mime_add_part(mime, part); } message_create_attachment("application/octet-stream", "base64", pszFileName, &attachFileMsg); mime_add_part(mime, attachFileMsg); mime_get_message(mime, pNewMsg); return 0; } /** * remove the attach file from message * * @param msg message * @param pNewMsg message removed the attach file * @param pszFileName file name to remove - relative path * @return 0: succeed, others: error - see mu_strerror */ int messageRemoveAttachFile(message_t msg, message_t *pNewMsg, const char *pszFileName) { mime_t mime = 0; int i = 0; size_t nParts = 0; message_get_num_parts(msg, &nParts); mime_create(&mime, NULL, 0); // copy every part to mime object except attach file for (i = 1; i <= nParts; i++) { message_t part = 0; char buf[2048 + 1] = ""; size_t size = -1; message_get_part(msg, i, &part); message_get_attachment_name(part, buf, 2048, &size); if (strcmp(buf, pszFileName) != 0) { mime_add_part(mime, part); } } mime_get_message(mime, pNewMsg); return 0; } int main(int argc, char *argv[]) { message_t msg, newMsg, newMsg2; if (argc < 2) { fprintf(stderr, "Usage: %s \n", argv[0]); exit(-1); } messageLoadFromFile(&msg, argv[1]); printf("loaded message\n"); printf("--------------------------------------------------------------------\n"); messageDumpToScreen(msg); printf("--------------------------------------------------------------------\n"); messageAddAttachFile(msg, &newMsg, "/etc/passwd"); printf("message added attach file\n"); printf("--------------------------------------------------------------------\n"); messageDumpToScreen(newMsg); printf("--------------------------------------------------------------------\n"); messageRemoveAttachFile(newMsg, &newMsg2, "passwd"); printf("message removed attach file\n"); printf("--------------------------------------------------------------------\n"); messageDumpToScreen(newMsg2); printf("--------------------------------------------------------------------\n"); return 0; }