#include #include #include #include #include #include #include #include #include #include #include #include #define C(X) {int e; if((e = X) != 0) { \ fprintf(stderr, "%s failed: %s\n", #X, strerror(e)); \ exit(1); } } const char USAGE[] = "usage: mailer [-hd] [-m mailer] [-f from] [to]..." ; const char HELP[] = " -h print this helpful message\n" " -m a mailer URL (default is \"sendmail:\")\n" " -f the envelope from address (default is from user environment)\n" " to a list of envelope to addresses (default is from message)\n" "\n" "An RFC2822 formatted message is read from stdin and delivered using\n" "the mailer.\n" ; int main (int argc, char *argv[]) { int opt; int optdebug = 0; char* optmailer = "sendmail:"; char* optfrom = 0; stream_t in = 0; message_t msg = 0; mailer_t mailer = 0; address_t from = 0; address_t to = 0; while((opt = getopt(argc, argv, "hdm:f:")) != -1) { switch(opt) { case 'h': printf("%s\n%s", USAGE, HELP); return 0; case 'd': optdebug++; break; case 'm': optmailer = optarg; break; case 'f': optfrom = optarg; break; default: fprintf(stderr, "%s\n", USAGE); break; } } /* Register mailers. */ { list_t bookie; registrar_get_list (&bookie); C( list_append (bookie, smtp_record) ) C( list_append (bookie, sendmail_record) ) } if(optfrom) { C( address_create(&from, optfrom) ) } if(argv[optind]) { char** av = argv + optind; C( address_createv(&to, (const char**) av, -1) ) } C( stdio_stream_create(&in) ) C( stream_open(in, (char*) stdin, 0, MU_STREAM_READ) ) C( message_create (&msg, NULL) ) C( message_set_stream(msg, in, NULL) ) C( mailer_create(&mailer, optmailer) ) if(optdebug) { mu_debug_t debug; mailer_get_debug (mailer, &debug); mu_debug_set_level (debug, MU_DEBUG_TRACE | MU_DEBUG_PROT); } C( mailer_open(mailer, 0) ) C( mailer_send(mailer, msg, from, to) ) return 0; }