Files
WrenchBoradWeb/wrenchboard/src/core/smtp.cc
T
2022-02-05 23:33:32 -05:00

170 lines
4.2 KiB
C++

#include <sys/types.h>
#include <sys/wait.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include "safestring.h"
#include <string.h>
#include <time.h>
#include <unistd.h>
#include <errno.h>
#include <arpa/nameser.h>
#include <resolv.h>
//#include "general_types.h"
#include "clog.h"
//#include "mx.h"
#include "smtp.h"
#include "timer.h"
//#include "socket.h"
int SMTP2( const char * _server, const char * _from, char * _to, char * _body, const char * _domain, const char * _user, const char * _pass, const char * _name)
{
// SAF 1/24/03: first copy all data to local structures to avoid race conditions, which is currently causing crashes !
// Actually, it wasn't the race condition, it was the fact that '_to' was NULL due to a bug in profile.cpp: "email" was not set
logfmt( FLOG_MAX, "ESMTP( %s, %s, %s )", _server, _from, _to );
if ( !_server || !_from || !_to || !_body )
{
logfmt( FLOG_MAX, "Input parameters server, from, to & body are requied" );
return 0;
}
if ( !_to[0])
{
logfmt( FLOG_MAX, "Empty recipient list" );
return 0;
}
int BUF_SIZE = 512+strlen(_server)+strlen(_from)+strlen(_to)+strlen(_domain)+strlen(_user)+strlen(_pass)+strlen(_name)+2*strlen(_body);
char *subject = NULL, *body = NULL;
char *name = new char[BUF_SIZE+1];
// Prepare body & subject
logfmt( FLOG_MAX, "Prepare body" );
int lines = 0;
int len = strlen( _body );
for ( int i=0; i<len; i++ )
{
int c = _body[i];
// Replace ' with "
if (c == 39)
{
_body[i] = '"';
}
// count LFs
if (c == 10)
{
lines++;
}
// remove CRs (replace with whitespaces)
if (c == 13)
{
_body[i] = 32;
}
}
// Locate & extract subject
logfmt( FLOG_MAX, "Locate & extract subject" );
char *subj = strstr ( _body, "Subject: " );
if (subj != NULL)
{
int k = 0;
int n = strlen(subj);
for (int i=0; i<n; i++)
{
int c = subj[i];
if (subject != NULL)
{
name[k++] = c;
}
if (subject == NULL && c == 10)
{
if (i > 9)
{
subject = new char[i+1];
memset( subject, 0, i );
int j = 9;
for (; j<i; j++)
{
//logfmt( FLOG_MAX, "c=%ld", subj[j] );
subject[j-9] = subj[j];
//subj[j] = 32;
}
subject[j] = '\0';
logfmt( FLOG_MAX, "Found subject: %s", subject);
}
}
}
if (subject != NULL)
{
name[k++] = '\0';
body = new char[k];
//logfmt( FLOG_MAX, "New body(%ld): %s (%ld)", k, name, strlen(_body) );
snprintf( body, k, "%s", name);
}
}
if (subject == NULL)
{
subject = new char[15];
strcpy(subject,"Wrenchboard Support");
logfmt( FLOG_MAX, "Subject is not found - defaulting to: %s", subject );
}
// Google
snprintf( name, BUF_SIZE, EMAIL_PREFIX"/../src/modules/mailsend -smtp %s -f %s -t %s -domain %s -name '%s' +cc +bcc -v -starttls -port 587 -auth-plain -user %s -pass %s -sub '%s' -content-type 'multipart/mixed' -mime-type 'text/html' -disposition inline -M '%s'",
_server, _from, _to, _domain, _name, _user, _pass, subject, body != NULL ? body : _body );
/*
// Virtualmail
snprintf( name, BUF_SIZE, EMAIL_PREFIX"/../src/modules/mailsend -smtp %s -f %s -t %s -domain %s -name '%s' +cc +bcc -v -port 25 -auth-plain -user %s -pass %s -sub '%s' -content-type 'text/html' -mime-type 'text/html' -M '%s'",
_server, _from, _to, _domain, _name, _user, _pass, subject, body != NULL ? body : _body );
*//*
// GoDaddy
snprintf( name, BUF_SIZE, EMAIL_PREFIX"/../src/modules/mailsend -smtp %s -f %s -t %s -domain %s -name '%s' +cc +bcc -v -port 80 -auth-plain -user %s -pass %s -sub '%s' -content-type 'text/html' -mime-type 'text/html' -M '%s'",
_server, _from, _to, _domain, _name, _user, _pass, subject, body != NULL ? body : _body );
*/
logfmt( FLOG_MAX, "Calling MAILSEND: %s", name);
FILE * p = popen( name, "r" );
int c = 0;
do
{
c = fread( name, 1, BUF_SIZE, p );
if (c > 0)
{
logfmt( FLOG_MAX, "%s", name );
}
else
{
logfmt( FLOG_MAX, "\n\nEND OF PIPE OUTPUT\n\n" );
}
}
while (c > 0);
pclose( p );
if (name != NULL)
{
delete name;
}
if (subject != NULL)
{
delete subject;
}
if (body != NULL)
{
delete body;
}
logfmt( FLOG_MAX, "/ESMTP()" );
return 1;
}