Fossil SCM

Attempt to provide improved error message outputs for failures while trying to send notification via relay to an MTA.

drh 2025-04-15 23:34 trunk
Commit e6c27d3dabf0c3631e09f8212002c7d06b7bed16e7893fd7e5da7a7bdb797fa2
3 files changed +10 -2 +6 -1 +52 -14
+10 -2
--- src/alerts.c
+++ src/alerts.c
@@ -1033,13 +1033,21 @@
10331033
blob_write_to_file(&all, zFile);
10341034
fossil_free(zFile);
10351035
}else if( p->pSmtp ){
10361036
char **azTo = 0;
10371037
int nTo = 0;
1038
+ SmtpSession *pSmtp = p->pSmtp;
10381039
email_header_to(pHdr, &nTo, &azTo);
1039
- if( nTo>0 ){
1040
- smtp_send_msg(p->pSmtp, p->zFrom, nTo, (const char**)azTo,blob_str(&all));
1040
+ if( nTo>0 && !pSmtp->bFatal ){
1041
+ smtp_send_msg(pSmtp,p->zFrom,nTo,(const char**)azTo,blob_str(&all));
1042
+ if( pSmtp->zErr && !pSmtp->bFatal ){
1043
+ smtp_send_msg(pSmtp,p->zFrom,nTo,(const char**)azTo,blob_str(&all));
1044
+ }
1045
+ if( pSmtp->zErr ){
1046
+ fossil_errorlog("SMTP: (%s) %s", pSmtp->bFatal ? "fatal" : "retry",
1047
+ pSmtp->zErr);
1048
+ }
10411049
email_header_to_free(nTo, azTo);
10421050
}
10431051
}else if( strcmp(p->zDest, "stdout")==0 ){
10441052
char **azTo = 0;
10451053
int nTo = 0;
10461054
--- src/alerts.c
+++ src/alerts.c
@@ -1033,13 +1033,21 @@
1033 blob_write_to_file(&all, zFile);
1034 fossil_free(zFile);
1035 }else if( p->pSmtp ){
1036 char **azTo = 0;
1037 int nTo = 0;
 
1038 email_header_to(pHdr, &nTo, &azTo);
1039 if( nTo>0 ){
1040 smtp_send_msg(p->pSmtp, p->zFrom, nTo, (const char**)azTo,blob_str(&all));
 
 
 
 
 
 
 
1041 email_header_to_free(nTo, azTo);
1042 }
1043 }else if( strcmp(p->zDest, "stdout")==0 ){
1044 char **azTo = 0;
1045 int nTo = 0;
1046
--- src/alerts.c
+++ src/alerts.c
@@ -1033,13 +1033,21 @@
1033 blob_write_to_file(&all, zFile);
1034 fossil_free(zFile);
1035 }else if( p->pSmtp ){
1036 char **azTo = 0;
1037 int nTo = 0;
1038 SmtpSession *pSmtp = p->pSmtp;
1039 email_header_to(pHdr, &nTo, &azTo);
1040 if( nTo>0 && !pSmtp->bFatal ){
1041 smtp_send_msg(pSmtp,p->zFrom,nTo,(const char**)azTo,blob_str(&all));
1042 if( pSmtp->zErr && !pSmtp->bFatal ){
1043 smtp_send_msg(pSmtp,p->zFrom,nTo,(const char**)azTo,blob_str(&all));
1044 }
1045 if( pSmtp->zErr ){
1046 fossil_errorlog("SMTP: (%s) %s", pSmtp->bFatal ? "fatal" : "retry",
1047 pSmtp->zErr);
1048 }
1049 email_header_to_free(nTo, azTo);
1050 }
1051 }else if( strcmp(p->zDest, "stdout")==0 ){
1052 char **azTo = 0;
1053 int nTo = 0;
1054
+6 -1
--- src/printf.c
+++ src/printf.c
@@ -1077,10 +1077,11 @@
10771077
time_t now;
10781078
FILE *out;
10791079
const char *z;
10801080
int i;
10811081
int bDetail = 0;
1082
+ int bBrief = 0;
10821083
va_list ap;
10831084
static const char *const azEnv[] = { "HTTP_HOST", "HTTP_REFERER",
10841085
"HTTP_USER_AGENT",
10851086
"PATH_INFO", "QUERY_STRING", "REMOTE_ADDR", "REQUEST_METHOD",
10861087
"REQUEST_URI", "SCRIPT_NAME" };
@@ -1098,16 +1099,20 @@
10981099
pNow->tm_hour, pNow->tm_min, pNow->tm_sec);
10991100
va_start(ap, zFormat);
11001101
if( zFormat[0]=='X' ){
11011102
bDetail = 1;
11021103
zFormat++;
1104
+ }else if( strncmp(zFormat,"SMTP:",5)==0 ){
1105
+ bBrief = 1;
11031106
}
11041107
vfprintf(out, zFormat, ap);
11051108
fprintf(out, " (pid %d)\n", (int)getpid());
11061109
va_end(ap);
11071110
if( g.zPhase!=0 ) fprintf(out, "while in %s\n", g.zPhase);
1108
- if( bDetail ){
1111
+ if( bBrief ){
1112
+ /* Say nothing more */
1113
+ }else if( bDetail ){
11091114
cgi_print_all(1,3,out);
11101115
}else{
11111116
for(i=0; i<count(azEnv); i++){
11121117
char *p;
11131118
if( (p = fossil_getenv(azEnv[i]))!=0 && p[0]!=0 ){
11141119
--- src/printf.c
+++ src/printf.c
@@ -1077,10 +1077,11 @@
1077 time_t now;
1078 FILE *out;
1079 const char *z;
1080 int i;
1081 int bDetail = 0;
 
1082 va_list ap;
1083 static const char *const azEnv[] = { "HTTP_HOST", "HTTP_REFERER",
1084 "HTTP_USER_AGENT",
1085 "PATH_INFO", "QUERY_STRING", "REMOTE_ADDR", "REQUEST_METHOD",
1086 "REQUEST_URI", "SCRIPT_NAME" };
@@ -1098,16 +1099,20 @@
1098 pNow->tm_hour, pNow->tm_min, pNow->tm_sec);
1099 va_start(ap, zFormat);
1100 if( zFormat[0]=='X' ){
1101 bDetail = 1;
1102 zFormat++;
 
 
1103 }
1104 vfprintf(out, zFormat, ap);
1105 fprintf(out, " (pid %d)\n", (int)getpid());
1106 va_end(ap);
1107 if( g.zPhase!=0 ) fprintf(out, "while in %s\n", g.zPhase);
1108 if( bDetail ){
 
 
1109 cgi_print_all(1,3,out);
1110 }else{
1111 for(i=0; i<count(azEnv); i++){
1112 char *p;
1113 if( (p = fossil_getenv(azEnv[i]))!=0 && p[0]!=0 ){
1114
--- src/printf.c
+++ src/printf.c
@@ -1077,10 +1077,11 @@
1077 time_t now;
1078 FILE *out;
1079 const char *z;
1080 int i;
1081 int bDetail = 0;
1082 int bBrief = 0;
1083 va_list ap;
1084 static const char *const azEnv[] = { "HTTP_HOST", "HTTP_REFERER",
1085 "HTTP_USER_AGENT",
1086 "PATH_INFO", "QUERY_STRING", "REMOTE_ADDR", "REQUEST_METHOD",
1087 "REQUEST_URI", "SCRIPT_NAME" };
@@ -1098,16 +1099,20 @@
1099 pNow->tm_hour, pNow->tm_min, pNow->tm_sec);
1100 va_start(ap, zFormat);
1101 if( zFormat[0]=='X' ){
1102 bDetail = 1;
1103 zFormat++;
1104 }else if( strncmp(zFormat,"SMTP:",5)==0 ){
1105 bBrief = 1;
1106 }
1107 vfprintf(out, zFormat, ap);
1108 fprintf(out, " (pid %d)\n", (int)getpid());
1109 va_end(ap);
1110 if( g.zPhase!=0 ) fprintf(out, "while in %s\n", g.zPhase);
1111 if( bBrief ){
1112 /* Say nothing more */
1113 }else if( bDetail ){
1114 cgi_print_all(1,3,out);
1115 }else{
1116 for(i=0; i<count(azEnv); i++){
1117 char *p;
1118 if( (p = fossil_getenv(azEnv[i]))!=0 && p[0]!=0 ){
1119
+52 -14
--- src/smtp.c
+++ src/smtp.c
@@ -157,10 +157,11 @@
157157
char *zHostname; /* Hostname of SMTP server for zDest */
158158
u32 smtpFlags; /* Flags changing the operation */
159159
FILE *logFile; /* Write session transcript to this log file */
160160
Blob *pTranscript; /* Record session transcript here */
161161
int atEof; /* True after connection closes */
162
+ int bFatal; /* Error is fatal. Do not retry */
162163
char *zErr; /* Error message */
163164
Blob inbuf; /* Input buffer */
164165
};
165166
166167
/* Allowed values for SmtpSession.smtpFlags */
@@ -180,10 +181,30 @@
180181
blob_reset(&pSession->inbuf);
181182
fossil_free(pSession->zHostname);
182183
fossil_free(pSession->zErr);
183184
fossil_free(pSession);
184185
}
186
+
187
+/*
188
+** Set an error message on the SmtpSession
189
+*/
190
+static void smtp_set_error(
191
+ SmtpSession *p, /* The SMTP context */
192
+ int bFatal, /* Fatal error. Reset and retry is pointless */
193
+ const char *zFormat, /* Error message. */
194
+ ...
195
+){
196
+ if( bFatal ) p->bFatal = 1;
197
+ if( p->zErr==0 ){
198
+ va_list ap;
199
+ va_start(ap, zFormat);
200
+ p->zErr = vmprintf(zFormat, ap);
201
+ va_end(ap);
202
+ }
203
+ socket_close();
204
+ p->atEof = 1;
205
+}
185206
186207
/*
187208
** Allocate a new SmtpSession object.
188209
**
189210
** Both zFrom and zDest must be specified. smtpFlags may not contain
@@ -222,20 +243,17 @@
222243
}
223244
}else{
224245
p->zHostname = smtp_mx_host(zDest);
225246
}
226247
if( p->zHostname==0 ){
227
- p->atEof = 1;
228
- p->zErr = mprintf("cannot locate SMTP server for \"%s\"", zDest);
248
+ smtp_set_error(p, 1, "cannot locate SMTP server for \"%s\"", zDest);
229249
return p;
230250
}
231251
url.name = p->zHostname;
232252
socket_global_init();
233253
if( socket_open(&url) ){
234
- p->atEof = 1;
235
- p->zErr = socket_errmsg();
236
- socket_close();
254
+ smtp_set_error(p, 1, "can't open socket: %z", socket_errmsg());
237255
}
238256
return p;
239257
}
240258
241259
/*
@@ -320,13 +338,11 @@
320338
if( got==1000 ) continue;
321339
}
322340
nDelay++;
323341
if( nDelay>100 ){
324342
blob_init(in, 0, 0);
325
- p->zErr = mprintf("timeout");
326
- socket_close();
327
- p->atEof = 1;
343
+ smtp_set_error(p, 1, "client times out waiting on server response");
328344
return;
329345
}else{
330346
sqlite3_sleep(100);
331347
}
332348
}while( n<1 || z[n-1]!='\n' );
@@ -403,23 +419,27 @@
403419
int smtp_client_startup(SmtpSession *p){
404420
Blob in = BLOB_INITIALIZER;
405421
int iCode = 0;
406422
int bMore = 0;
407423
char *zArg = 0;
408
- if( p==0 || p->atEof ) return 1;
424
+ if( p==0 || p->bFatal ) return 1;
425
+ fossil_free(p->zErr);
426
+ p->zErr = 0;
409427
do{
410428
smtp_get_reply_from_server(p, &in, &iCode, &bMore, &zArg);
411429
}while( bMore );
412430
if( iCode!=220 ){
431
+ smtp_set_error(p, 1, "server opens conversation with: %b", &in);
413432
smtp_client_quit(p);
414433
return 1;
415434
}
416435
smtp_send_line(p, "EHLO %s\r\n", p->zFrom);
417436
do{
418437
smtp_get_reply_from_server(p, &in, &iCode, &bMore, &zArg);
419438
}while( bMore );
420439
if( iCode!=250 ){
440
+ smtp_set_error(p, 1, "server responds to EHLO with: %b", &in);
421441
smtp_client_quit(p);
422442
return 1;
423443
}
424444
return 0;
425445
}
@@ -550,27 +570,40 @@
550570
int iCode = 0;
551571
int bMore = 0;
552572
char *zArg = 0;
553573
Blob in;
554574
blob_init(&in, 0, 0);
575
+ if( p->atEof && !p->bFatal ){
576
+ smtp_client_startup(p);
577
+ if( p->atEof ) return 1;
578
+ }
555579
smtp_send_line(p, "MAIL FROM:<%s>\r\n", zFrom);
556580
do{
557581
smtp_get_reply_from_server(p, &in, &iCode, &bMore, &zArg);
558582
}while( bMore );
559
- if( iCode!=250 ) return 1;
583
+ if( iCode!=250 ){
584
+ smtp_set_error(p, 0, "server replies to MAIL FROM with: %b", &in);
585
+ return 1;
586
+ }
560587
for(i=0; i<nTo; i++){
561588
smtp_send_line(p, "RCPT TO:<%s>\r\n", azTo[i]);
562589
do{
563590
smtp_get_reply_from_server(p, &in, &iCode, &bMore, &zArg);
564591
}while( bMore );
565
- if( iCode!=250 ) return 1;
592
+ if( iCode!=250 ){
593
+ smtp_set_error(p, 0, "server replies to RCPT TO with: %b", &in);
594
+ return 1;
595
+ }
566596
}
567597
smtp_send_line(p, "DATA\r\n");
568598
do{
569599
smtp_get_reply_from_server(p, &in, &iCode, &bMore, &zArg);
570600
}while( bMore );
571
- if( iCode!=354 ) return 1;
601
+ if( iCode!=354 ){
602
+ smtp_set_error(p, 0, "server replies to DATA with: %b", &in);
603
+ return 1;
604
+ }
572605
smtp_send_email_body(zMsg, socket_send, 0);
573606
if( p->smtpFlags & SMTP_TRACE_STDOUT ){
574607
fossil_print("C: # message content\nC: .\n");
575608
}
576609
if( p->smtpFlags & SMTP_TRACE_FILE ){
@@ -580,11 +613,14 @@
580613
blob_appendf(p->pTranscript, "C: # message content\nC: .\n");
581614
}
582615
do{
583616
smtp_get_reply_from_server(p, &in, &iCode, &bMore, &zArg);
584617
}while( bMore );
585
- if( iCode!=250 ) return 1;
618
+ if( iCode!=250 ){
619
+ smtp_set_error(p, 0, "server replies to end-of-DATA with: %b", &in);
620
+ return 1;
621
+ }
586622
return 0;
587623
}
588624
589625
/*
590626
** The input is a base email address of the form "local@domain".
@@ -646,13 +682,15 @@
646682
if( p->zErr ){
647683
fossil_fatal("%s", p->zErr);
648684
}
649685
fossil_print("Connection to \"%s\"\n", p->zHostname);
650686
smtp_client_startup(p);
651
- smtp_send_msg(p, zFrom, nTo, azTo, blob_str(&body));
687
+ if( !p->atEof ){
688
+ smtp_send_msg(p, zFrom, nTo, azTo, blob_str(&body));
689
+ }
652690
smtp_client_quit(p);
653691
if( p->zErr ){
654692
fossil_fatal("ERROR: %s\n", p->zErr);
655693
}
656694
smtp_session_free(p);
657695
blob_reset(&body);
658696
}
659697
--- src/smtp.c
+++ src/smtp.c
@@ -157,10 +157,11 @@
157 char *zHostname; /* Hostname of SMTP server for zDest */
158 u32 smtpFlags; /* Flags changing the operation */
159 FILE *logFile; /* Write session transcript to this log file */
160 Blob *pTranscript; /* Record session transcript here */
161 int atEof; /* True after connection closes */
 
162 char *zErr; /* Error message */
163 Blob inbuf; /* Input buffer */
164 };
165
166 /* Allowed values for SmtpSession.smtpFlags */
@@ -180,10 +181,30 @@
180 blob_reset(&pSession->inbuf);
181 fossil_free(pSession->zHostname);
182 fossil_free(pSession->zErr);
183 fossil_free(pSession);
184 }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
185
186 /*
187 ** Allocate a new SmtpSession object.
188 **
189 ** Both zFrom and zDest must be specified. smtpFlags may not contain
@@ -222,20 +243,17 @@
222 }
223 }else{
224 p->zHostname = smtp_mx_host(zDest);
225 }
226 if( p->zHostname==0 ){
227 p->atEof = 1;
228 p->zErr = mprintf("cannot locate SMTP server for \"%s\"", zDest);
229 return p;
230 }
231 url.name = p->zHostname;
232 socket_global_init();
233 if( socket_open(&url) ){
234 p->atEof = 1;
235 p->zErr = socket_errmsg();
236 socket_close();
237 }
238 return p;
239 }
240
241 /*
@@ -320,13 +338,11 @@
320 if( got==1000 ) continue;
321 }
322 nDelay++;
323 if( nDelay>100 ){
324 blob_init(in, 0, 0);
325 p->zErr = mprintf("timeout");
326 socket_close();
327 p->atEof = 1;
328 return;
329 }else{
330 sqlite3_sleep(100);
331 }
332 }while( n<1 || z[n-1]!='\n' );
@@ -403,23 +419,27 @@
403 int smtp_client_startup(SmtpSession *p){
404 Blob in = BLOB_INITIALIZER;
405 int iCode = 0;
406 int bMore = 0;
407 char *zArg = 0;
408 if( p==0 || p->atEof ) return 1;
 
 
409 do{
410 smtp_get_reply_from_server(p, &in, &iCode, &bMore, &zArg);
411 }while( bMore );
412 if( iCode!=220 ){
 
413 smtp_client_quit(p);
414 return 1;
415 }
416 smtp_send_line(p, "EHLO %s\r\n", p->zFrom);
417 do{
418 smtp_get_reply_from_server(p, &in, &iCode, &bMore, &zArg);
419 }while( bMore );
420 if( iCode!=250 ){
 
421 smtp_client_quit(p);
422 return 1;
423 }
424 return 0;
425 }
@@ -550,27 +570,40 @@
550 int iCode = 0;
551 int bMore = 0;
552 char *zArg = 0;
553 Blob in;
554 blob_init(&in, 0, 0);
 
 
 
 
555 smtp_send_line(p, "MAIL FROM:<%s>\r\n", zFrom);
556 do{
557 smtp_get_reply_from_server(p, &in, &iCode, &bMore, &zArg);
558 }while( bMore );
559 if( iCode!=250 ) return 1;
 
 
 
560 for(i=0; i<nTo; i++){
561 smtp_send_line(p, "RCPT TO:<%s>\r\n", azTo[i]);
562 do{
563 smtp_get_reply_from_server(p, &in, &iCode, &bMore, &zArg);
564 }while( bMore );
565 if( iCode!=250 ) return 1;
 
 
 
566 }
567 smtp_send_line(p, "DATA\r\n");
568 do{
569 smtp_get_reply_from_server(p, &in, &iCode, &bMore, &zArg);
570 }while( bMore );
571 if( iCode!=354 ) return 1;
 
 
 
572 smtp_send_email_body(zMsg, socket_send, 0);
573 if( p->smtpFlags & SMTP_TRACE_STDOUT ){
574 fossil_print("C: # message content\nC: .\n");
575 }
576 if( p->smtpFlags & SMTP_TRACE_FILE ){
@@ -580,11 +613,14 @@
580 blob_appendf(p->pTranscript, "C: # message content\nC: .\n");
581 }
582 do{
583 smtp_get_reply_from_server(p, &in, &iCode, &bMore, &zArg);
584 }while( bMore );
585 if( iCode!=250 ) return 1;
 
 
 
586 return 0;
587 }
588
589 /*
590 ** The input is a base email address of the form "local@domain".
@@ -646,13 +682,15 @@
646 if( p->zErr ){
647 fossil_fatal("%s", p->zErr);
648 }
649 fossil_print("Connection to \"%s\"\n", p->zHostname);
650 smtp_client_startup(p);
651 smtp_send_msg(p, zFrom, nTo, azTo, blob_str(&body));
 
 
652 smtp_client_quit(p);
653 if( p->zErr ){
654 fossil_fatal("ERROR: %s\n", p->zErr);
655 }
656 smtp_session_free(p);
657 blob_reset(&body);
658 }
659
--- src/smtp.c
+++ src/smtp.c
@@ -157,10 +157,11 @@
157 char *zHostname; /* Hostname of SMTP server for zDest */
158 u32 smtpFlags; /* Flags changing the operation */
159 FILE *logFile; /* Write session transcript to this log file */
160 Blob *pTranscript; /* Record session transcript here */
161 int atEof; /* True after connection closes */
162 int bFatal; /* Error is fatal. Do not retry */
163 char *zErr; /* Error message */
164 Blob inbuf; /* Input buffer */
165 };
166
167 /* Allowed values for SmtpSession.smtpFlags */
@@ -180,10 +181,30 @@
181 blob_reset(&pSession->inbuf);
182 fossil_free(pSession->zHostname);
183 fossil_free(pSession->zErr);
184 fossil_free(pSession);
185 }
186
187 /*
188 ** Set an error message on the SmtpSession
189 */
190 static void smtp_set_error(
191 SmtpSession *p, /* The SMTP context */
192 int bFatal, /* Fatal error. Reset and retry is pointless */
193 const char *zFormat, /* Error message. */
194 ...
195 ){
196 if( bFatal ) p->bFatal = 1;
197 if( p->zErr==0 ){
198 va_list ap;
199 va_start(ap, zFormat);
200 p->zErr = vmprintf(zFormat, ap);
201 va_end(ap);
202 }
203 socket_close();
204 p->atEof = 1;
205 }
206
207 /*
208 ** Allocate a new SmtpSession object.
209 **
210 ** Both zFrom and zDest must be specified. smtpFlags may not contain
@@ -222,20 +243,17 @@
243 }
244 }else{
245 p->zHostname = smtp_mx_host(zDest);
246 }
247 if( p->zHostname==0 ){
248 smtp_set_error(p, 1, "cannot locate SMTP server for \"%s\"", zDest);
 
249 return p;
250 }
251 url.name = p->zHostname;
252 socket_global_init();
253 if( socket_open(&url) ){
254 smtp_set_error(p, 1, "can't open socket: %z", socket_errmsg());
 
 
255 }
256 return p;
257 }
258
259 /*
@@ -320,13 +338,11 @@
338 if( got==1000 ) continue;
339 }
340 nDelay++;
341 if( nDelay>100 ){
342 blob_init(in, 0, 0);
343 smtp_set_error(p, 1, "client times out waiting on server response");
 
 
344 return;
345 }else{
346 sqlite3_sleep(100);
347 }
348 }while( n<1 || z[n-1]!='\n' );
@@ -403,23 +419,27 @@
419 int smtp_client_startup(SmtpSession *p){
420 Blob in = BLOB_INITIALIZER;
421 int iCode = 0;
422 int bMore = 0;
423 char *zArg = 0;
424 if( p==0 || p->bFatal ) return 1;
425 fossil_free(p->zErr);
426 p->zErr = 0;
427 do{
428 smtp_get_reply_from_server(p, &in, &iCode, &bMore, &zArg);
429 }while( bMore );
430 if( iCode!=220 ){
431 smtp_set_error(p, 1, "server opens conversation with: %b", &in);
432 smtp_client_quit(p);
433 return 1;
434 }
435 smtp_send_line(p, "EHLO %s\r\n", p->zFrom);
436 do{
437 smtp_get_reply_from_server(p, &in, &iCode, &bMore, &zArg);
438 }while( bMore );
439 if( iCode!=250 ){
440 smtp_set_error(p, 1, "server responds to EHLO with: %b", &in);
441 smtp_client_quit(p);
442 return 1;
443 }
444 return 0;
445 }
@@ -550,27 +570,40 @@
570 int iCode = 0;
571 int bMore = 0;
572 char *zArg = 0;
573 Blob in;
574 blob_init(&in, 0, 0);
575 if( p->atEof && !p->bFatal ){
576 smtp_client_startup(p);
577 if( p->atEof ) return 1;
578 }
579 smtp_send_line(p, "MAIL FROM:<%s>\r\n", zFrom);
580 do{
581 smtp_get_reply_from_server(p, &in, &iCode, &bMore, &zArg);
582 }while( bMore );
583 if( iCode!=250 ){
584 smtp_set_error(p, 0, "server replies to MAIL FROM with: %b", &in);
585 return 1;
586 }
587 for(i=0; i<nTo; i++){
588 smtp_send_line(p, "RCPT TO:<%s>\r\n", azTo[i]);
589 do{
590 smtp_get_reply_from_server(p, &in, &iCode, &bMore, &zArg);
591 }while( bMore );
592 if( iCode!=250 ){
593 smtp_set_error(p, 0, "server replies to RCPT TO with: %b", &in);
594 return 1;
595 }
596 }
597 smtp_send_line(p, "DATA\r\n");
598 do{
599 smtp_get_reply_from_server(p, &in, &iCode, &bMore, &zArg);
600 }while( bMore );
601 if( iCode!=354 ){
602 smtp_set_error(p, 0, "server replies to DATA with: %b", &in);
603 return 1;
604 }
605 smtp_send_email_body(zMsg, socket_send, 0);
606 if( p->smtpFlags & SMTP_TRACE_STDOUT ){
607 fossil_print("C: # message content\nC: .\n");
608 }
609 if( p->smtpFlags & SMTP_TRACE_FILE ){
@@ -580,11 +613,14 @@
613 blob_appendf(p->pTranscript, "C: # message content\nC: .\n");
614 }
615 do{
616 smtp_get_reply_from_server(p, &in, &iCode, &bMore, &zArg);
617 }while( bMore );
618 if( iCode!=250 ){
619 smtp_set_error(p, 0, "server replies to end-of-DATA with: %b", &in);
620 return 1;
621 }
622 return 0;
623 }
624
625 /*
626 ** The input is a base email address of the form "local@domain".
@@ -646,13 +682,15 @@
682 if( p->zErr ){
683 fossil_fatal("%s", p->zErr);
684 }
685 fossil_print("Connection to \"%s\"\n", p->zHostname);
686 smtp_client_startup(p);
687 if( !p->atEof ){
688 smtp_send_msg(p, zFrom, nTo, azTo, blob_str(&body));
689 }
690 smtp_client_quit(p);
691 if( p->zErr ){
692 fossil_fatal("ERROR: %s\n", p->zErr);
693 }
694 smtp_session_free(p);
695 blob_reset(&body);
696 }
697

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button