|
|
|
@ -32,6 +32,8 @@
|
|
|
|
|
#include "mms_queue.h"
|
|
|
|
|
#include "mms_uaprof.h"
|
|
|
|
|
|
|
|
|
|
static int smtp_send(char *relay_host, int port, Octstr *from, List *to, Octstr *msg);
|
|
|
|
|
|
|
|
|
|
Octstr *_mms_cfg_getx(mCfg *cfg, mCfgGrp *grp, Octstr *item)
|
|
|
|
|
{
|
|
|
|
|
Octstr *v = mms_cfg_get(cfg, grp, item);
|
|
|
|
@ -529,7 +531,8 @@ static void addmmscname(Octstr *s, Octstr *myhostname)
|
|
|
|
|
static int send2email(Octstr *to, Octstr *from, Octstr *subject,
|
|
|
|
|
Octstr *msgid,
|
|
|
|
|
MIMEEntity *m, int append_hostname, Octstr **error,
|
|
|
|
|
char *sendmail_cmd, Octstr *myhostname)
|
|
|
|
|
char *sendmail_cmd, Octstr *myhostname,
|
|
|
|
|
Octstr *relay_host, int relay_port)
|
|
|
|
|
{
|
|
|
|
|
Octstr *s;
|
|
|
|
|
FILE *f;
|
|
|
|
@ -601,6 +604,14 @@ static int send2email(Octstr *to, Octstr *from, Octstr *subject,
|
|
|
|
|
mime_replace_headers(m, headers);
|
|
|
|
|
s = mime_entity_to_octstr(m);
|
|
|
|
|
|
|
|
|
|
if (relay_host && relay_port > 0) {
|
|
|
|
|
List *lto = gwlist_create();
|
|
|
|
|
gwlist_append(lto, octstr_duplicate(to));
|
|
|
|
|
|
|
|
|
|
ret = smtp_send(octstr_get_cstr(relay_host), relay_port, from, lto, s);
|
|
|
|
|
gwlist_destroy(lto, (void *)octstr_destroy);
|
|
|
|
|
goto done;
|
|
|
|
|
}
|
|
|
|
|
/*
|
|
|
|
|
* Make the command: Transpose % formatting characters:
|
|
|
|
|
* f - from address
|
|
|
|
@ -709,13 +720,87 @@ done:
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int smtp_send(char *relay_host, int port, Octstr *from, List *to, Octstr *msg)
|
|
|
|
|
{
|
|
|
|
|
int fd = tcpip_connect_to_server(relay_host, port, NULL);
|
|
|
|
|
Connection *c;
|
|
|
|
|
Octstr *l;
|
|
|
|
|
List *xl;
|
|
|
|
|
int i, ret = -1, code;
|
|
|
|
|
char tbuf[512];
|
|
|
|
|
|
|
|
|
|
if (fd < 0 || (c = conn_wrap_fd(fd,0)) == NULL)
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
socket_set_blocking(fd,1); /* Because we want each line as it comes */
|
|
|
|
|
|
|
|
|
|
l = conn_read_line(c); /* Get greeting. */
|
|
|
|
|
|
|
|
|
|
if (l == NULL)
|
|
|
|
|
goto done;
|
|
|
|
|
tbuf[0] = 0;
|
|
|
|
|
sscanf(octstr_get_cstr(l), "%*d %128s", tbuf);
|
|
|
|
|
octstr_destroy(l);
|
|
|
|
|
|
|
|
|
|
#define SANDC(fmt,arg,val,cont) do { \
|
|
|
|
|
Octstr *y, *x = octstr_format(fmt,arg); \
|
|
|
|
|
conn_write(c,x); \
|
|
|
|
|
octstr_destroy(x); \
|
|
|
|
|
if ((y = conn_read_line(c)) == NULL) \
|
|
|
|
|
goto done; \
|
|
|
|
|
sscanf(octstr_get_cstr(y), "%d", &code); \
|
|
|
|
|
octstr_destroy(y); \
|
|
|
|
|
if (code != (val) && !(cont)) \
|
|
|
|
|
goto done; \
|
|
|
|
|
} while (0) \
|
|
|
|
|
|
|
|
|
|
SANDC("HELO %s\r\n", tbuf, 250,0);
|
|
|
|
|
SANDC("MAIL FROM:<%S>\r\n", from, 250,0);
|
|
|
|
|
|
|
|
|
|
for (i = 0; i<gwlist_len(to); i++) {
|
|
|
|
|
Octstr *xto = gwlist_get(to, i);
|
|
|
|
|
|
|
|
|
|
SANDC("RCPT TO:<%S>\r\n", xto, 250, 1);
|
|
|
|
|
|
|
|
|
|
if (code == 250) {
|
|
|
|
|
octstr_destroy(xto); /* Sent */
|
|
|
|
|
gwlist_delete(to, i, 1);
|
|
|
|
|
i--;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
SANDC("DATA\r\n", 0, 354, 0);
|
|
|
|
|
|
|
|
|
|
xl = octstr_split(msg, octstr_imm("\n"));
|
|
|
|
|
|
|
|
|
|
while ((l = gwlist_extract_first(xl)) != NULL) {
|
|
|
|
|
|
|
|
|
|
if (octstr_get_char(l, 0) == '.')
|
|
|
|
|
octstr_insert_char(l, 0, '.');
|
|
|
|
|
|
|
|
|
|
if (octstr_get_char(l, octstr_len(l) - 1) != '\r')
|
|
|
|
|
octstr_append_char(l, '\r');
|
|
|
|
|
octstr_append_char(l, '\n');
|
|
|
|
|
|
|
|
|
|
conn_write(c, l);
|
|
|
|
|
octstr_destroy(l);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
gwlist_destroy(xl, NULL);
|
|
|
|
|
SANDC(".\r\n", 0, 250, 0);
|
|
|
|
|
conn_write(c, octstr_imm("QUIT\r\n"));
|
|
|
|
|
ret = 0;
|
|
|
|
|
done:
|
|
|
|
|
conn_destroy(c);
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int mm_send_to_email(Octstr *to, Octstr *from, Octstr *subject,
|
|
|
|
|
Octstr *msgid,
|
|
|
|
|
MIMEEntity *m, int append_hostname, Octstr **error,
|
|
|
|
|
char *sendmail_cmd, Octstr *myhostname)
|
|
|
|
|
char *sendmail_cmd, Octstr *myhostname,
|
|
|
|
|
Octstr *relay_host, int relay_port)
|
|
|
|
|
{
|
|
|
|
|
return send2email(to,from,subject,msgid,m,append_hostname,error,sendmail_cmd,myhostname);
|
|
|
|
|
return send2email(to,from,subject,msgid,m,append_hostname,error,sendmail_cmd,myhostname, relay_host, relay_port);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Send this message to email recipient. */
|
|
|
|
@ -728,7 +813,8 @@ int mms_sendtoemail(Octstr *from, Octstr *to,
|
|
|
|
|
int trans_smil, char *txt, char *html,
|
|
|
|
|
int mm4,
|
|
|
|
|
char *transid,
|
|
|
|
|
List *extra_headers)
|
|
|
|
|
List *extra_headers,
|
|
|
|
|
Octstr *relay_host, int relay_port)
|
|
|
|
|
{
|
|
|
|
|
MIMEEntity *m = NULL;
|
|
|
|
|
List *headers = NULL;
|
|
|
|
@ -860,7 +946,7 @@ done:
|
|
|
|
|
|
|
|
|
|
if (ret == 0)
|
|
|
|
|
ret = send2email(to,
|
|
|
|
|
from, subject, msgid, m, mm4 == 0, error, sendmail_cmd, myhostname);
|
|
|
|
|
from, subject, msgid, m, mm4 == 0, error, sendmail_cmd, myhostname, relay_host, relay_port);
|
|
|
|
|
mime_entity_destroy(m);
|
|
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
|