339 lines
8.7 KiB
C
Executable File
339 lines
8.7 KiB
C
Executable File
#ifndef MAILSEND_H
|
|
#define MAILSEND_H
|
|
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <stdarg.h>
|
|
#include <errno.h>
|
|
|
|
#include <math.h>
|
|
|
|
|
|
#include "mutils.h"
|
|
#include "msock.h"
|
|
#include "sll.h"
|
|
|
|
#ifdef UNIX
|
|
#include <signal.h>
|
|
#endif /* UNIX */
|
|
|
|
#ifdef HAVE_OPENSSL
|
|
|
|
#include <openssl/ssl.h>
|
|
#include <openssl/rand.h>
|
|
#include <openssl/err.h>
|
|
#include <openssl/rand.h>
|
|
#include <openssl/md5.h>
|
|
#include <openssl/evp.h>
|
|
#include <openssl/hmac.h>
|
|
|
|
#endif /* HAVE_OPENSSL */
|
|
|
|
|
|
/*
|
|
** header for mailsend - a simple mail sender via SMTP
|
|
** $Id: mailsend.h,v 1.3 2002/06/22 21:17:29 muquit Exp $
|
|
**
|
|
** Development History:
|
|
** who when why
|
|
** muquit@muquit.com Mar-23-2001 first cut
|
|
*/
|
|
|
|
#define MFL __FILE__,__LINE__
|
|
|
|
#define MAILSEND_VERSION "@(#) mailsend v1.20b2"
|
|
#define MAILSEND_PROG "mailsend"
|
|
#define MAILSEND_AUTHOR "muquit@muquit.com"
|
|
#define MAILSEND_URL "http://www.muquit.com/"
|
|
#define NO_SPAM_STATEMENT "BSD. It is illegal to use this software for Spamming"
|
|
|
|
#define MAILSEND_SMTP_PORT 25
|
|
#define MAILSEND_DEF_SUB ""
|
|
|
|
#define A_SPACE ' '
|
|
#define A_DASH '-'
|
|
|
|
#define EMPTY_OK 0x01
|
|
#define EMPTY_NOT_OK 0x02
|
|
|
|
#define FILE_TYPE_DOS 0x00000001
|
|
#define FILE_TYPE_UNIX 0x00000002
|
|
#define FILE_TYPE_BINARY 0x00000004
|
|
|
|
#define DEFAULT_CONNECT_TIMEOUT 5 /* seconds */
|
|
#define DEFAULT_READ_TIMEOUT 5 /* seconds */
|
|
|
|
|
|
#ifdef EXTERN
|
|
#undef EXTERN
|
|
#endif /* EXTERN */
|
|
|
|
#ifndef __MAIN__
|
|
#define EXTERN extern
|
|
#else
|
|
#define EXTERN
|
|
#endif /* __MAIN__ */
|
|
|
|
#ifdef WINNT
|
|
#define snprintf _snprintf
|
|
#endif /* WINNT */
|
|
|
|
#define CFL __FILE__,__LINE__
|
|
|
|
#define CHECK_MALLOC(x) \
|
|
do \
|
|
{ \
|
|
if (x == NULL) \
|
|
{ \
|
|
(void) fprintf(stderr,"%s (%d) - Memory allocation failed\n",CFL); \
|
|
exit(0); \
|
|
}\
|
|
}while(0)
|
|
|
|
#define CHECK_USERNAME(mech) \
|
|
do \
|
|
{ \
|
|
if (*g_username == '\0') \
|
|
{ \
|
|
(void) fprintf(stderr,"\nError: No user name specified for 'AUTH %s'\n",mech); \
|
|
(void) fprintf(stderr," use the flag '-user username'\n\n");\
|
|
rc=(-1);\
|
|
goto cleanup; \
|
|
}\
|
|
}while(0)
|
|
|
|
#define CHECK_USERPASS(mech) \
|
|
do \
|
|
{ \
|
|
if (*g_userpass == '\0') \
|
|
{ \
|
|
(void) fprintf(stderr,"\nError: No password specified for user %s for 'AUTH %s'\n",g_username,mech); \
|
|
(void) fprintf(stderr," user '-pass password' or env var SMTP_USER_PASS\n\n");\
|
|
rc=(-1);\
|
|
goto cleanup; \
|
|
}\
|
|
}while(0)
|
|
|
|
#define RETURN_IF_NOT_ZERO(rc) \
|
|
do \
|
|
{ \
|
|
if (rc != 0) \
|
|
{ \
|
|
return(rc); \
|
|
} \
|
|
}while(0)
|
|
|
|
#define CHECK_WRITE_STATUS(n) \
|
|
do \
|
|
{ \
|
|
if (n <= 0) \
|
|
{ \
|
|
goto ExitProcessing; \
|
|
} \
|
|
}while(0)
|
|
|
|
|
|
#define ERR_STR strerror(errno)
|
|
|
|
#define CONTENT_DISPOSITION_INLINE 0x01
|
|
#define CONTENT_DISPOSITION_ATTACHMENT 0x02
|
|
|
|
/* only suport base64 at this time */
|
|
/* as of Jul-01-2013 */
|
|
#define ENCODE_7BIT 0x01 /* default for text/plain */
|
|
#define ENCODE_8BIT 0x02
|
|
#define ENCODE_BASE64 0x03
|
|
#define ENCODE_QUOTED_PRINTABLE 0x04
|
|
#define ENCODE_NONE 0x05
|
|
|
|
#define DEFAULT_CHARSET "utf-8"
|
|
|
|
EXTERN int g_verbose;
|
|
EXTERN int g_connect_timeout;
|
|
EXTERN int g_read_timeout;
|
|
EXTERN int g_wait_for_cr;
|
|
EXTERN int g_do_ssl;
|
|
EXTERN int g_do_starttls;
|
|
EXTERN int g_quiet;
|
|
EXTERN int g_do_auth;
|
|
EXTERN int g_esmtp;
|
|
EXTERN int g_auth_plain;
|
|
EXTERN int g_auth_cram_md5;
|
|
EXTERN int g_auth_login;
|
|
EXTERN char g_charset[33];
|
|
EXTERN char g_username[64];
|
|
EXTERN char g_userpass[64];
|
|
EXTERN char g_from_name[64];
|
|
EXTERN char g_content_transfer_encoding[32];
|
|
EXTERN FILE *g_log_fp;
|
|
EXTERN char g_log_file[MUTILS_PATH_MAX];
|
|
EXTERN int g_show_attachment_in_log;
|
|
EXTERN int g_use_protocol;
|
|
EXTERN char g_content_type[64];
|
|
EXTERN char g_attach_sep[4];
|
|
EXTERN char g_attach_name[64];
|
|
EXTERN char g_content_disposition[32];
|
|
EXTERN char g_content_id[64];
|
|
EXTERN char g_mime_type[64];
|
|
EXTERN int g_force;
|
|
|
|
|
|
typedef struct _Address
|
|
{
|
|
|
|
/*
|
|
** label holds strings like "To" "Cc" "Bcc".
|
|
** The address is the email address.
|
|
*/
|
|
|
|
char
|
|
*label, /* To: Cc: Bcc: */
|
|
*address; /* the email address */
|
|
}Address;
|
|
|
|
typedef struct _Attachment
|
|
{
|
|
char
|
|
*file_path,
|
|
*file_name,
|
|
*attachment_name,
|
|
*content_id;
|
|
|
|
char
|
|
*oneline_msg;
|
|
|
|
char
|
|
*mime_type;
|
|
|
|
char
|
|
*content_disposition;
|
|
|
|
char
|
|
*content_transfer_encoding,
|
|
*charset;
|
|
|
|
int
|
|
attach_separator;
|
|
|
|
FILE
|
|
*fp_read;
|
|
|
|
char
|
|
mime_tmpfile[MUTILS_PATH_MAX];
|
|
}Attachment;
|
|
|
|
/* the mail sturct */
|
|
typedef struct _TheMail
|
|
{
|
|
SOCKET
|
|
fd;
|
|
|
|
Address
|
|
*address;
|
|
|
|
char
|
|
*from,
|
|
*subject,
|
|
*x_mailer,
|
|
*smtp_server,
|
|
*helo_domain,
|
|
*msg_file;
|
|
} TheMail;
|
|
|
|
|
|
/* struct for $HOME/.mailsendrc */
|
|
typedef struct _Mailsendrc
|
|
{
|
|
char
|
|
*domain,
|
|
*from,
|
|
*smtp_server;
|
|
}Mailsendrc;
|
|
|
|
/* function prototypes */
|
|
char *xStrdup(const char *string);
|
|
int addAddressToList(char *a,char *label);
|
|
TheMail *initTheMail(void);
|
|
Address *newAddress(void);
|
|
Sll *getAddressList(void);
|
|
void printAddressList(void);
|
|
void print_server_caps(void);
|
|
void print_one_lines(void);
|
|
char *check_server_cap(char *what);
|
|
int read_smtp_line(void);
|
|
int read_smtp_multi_lines(void);
|
|
int show_smtp_info(char *smtp_server,int port,char *domain);
|
|
int send_the_mail(char *from,char *to,char *cc,char *bcc,char *sub,
|
|
char *smtp_server,int smtp_port,char *helo_domain,
|
|
char *attach_file,char *txt_msg_file,char *the_msg,
|
|
int is_mime,char *rrr,char *rt,int add_dateh,char* return_path_addr);
|
|
TheMail *newTheMail(void);
|
|
void errorMsg(char *format,...);
|
|
void showVerbose(char *format,...);
|
|
void print_info(char *format,...);
|
|
void write_log(char *format,...);
|
|
void open_log(const char *log_file);
|
|
void close_log(void);
|
|
void exit_ok(void);
|
|
void exit_error(void);
|
|
void log_info(const char *fmt, ...);
|
|
void log_debug(const char *fmt, ...);
|
|
void log_error(const char *fmt, ...);
|
|
void log_fatal(const char *fmt, ...);
|
|
int addAddressesFromFileToList(char *adress_list_file);
|
|
int validateMusts(char *from,char *to,char *smtp_server,
|
|
char *helo_domain);
|
|
char *askFor(char *buf,int buflen,char *label,int loop);
|
|
int isInConsole(int fd);
|
|
int add_one_line_to_list(char *line);
|
|
int add_msg_body_files_to_list(char *file_path);
|
|
int add_embed_image_to_attachment_list(const char *image_file);
|
|
int add_customer_header_to_list(char *line);
|
|
int add_attachment_to_list(char *file_path_mime);
|
|
int add_oneline_to_attachment_list(char *one_line_msg);
|
|
int add_msg_body_to_attachment_list(const char *msg_body_file);
|
|
int add_server_cap_to_list(char *capability);
|
|
Sll *get_one_line_list(void);
|
|
Sll *get_custom_header_list(void);
|
|
Sll *get_attachment_list(void);
|
|
Sll *get_oneline_attachment_list(void);
|
|
Sll *get_msg_body_attachment_list(void);
|
|
Sll *get_embed_image_attachment_list(void);
|
|
Sll *get_server_caps_list(void);
|
|
Sll *get_msg_body_files_list(void);
|
|
void print_attachment_list(void);
|
|
void print_oneline_attachment_list(void);
|
|
char *fix_to(char *to);
|
|
int isInteractive(void);
|
|
int get_filepath_mimetype(char *str,char *filename,int fn_size,
|
|
char *mype_type,int mt_size);
|
|
int rfc822_date(time_t when,char *datebuf,int bufsiz);
|
|
|
|
void openssl_init_init_SSLLibrary(void);
|
|
int do_tls(int sfd);
|
|
void initialize_openssl(char *cipher);
|
|
char *encode_cram_md5(char *challenge,char *user,char *pass);
|
|
int guess_file_type(char *path,unsigned int *flag);
|
|
void generate_encrypted_password(const char *plaintext);
|
|
void print_copyright(void);
|
|
int get_encoding_type(const char *type);
|
|
int get_content_disposition(const char *disposition);
|
|
Attachment *allocate_attachment(void);
|
|
int write_to_socket(char *str);
|
|
int print_content_type_header(const char *boundary);
|
|
int send_attachment(Attachment *a, const char *boundary);
|
|
int process_attachments(const char *boundary);
|
|
int process_oneline_messages(const char *boundary);
|
|
int process_embeded_images(const char *boundary);
|
|
int encode2base64andwrite2socket(const char *str);
|
|
int include_msg_body(void);
|
|
int include_image(void);
|
|
void show_examples(void);
|
|
char *get_mime_type(char *path);
|
|
#ifdef HAVE_OPENSSL
|
|
void print_cert_info(SSL *ssl);
|
|
void show_mime_types(void);
|
|
#endif /* HAVE_OPENSSL */
|
|
|
|
#endif /* ! MAIL_SEND_H */
|