/* Copyright (C) 2020 C. McEnroe * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include struct Address { char *name; const char *mailbox; const char *host; }; struct AddressList { size_t len; struct Address *addrs; }; struct Envelope { struct tm date; char *subject; struct Address from, sender, replyTo; struct AddressList to, cc, bcc; const char *inReplyTo; const char *messageID; }; static inline void envelopeFree(struct Envelope envelope) { free(envelope.subject); free(envelope.from.name); free(envelope.sender.name); free(envelope.replyTo.name); for (size_t i = 0; i < envelope.to.len; ++i) { free(envelope.to.addrs[i].name); } for (size_t i = 0; i < envelope.cc.len; ++i) { free(envelope.cc.addrs[i].name); } for (size_t i = 0; i < envelope.bcc.len; ++i) { free(envelope.bcc.addrs[i].name); } free(envelope.to.addrs); free(envelope.cc.addrs); free(envelope.bcc.addrs); } #define TEMPLATE(...) #__VA_ARGS__ struct Variable { const char *name; const char *value; }; typedef int EscapeFn(FILE *file, const char *str); int templateRender( FILE *file, const char *template, const struct Variable *vars, EscapeFn *escape ); #define MBOX_HEADERS \ "Date Subject From Sender Reply-To To Cc Bcc " \ "Message-Id In-Reply-To References " \ "MIME-Version Content-Type Content-Disposition Content-Transfer-Encoding" int mboxFrom(FILE *file); int mboxHeader(FILE *file, char *header); int mboxBody(FILE *file, char *body); int htmlEnvelope(FILE *file, const struct Envelope *envelope);