77 |
*/ |
*/ |
78 |
void sendmail(Mail_T mail) { |
void sendmail(Mail_T mail) { |
79 |
|
|
80 |
Mail_T p; |
Mail_T m; |
81 |
char *now = get_RFC1123date(NULL); |
char *now = get_RFC1123date(NULL); |
82 |
char *localhost= get_localhostname(); |
char *localhost= get_localhostname(); |
83 |
|
|
84 |
if ( !initialize_server() ) { |
if(!initialize_server()) { |
85 |
|
|
86 |
goto exit; |
goto exit; |
87 |
|
|
88 |
} |
} |
89 |
|
|
90 |
if ( sigsetjmp(die, TRUE) ) { |
if(sigsetjmp(die, TRUE)) { |
91 |
|
|
92 |
goto exit; |
goto exit; |
93 |
|
|
97 |
do_send("HELO %s\r\n", localhost); |
do_send("HELO %s\r\n", localhost); |
98 |
do_status(); |
do_status(); |
99 |
|
|
100 |
for(p= mail; p; p= p->next) { |
for(m= mail; m; m= m->next) { |
101 |
|
|
102 |
do_send("MAIL FROM: <%s>\r\n", p->from); |
do_send("MAIL FROM: <%s>\r\n", m->from); |
103 |
do_status(); |
do_status(); |
104 |
do_send("RCPT TO: <%s>\r\n", p->to); |
do_send("RCPT TO: <%s>\r\n", m->to); |
105 |
do_status(); |
do_status(); |
106 |
do_send("DATA\r\n"); |
do_send("DATA\r\n"); |
107 |
do_status(); |
do_status(); |
108 |
do_send("From: %s\r\n", p->from); |
do_send("From: %s\r\n", m->from); |
109 |
do_send("To: %s\r\n", p->to); |
do_send("To: %s\r\n", m->to); |
110 |
do_send("Subject: %s\r\n", p->subject); |
do_send("Subject: %s\r\n", m->subject); |
111 |
do_send("Date: %s\r\n", now); |
do_send("Date: %s\r\n", now); |
112 |
do_send("X-Mailer: %s %s\r\n", prog, VERSION); |
do_send("X-Mailer: %s %s\r\n", prog, VERSION); |
113 |
do_send("Mime-Version: 1.0\r\n"); |
do_send("Mime-Version: 1.0\r\n"); |
114 |
do_send("Content-Type: text/plain; charset=\"iso-8859-1\"\r\n"); |
do_send("Content-Type: text/plain; charset=\"iso-8859-1\"\r\n"); |
115 |
do_send("Content-Transfer-Encoding: quoted-printable\r\n"); |
do_send("Content-Transfer-Encoding: quoted-printable\r\n"); |
116 |
do_send("\r\n"); |
do_send("\r\n"); |
117 |
do_send("%s\r\n", p->message); |
do_send("%s\r\n", m->message); |
118 |
if(p->opt_message) do_send("%s\r\n", p->opt_message); |
if(m->opt_message) |
119 |
|
do_send("%s\r\n", m->opt_message); |
120 |
do_send(".\r\n"); |
do_send(".\r\n"); |
121 |
do_status(); |
do_status(); |
122 |
|
|
141 |
|
|
142 |
struct sigaction sa; |
struct sigaction sa; |
143 |
|
|
144 |
if ( (server= Run.mailserver) == NULL ) { |
if((server= Run.mailserver) == NULL) { |
145 |
|
|
146 |
server= LOCALHOST; |
server= LOCALHOST; |
147 |
|
|
153 |
sigaction(SIGALRM, &sa, NULL); |
sigaction(SIGALRM, &sa, NULL); |
154 |
alarm(SMTP_TIMEOUT); |
alarm(SMTP_TIMEOUT); |
155 |
|
|
156 |
if ( (mysocket= create_socket(server, SMTP_PORT, SOCK_STREAM)) <0 ) { |
if((mysocket= create_socket(server, SMTP_PORT, SOCK_STREAM)) <0) { |
157 |
|
|
158 |
log("Cannot open a connection to the mailserver '%s' -- %s\n", |
log("Cannot open a connection to the mailserver '%s' -- %s\n", |
159 |
server, STRERROR); |
server, STRERROR); |
171 |
|
|
172 |
alarm(0); |
alarm(0); |
173 |
|
|
174 |
if ( mysocket && !close_socket(mysocket) ) { |
if(mysocket && !close_socket(mysocket)) { |
175 |
|
|
176 |
log("Error shutting down socket connection to mailserver %s -- %s\n", |
log("Error shutting down socket connection to mailserver %s -- %s\n", |
177 |
server, STRERROR); |
server, STRERROR); |
193 |
|
|
194 |
char msg[2048]; |
char msg[2048]; |
195 |
va_list ap; |
va_list ap; |
196 |
|
|
197 |
va_start(ap,format); |
va_start(ap,format); |
198 |
vsnprintf(msg, 2048, format, ap); |
vsnprintf(msg, 2048, format, ap); |
199 |
va_end(ap); |
va_end(ap); |
200 |
|
|
201 |
if ( sock_send(mysocket, msg, strlen(msg), 0) <= 0 ) { |
if(sock_send(mysocket, msg, strlen(msg), 0) <= 0) { |
202 |
|
|
203 |
log("Sendmail: error sending data to the server '%s' -- %s\n", |
log("Sendmail: error sending data to the server '%s' -- %s\n", |
204 |
server, STRERROR); |
server, STRERROR); |
214 |
int status; |
int status; |
215 |
char buf[STRLEN]; |
char buf[STRLEN]; |
216 |
|
|
217 |
if ( sock_recv(mysocket, buf, sizeof(buf), 0) <= 0 ) { |
if(sock_recv(mysocket, buf, sizeof(buf), 0) <= 0) { |
218 |
|
|
219 |
log("Sendmail: error receiving data from the mailserver '%s' -- %s\n", |
log("Sendmail: error receiving data from the mailserver '%s' -- %s\n", |
220 |
server, STRERROR); |
server, STRERROR); |
225 |
chomp(buf); |
chomp(buf); |
226 |
|
|
227 |
sscanf(buf, "%d", &status); |
sscanf(buf, "%d", &status); |
228 |
if ( status >= 400 ) { |
if(status >= 400) { |
229 |
|
|
230 |
log("Sendmail error: %s\n", buf); |
log("Sendmail error: %s\n", buf); |
231 |
siglongjmp(die, TRUE); |
siglongjmp(die, TRUE); |