libcmime  
A lightweight C mime library
cmime_message.h
Go to the documentation of this file.
1 /* libcmime - A C mime library
2  * Copyright (C) 2013 SpaceNet AG and Axel Steiner <ast@treibsand.com>
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining
5  * a copy of this software and associated documentation files (the
6  * "Software"), to deal in the Software without restriction, including
7  * without limitation the rights to use, copy, modify, merge, publish,
8  * distribute, sublicense, and/or sell copies of the Software, and to
9  * permit persons to whom the Software is furnished to do so, subject to
10  * the following conditions:
11  *
12  * The above copyright notice and this permission notice shall be
13  * included in all copies or substantial portions of the Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19  * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20  * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22  */
23 
38 #ifndef _CMIME_MESSAGE_H
39 #define _CMIME_MESSAGE_H
40 
41 #ifdef __cplusplus
42 extern "C" {
43 #endif
44 
45 #include <stdio.h>
46 #include <stdlib.h>
47 #include <string.h>
48 #include <assert.h>
49 #include <ctype.h>
50 #include <time.h>
51 #include <sys/mman.h>
52 #include <sys/types.h>
53 #include <sys/stat.h>
54 #include <unistd.h>
55 #include <fcntl.h>
56 #include <sys/param.h>
57 #include <errno.h>
58 
59 #include "cmime_address.h"
60 #include "cmime_list.h"
61 #include "cmime_header.h"
62 #include "cmime_part.h"
63 #include "cmime_util.h"
64 #include "cmime_string.h"
65 
70 typedef enum _BoundaryType {
74 
79 typedef struct {
83  char *boundary;
84  char *gap;
86  char *linebreak;
89 
94 typedef enum _CMimeMultipartType {
101 
108 
114 void cmime_message_free(CMimeMessage_T *message);
115 
123 void cmime_message_set_sender(CMimeMessage_T *message, const char *sender);
124 
131 //#define cmime_message_get_sender(message) (cmime_address_to_string(message->sender))
133 
138 #define cmime_message_get_sender(message) (message->sender)
139 
147 void cmime_message_set_message_id(CMimeMessage_T *message, const char *mid);
148 
156 
163 
170 
178 int cmime_message_set_header(CMimeMessage_T *message, const char *header);
179 
187 CMimeHeader_T *cmime_message_get_header(CMimeMessage_T *message, const char *header);
188 
193 #define cmime_message_get_headers(message) (message->headers)
194 
203 int cmime_message_add_recipient(CMimeMessage_T *message, const char *recipient, CMimeAddressType_T t);
204 
212 int cmime_message_add_recipient_to(CMimeMessage_T *message, const char *recipient);
213 
221 int cmime_message_add_recipient_cc(CMimeMessage_T *message, const char *recipient);
222 
230 int cmime_message_add_recipient_bcc(CMimeMessage_T *message, const char *recipient);
231 
236 #define cmime_message_get_recipients(message) (message->recipients)
237 
244 void cmime_message_set_content_type(CMimeMessage_T *message, const char *s);
245 
253 
260 void cmime_message_set_content_transfer_encoding(CMimeMessage_T *message, const char *s);
261 
269 
276 void cmime_message_set_content_id(CMimeMessage_T *message, const char *s);
277 
285 
292 void cmime_message_set_content_description(CMimeMessage_T *message, const char *s);
293 
300 
311 void cmime_message_set_mime_version(CMimeMessage_T *message, const char *s);
312 
320 
327 void cmime_message_set_date(CMimeMessage_T *message, const char *s);
328 
335 char *cmime_message_get_date(CMimeMessage_T *message);
336 
344 
351 void cmime_message_set_boundary(CMimeMessage_T *message, const char *boundary);
352 
357 #define cmime_message_get_boundary(message) (message->boundary)
358 
365 
372 
382 int cmime_message_from_file(CMimeMessage_T **message, const char *filename, int header_only);
383 
391 int cmime_message_to_file(CMimeMessage_T *message, const char *filename);
392 
400 
410 int cmime_message_from_string(CMimeMessage_T **message, const char *content, int header_only);
411 
418 #define cmime_message_part_count(message) (message->parts->size)
419 
426 void cmime_message_set_subject(CMimeMessage_T *message, const char *s);
427 
435 
442 void cmime_message_prepend_subject(CMimeMessage_T *message, const char *s);
443 
450 void cmime_message_append_subject(CMimeMessage_T *message, const char *s);
451 
459 int cmime_message_set_body(CMimeMessage_T *message, const char *content);
460 
469 
476 void cmime_message_add_attachment(CMimeMessage_T *message, char *attachment);
477 
486 CMimeMessage_T *cmime_message_create_skeleton(const char *sender, const char *recipient, const char *subject);
487 
496 
507 
512 #define cmime_message_part_first(message) ((CMimePart_T *)cmime_list_head(message->parts)->data)
513 
518 #define cmime_message_part_last(message) ((CMimePart_T *)cmime_list_tail(message->parts)->data)
519 
520 #ifdef __cplusplus
521 }
522 #endif
523 
524 #endif /* _CMIME_MESSAGE_H */
525 
CMimeAddressType_T
CMimeAddressType_T
Possible types of email addresses.
Definition: cmime_address.h:46
cmime_message_add_attachment
void cmime_message_add_attachment(CMimeMessage_T *message, char *attachment)
add attachment to message
Definition: cmime_message.c:1083
CMIME_BOUNDARY_CLOSE
@ CMIME_BOUNDARY_CLOSE
Definition: cmime_message.h:72
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
CMimeMessage_T::headers
CMimeList_T * headers
Definition: cmime_message.h:82
cmime_message_add_child_part
int cmime_message_add_child_part(CMimeMessage_T *message, CMimePart_T *part, CMimePart_T *child, CMimeMultipartType_T subtype)
Add a child part to given mimepart, set content type and generate a boundary if necessary.
Definition: cmime_message.c:1159
cmime_message_add_generated_message_id
void cmime_message_add_generated_message_id(CMimeMessage_T *message)
Add a newly generated message id to a CMimeMessage_T object.
Definition: cmime_message.c:1012
cmime_util.h
Defines utility functions.
CMimePart_T
A mime part.
Definition: cmime_part.h:52
cmime_message_prepend_subject
void cmime_message_prepend_subject(CMimeMessage_T *message, const char *s)
prepend string to subject
Definition: cmime_message.c:963
CMIME_MULTIPART_MIXED
@ CMIME_MULTIPART_MIXED
Definition: cmime_message.h:95
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_set_content_type
void cmime_message_set_content_type(CMimeMessage_T *message, const char *s)
Set Content-Type header.
Definition: cmime_message.c:606
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
cmime_message_get_content_id
char * cmime_message_get_content_id(CMimeMessage_T *message)
Get Content-ID header value.
Definition: cmime_message.c:635
cmime_message_set_date
void cmime_message_set_date(CMimeMessage_T *message, const char *s)
Set date string header.
Definition: cmime_message.c:647
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_from_string
int cmime_message_from_string(CMimeMessage_T **message, const char *content, int header_only)
Parse given string and create a new CMimeMessage_T object.
Definition: cmime_message.c:929
cmime_message_get_date
char * cmime_message_get_date(CMimeMessage_T *message)
Get date string from CMimeMessage_T object.
Definition: cmime_message.c:651
cmime_part.h
Defines functions and structs for mime part handling.
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_get_sender_string
char * cmime_message_get_sender_string(CMimeMessage_T *message)
Get sender of a CMimeMessage_T object as string.
Definition: cmime_message.c:473
cmime_message_free
void cmime_message_free(CMimeMessage_T *message)
Free a CMimeMessage_T object.
Definition: cmime_message.c:431
cmime_message_add_recipient_bcc
int cmime_message_add_recipient_bcc(CMimeMessage_T *message, const char *recipient)
Add Bcc recipient to message.
Definition: cmime_message.c:596
CMimeStringList_T
A simple list with strings.
Definition: cmime_string.h:46
cmime_message_from_file
int cmime_message_from_file(CMimeMessage_T **message, const char *filename, int header_only)
Parse given file and create a CMimeMessage_T object.
Definition: cmime_message.c:724
CMimeAddress_T
Represents an email address.
Definition: cmime_address.h:57
cmime_message_set_mime_version
void cmime_message_set_mime_version(CMimeMessage_T *message, const char *s)
Set Mime-Version header value. According to RFC 2045, Mime-Version header is required at the top leve...
Definition: cmime_message.c:622
cmime_message_set_header
int cmime_message_set_header(CMimeMessage_T *message, const char *header)
Set a header to message object. If header already exists, it will be overwritten.
Definition: cmime_message.c:505
cmime_message_get_message_id
char * cmime_message_get_message_id(CMimeMessage_T *message)
Get MessageID of message object.
Definition: cmime_message.c:501
CMimeMessage_T::sender
CMimeAddress_T * sender
Definition: cmime_message.h:80
cmime_message_get_subject
char * cmime_message_get_subject(CMimeMessage_T *message)
Get the subject string from CMimeMessage_T object.
Definition: cmime_message.c:959
cmime_message_add_recipient_cc
int cmime_message_add_recipient_cc(CMimeMessage_T *message, const char *recipient)
Add Cc recipient to message.
Definition: cmime_message.c:586
CMIME_MULTIPART_MESSAGE
@ CMIME_MULTIPART_MESSAGE
Definition: cmime_message.h:97
cmime_message_add_recipient_to
int cmime_message_add_recipient_to(CMimeMessage_T *message, const char *recipient)
Add To recipient to message.
Definition: cmime_message.c:576
cmime_message_set_content_description
void cmime_message_set_content_description(CMimeMessage_T *message, const char *s)
Set Content-Description value.
Definition: cmime_message.c:639
CMIME_MULTIPART_ALTERNATIVE
@ CMIME_MULTIPART_ALTERNATIVE
Definition: cmime_message.h:98
CMimeMessage_T::boundary
char * boundary
Definition: cmime_message.h:83
cmime_message_set_content_id
void cmime_message_set_content_id(CMimeMessage_T *message, const char *s)
Set Content-ID header value.
Definition: cmime_message.c:631
cmime_message_append_subject
void cmime_message_append_subject(CMimeMessage_T *message, const char *s)
append string to subject
Definition: cmime_message.c:974
CMimeMessage_T::boundaries
CMimeStringList_T * boundaries
Definition: cmime_message.h:87
cmime_message_get_content_description
char * cmime_message_get_content_description(CMimeMessage_T *message)
Get Content-Description header value.
Definition: cmime_message.c:643
cmime_message_append_part
int cmime_message_append_part(CMimeMessage_T *message, CMimePart_T *part)
Append mime part to message object and generate boundary if necessary.
Definition: cmime_message.c:1060
CMIME_MULTIPART_RELATED
@ CMIME_MULTIPART_RELATED
Definition: cmime_message.h:99
cmime_message_set_boundary
void cmime_message_set_boundary(CMimeMessage_T *message, const char *boundary)
Set message boundary.
Definition: cmime_message.c:671
CMimeList_T
Double linked list implementation.
Definition: cmime_list.h:55
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_header.h
Defines functions and structs for header management.
cmime_message_generate_boundary
char * cmime_message_generate_boundary(void)
Generate a message boundary.
Definition: cmime_message.c:695
cmime_message_generate_message_id
char * cmime_message_generate_message_id(void)
Generate a message id.
Definition: cmime_message.c:985
CMimeHeader_T
A email header item.
Definition: cmime_header.h:45
cmime_message_get_header
CMimeHeader_T * cmime_message_get_header(CMimeMessage_T *message, const char *header)
Get header for given key.
Definition: cmime_message.c:520
cmime_message_get_mime_version
char * cmime_message_get_mime_version(CMimeMessage_T *message)
Get Mime-Version header value.
Definition: cmime_message.c:627
CMimeBoundaryType_T
CMimeBoundaryType_T
Possible types of boundaries.
Definition: cmime_message.h:70
cmime_message_part_remove
int cmime_message_part_remove(CMimeMessage_T *message, CMimePart_T *part)
Remove a mime part from message.
Definition: cmime_message.c:1130
cmime_address.h
Defines functions and structs for email address handling.
CMimeMessage_T::recipients
CMimeList_T * recipients
Definition: cmime_message.h:81
CMIME_MULTIPART_DIGEST
@ CMIME_MULTIPART_DIGEST
Definition: cmime_message.h:96
CMIME_BOUNDARY_OPEN
@ CMIME_BOUNDARY_OPEN
Definition: cmime_message.h:71
CMimeMessage_T::gap
char * gap
Definition: cmime_message.h:84
CMimeMessage_T::linebreak
char * linebreak
Definition: cmime_message.h:86
cmime_message_set_content_transfer_encoding
void cmime_message_set_content_transfer_encoding(CMimeMessage_T *message, const char *s)
set Content-Transfer-Encoding value
Definition: cmime_message.c:614
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_get_content_type
char * cmime_message_get_content_type(CMimeMessage_T *message)
Get Content-Type header value.
Definition: cmime_message.c:610
cmime_message_create_skeleton
CMimeMessage_T * cmime_message_create_skeleton(const char *sender, const char *recipient, const char *subject)
create message skeleton with basic header information
Definition: cmime_message.c:1107
cmime_list.h
Defines functions and structs for double linked list.
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_message_get_content_transfer_encoding
char * cmime_message_get_content_transfer_encoding(CMimeMessage_T *message)
Get Content-Transfer-Encoding value.
Definition: cmime_message.c:618
CMimeMultipartType_T
CMimeMultipartType_T
Possible multipart mime subtypes.
Definition: cmime_message.h:94
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
cmime_string.h
Defines helper functions and structs for string handling.