libcmime  
A lightweight C mime library
create_mime_message_part_from_file.c
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "../src/cmime_message.h"
void usage() {
printf("\n");
printf("libcmime - simple api demonstration\n");
printf("-----------------------------------\n");
printf("demonstrates: manual creation of new CMimeMessage_T mime message. Furthermore the message is manually extended by an attachment\n");
printf("output: output is written to stdout if no output file is specified (-f /path/to/out_file.txt)\n");
printf("\n");
}
int main(int argc, char *argv[]) {
// addresses can either be specified "just as an address" or like "John Doe <from@example.org>"
char from[] = "from@example.org";
char to[] = "to@example.org";
char *file = NULL;
char *out = NULL;
char *msgid = NULL;
char *attachment = NULL;
int option;
int retval = 0;
// check command line parameters
while((option = getopt(argc,argv,"hf:a:")) != EOF) {
switch(option) {
case 'f':
asprintf(&file, "%s", optarg);
break;
case 'a':
asprintf(&attachment, "%s", optarg);
break;
case 'h':
usage();
break;
default:
usage();
}
}
if(attachment != NULL) {
CMimeListElem_T *elem = NULL;
CMimePart_T *prev = NULL;
// set the sender of the message
cmime_message_set_sender(message,from);
// add an recipient, this can also be done with cmime_message_add_recipient_to
// set subject
cmime_message_set_subject(message, "This is an exmaple");
// generate date header
// generate a message id and add it to our message
// add content to the body
cmime_message_set_body(message,"This is the message body");
// add the attachment
/* check if there is a previous part */
if (message->parts->size >= 1) {
elem = cmime_list_tail(message->parts);
prev = cmime_list_data(elem);
prev->last = 0;
}
cmime_part_from_file(&part, attachment,message->linebreak);
part->parent_boundary = strdup(message->boundary);
part->last = 1;
cmime_list_append(message->parts,part);
// assign the email to out or write it to file (depending on cli options)
if(file != NULL) {
if(cmime_message_to_file(message,file) > 0) {
printf("file created: %s\n", file);
} else {
printf("error writing file: %s\n", file);
}
} else {
out = cmime_message_to_string(message);
printf("%s\n", out);
}
// free the initialized object
} else {
printf("you have to specify an attachment with -a\n");
retval = -1;
}
// some clean up
if(out != NULL)
free(out);
if(msgid != NULL)
free(msgid);
if(file != NULL)
free(file);
if(attachment != NULL)
free(attachment);
return retval;
}
cmime_message_set_sender
void cmime_message_set_sender(CMimeMessage_T *message, const char *sender)
Add sender to CMimeMessage_T object. If sender already exists, it will be overwritten.
Definition: cmime_message.c:455
cmime_part_from_file
int cmime_part_from_file(CMimePart_T **part, char *filename, const char *nl)
Create a CMimePart_T object from file.
Definition: cmime_part.c:221
CMimeList_T::size
int size
Definition: cmime_list.h:56
CMimePart_T
A mime part.
Definition: cmime_part.h:52
cmime_message_to_file
int cmime_message_to_file(CMimeMessage_T *message, const char *filename)
Write CMimeMessage_T object to file.
Definition: cmime_message.c:792
cmime_message_add_recipient
int cmime_message_add_recipient(CMimeMessage_T *message, const char *recipient, CMimeAddressType_T t)
Add recipient to message.
Definition: cmime_message.c:539
CMimeListElem_T
An element of a CMimeList_T list.
Definition: cmime_list.h:45
cmime_message_to_string
char * cmime_message_to_string(CMimeMessage_T *message)
Return a message object as string.
Definition: cmime_message.c:816
cmime_message_set_date_now
int cmime_message_set_date_now(CMimeMessage_T *message)
Get current time and set date header.
Definition: cmime_message.c:655
cmime_message_new
CMimeMessage_T * cmime_message_new(void)
Creates a new CMimeMessage_T object.
Definition: cmime_message.c:400
cmime_message_free
void cmime_message_free(CMimeMessage_T *message)
Free a CMimeMessage_T object.
Definition: cmime_message.c:431
CMimePart_T::parent_boundary
char * parent_boundary
Definition: cmime_part.h:56
CMimePart_T::last
short int last
Definition: cmime_part.h:58
cmime_list_data
#define cmime_list_data(elem)
Definition: cmime_list.h:196
CMimeMessage_T::boundary
char * boundary
Definition: cmime_message.h:83
cmime_part_new
CMimePart_T * cmime_part_new(void)
Creates a new CMimePart_T object.
Definition: cmime_part.c:68
cmime_list_tail
#define cmime_list_tail(list)
Definition: cmime_list.h:178
CMimeMessage_T
Represents an email message.
Definition: cmime_message.h:79
cmime_message_set_subject
void cmime_message_set_subject(CMimeMessage_T *message, const char *s)
Set message subject.
Definition: cmime_message.c:955
cmime_list_append
int cmime_list_append(CMimeList_T *list, void *data)
Append data to the end of a list.
Definition: cmime_list.c:210
cmime_message_generate_boundary
char * cmime_message_generate_boundary(void)
Generate a message boundary.
Definition: cmime_message.c:695
CMimeMessage_T::linebreak
char * linebreak
Definition: cmime_message.h:86
cmime_message_set_message_id
void cmime_message_set_message_id(CMimeMessage_T *message, const char *mid)
Set message id to CMimeMessage_T object, if alreay exists, value will be overwritten.
Definition: cmime_message.c:482
cmime_message_set_body
int cmime_message_set_body(CMimeMessage_T *message, const char *content)
Set plain body to non multipart message.
Definition: cmime_message.c:1021
CMIME_ADDRESS_TYPE_TO
@ CMIME_ADDRESS_TYPE_TO
Definition: cmime_address.h:47
CMimeMessage_T::parts
CMimeList_T * parts
Definition: cmime_message.h:85
cmime_message_add_generated_boundary
void cmime_message_add_generated_boundary(CMimeMessage_T *message)
Add a newly generated boundary to a CMimeMessage_T object.
Definition: cmime_message.c:714