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 
132 void cmime_message_set_sender_encode(CMimeMessage_T *message, const char *sender);
133 
140 //#define cmime_message_get_sender(message) (cmime_address_to_string(message->sender))
142 
147 #define cmime_message_get_sender(message) (message->sender)
148 
156 void cmime_message_set_message_id(CMimeMessage_T *message, const char *mid);
157 
165 
172 
179 
187 int cmime_message_set_header(CMimeMessage_T *message, const char *header);
188 
196 CMimeHeader_T *cmime_message_get_header(CMimeMessage_T *message, const char *header);
197 
202 #define cmime_message_get_headers(message) (message->headers)
203 
212 int cmime_message_add_recipient(CMimeMessage_T *message, const char *recipient, CMimeAddressType_T t);
213 
222 int cmime_message_add_recipient_encode(CMimeMessage_T *message, const char *recipient, CMimeAddressType_T t);
223 
231 int cmime_message_add_recipient_to(CMimeMessage_T *message, const char *recipient);
232 
240 int cmime_message_add_recipient_cc(CMimeMessage_T *message, const char *recipient);
241 
249 int cmime_message_add_recipient_bcc(CMimeMessage_T *message, const char *recipient);
250 
255 #define cmime_message_get_recipients(message) (message->recipients)
256 
263 void cmime_message_set_content_type(CMimeMessage_T *message, const char *s);
264 
272 
279 void cmime_message_set_content_transfer_encoding(CMimeMessage_T *message, const char *s);
280 
288 
295 void cmime_message_set_content_id(CMimeMessage_T *message, const char *s);
296 
304 
311 void cmime_message_set_content_description(CMimeMessage_T *message, const char *s);
312 
319 
330 void cmime_message_set_mime_version(CMimeMessage_T *message, const char *s);
331 
339 
346 void cmime_message_set_date(CMimeMessage_T *message, const char *s);
347 
354 char *cmime_message_get_date(CMimeMessage_T *message);
355 
363 
370 void cmime_message_set_boundary(CMimeMessage_T *message, const char *boundary);
371 
376 #define cmime_message_get_boundary(message) (message->boundary)
377 
384 
391 
401 int cmime_message_from_file(CMimeMessage_T **message, const char *filename, int header_only);
402 
410 int cmime_message_to_file(CMimeMessage_T *message, const char *filename);
411 
419 
429 int cmime_message_from_string(CMimeMessage_T **message, const char *content, int header_only);
430 
437 #define cmime_message_part_count(message) (message->parts->size)
438 
445 void cmime_message_set_subject(CMimeMessage_T *message, const char *s);
446 
453 void cmime_message_set_subject_encode(CMimeMessage_T *message, const char *s);
454 
462 
469 void cmime_message_prepend_subject(CMimeMessage_T *message, const char *s);
470 
477 void cmime_message_append_subject(CMimeMessage_T *message, const char *s);
478 
486 int cmime_message_set_body(CMimeMessage_T *message, const char *content);
487 
496 
503 void cmime_message_add_attachment(CMimeMessage_T *message, char *attachment);
504 
513 CMimeMessage_T *cmime_message_create_skeleton(const char *sender, const char *recipient, const char *subject);
514 
523 
534 
539 #define cmime_message_part_first(message) ((CMimePart_T *)cmime_list_head(message->parts)->data)
540 
545 #define cmime_message_part_last(message) ((CMimePart_T *)cmime_list_tail(message->parts)->data)
546 
547 #ifdef __cplusplus
548 }
549 #endif
550 
551 #endif /* _CMIME_MESSAGE_H */
552 
void cmime_message_free(CMimeMessage_T *message)
Free a CMimeMessage_T object.
Definition: cmime_message.c:429
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:669
CMimeList_T * recipients
Definition: cmime_message.h:81
int cmime_message_part_remove(CMimeMessage_T *message, CMimePart_T *part)
Remove a mime part from message.
Definition: cmime_message.c:1186
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:526
int cmime_message_add_recipient(CMimeMessage_T *message, const char *recipient, CMimeAddressType_T t)
Add recipient to message.
Definition: cmime_message.c:560
char * gap
Definition: cmime_message.h:84
char * cmime_message_get_content_type(CMimeMessage_T *message)
Get Content-Type header value.
Definition: cmime_message.c:657
Definition: cmime_message.h:99
Defines functions and structs for mime part handling.
CMimeList_T * parts
Definition: cmime_message.h:85
Definition: cmime_message.h:96
CMimeStringList_T * boundaries
Definition: cmime_message.h:87
char * cmime_message_get_subject(CMimeMessage_T *message)
Get the subject string from CMimeMessage_T object.
Definition: cmime_message.c:1016
void cmime_message_set_content_type(CMimeMessage_T *message, const char *s)
Set Content-Type header.
Definition: cmime_message.c:653
char * linebreak
Definition: cmime_message.h:86
void cmime_message_set_date(CMimeMessage_T *message, const char *s)
Set date string header.
Definition: cmime_message.c:694
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:1116
char * cmime_message_get_content_id(CMimeMessage_T *message)
Get Content-ID header value.
Definition: cmime_message.c:682
Represents an email address.
Definition: cmime_address.h:57
char * cmime_message_get_content_description(CMimeMessage_T *message)
Get Content-Description header value.
Definition: cmime_message.c:690
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:1215
void cmime_message_append_subject(CMimeMessage_T *message, const char *s)
append string to subject
Definition: cmime_message.c:1031
Definition: cmime_message.h:98
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:1068
int cmime_message_to_file(CMimeMessage_T *message, const char *filename)
Write CMimeMessage_T object to file.
Definition: cmime_message.c:837
char * cmime_message_get_content_transfer_encoding(CMimeMessage_T *message)
Get Content-Transfer-Encoding value.
Definition: cmime_message.c:665
CMimeAddressType_T
Possible types of email addresses.
Definition: cmime_address.h:46
void cmime_message_add_generated_boundary(CMimeMessage_T *message)
Add a newly generated boundary to a CMimeMessage_T object.
Definition: cmime_message.c:759
Definition: cmime_message.h:72
int cmime_message_add_recipient_to(CMimeMessage_T *message, const char *recipient)
Add To recipient to message.
Definition: cmime_message.c:623
A mime part.
Definition: cmime_part.h:52
CMimeMessage_T * cmime_message_new(void)
Creates a new CMimeMessage_T object.
Definition: cmime_message.c:398
void cmime_message_set_subject_encode(CMimeMessage_T *message, const char *s)
Set message subject and convert to 7 bit mime encoded string based on RFC 2047.
Definition: cmime_message.c:1004
char * cmime_message_get_mime_version(CMimeMessage_T *message)
Get Mime-Version header value.
Definition: cmime_message.c:674
int cmime_message_set_date_now(CMimeMessage_T *message)
Get current time and set date header.
Definition: cmime_message.c:702
void cmime_message_set_content_transfer_encoding(CMimeMessage_T *message, const char *s)
set Content-Transfer-Encoding value
Definition: cmime_message.c:661
CMimeAddress_T * sender
Definition: cmime_message.h:80
void cmime_message_set_boundary(CMimeMessage_T *message, const char *boundary)
Set message boundary.
Definition: cmime_message.c:718
void cmime_message_set_content_description(CMimeMessage_T *message, const char *s)
Set Content-Description value.
Definition: cmime_message.c:686
CMimeMultipartType_T
Possible multipart mime subtypes.
Definition: cmime_message.h:94
int cmime_message_add_recipient_bcc(CMimeMessage_T *message, const char *recipient)
Add Bcc recipient to message.
Definition: cmime_message.c:643
char * cmime_message_generate_message_id(void)
Generate a message id.
Definition: cmime_message.c:1042
Definition: cmime_message.h:95
CMimeHeader_T * cmime_message_get_header(CMimeMessage_T *message, const char *header)
Get header for given key.
Definition: cmime_message.c:541
Represents an email message.
Definition: cmime_message.h:79
int cmime_message_add_recipient_encode(CMimeMessage_T *message, const char *recipient, CMimeAddressType_T t)
Add recipient to message and convert to 7 bit mime encoded string based on RFC 2047.
Definition: cmime_message.c:597
void cmime_message_set_content_id(CMimeMessage_T *message, const char *s)
Set Content-ID header value.
Definition: cmime_message.c:678
char * cmime_message_get_sender_string(CMimeMessage_T *message)
Get sender of a CMimeMessage_T object as string.
Definition: cmime_message.c:494
void cmime_message_add_attachment(CMimeMessage_T *message, char *attachment)
add attachment to message
Definition: cmime_message.c:1139
void cmime_message_set_sender_encode(CMimeMessage_T *message, const char *sender)
Add sender to CMimeMessage_T object and convert to 7 bit mime encoded string based on RFC 2047...
Definition: cmime_message.c:471
Definition: cmime_message.h:97
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:1163
CMimeBoundaryType_T
Possible types of boundaries.
Definition: cmime_message.h:70
char * boundary
Definition: cmime_message.h:83
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:453
void cmime_message_prepend_subject(CMimeMessage_T *message, const char *s)
prepend string to subject
Definition: cmime_message.c:1020
Double linked list implementation.
Definition: cmime_list.h:55
Defines functions and structs for double linked list.
char * cmime_message_get_date(CMimeMessage_T *message)
Get date string from CMimeMessage_T object.
Definition: cmime_message.c:698
CMimeList_T * headers
Definition: cmime_message.h:82
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:769
Defines functions and structs for email address handling.
Defines helper functions and structs for string handling.
char * cmime_message_to_string(CMimeMessage_T *message)
Return a message object as string.
Definition: cmime_message.c:861
Definition: cmime_message.h:71
char * cmime_message_get_message_id(CMimeMessage_T *message)
Get MessageID of message object.
Definition: cmime_message.c:522
Defines functions and structs for header management.
Defines utility functions.
void cmime_message_set_subject(CMimeMessage_T *message, const char *s)
Set message subject.
Definition: cmime_message.c:1000
A simple list with strings.
Definition: cmime_string.h:46
char * cmime_message_generate_boundary(void)
Generate a message boundary.
Definition: cmime_message.c:742
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:503
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:974
int cmime_message_set_body(CMimeMessage_T *message, const char *content)
Set plain body to non multipart message.
Definition: cmime_message.c:1077
A email header item.
Definition: cmime_header.h:45
int cmime_message_add_recipient_cc(CMimeMessage_T *message, const char *recipient)
Add Cc recipient to message.
Definition: cmime_message.c:633