Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Add the "fossil email subscribers" and "fossil email unsubscribe" commands. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | email-alerts |
Files: | files | file ages | folders |
SHA3-256: |
ba60f8744c69d6122d56186fcb7fa9df |
User & Date: | drh 2018-06-22 19:03:55.718 |
Context
2018-06-22
| ||
19:48 | Improvements to on-line subscription management. ... (check-in: e649820b user: drh tags: email-alerts) | |
19:03 | Add the "fossil email subscribers" and "fossil email unsubscribe" commands. ... (check-in: ba60f874 user: drh tags: email-alerts) | |
18:23 | Alert sending logic compiles but is so far untested. ... (check-in: 44f9f355 user: drh tags: email-alerts) | |
Changes
Changes to src/email.c.
︙ | ︙ | |||
451 452 453 454 455 456 457 458 459 460 461 462 463 464 | /* ** COMMAND: email ** ** Usage: %fossil email SUBCOMMAND ARGS... ** ** Subcommands: ** ** inbound [FILE] Receive an inbound email message. This message ** is analyzed to see if it is a bounce, and if ** necessary, subscribers may be disabled. ** ** reset Hard reset of all email notification tables ** in the repository. This erases all subscription | > > > > > > > > | 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 | /* ** COMMAND: email ** ** Usage: %fossil email SUBCOMMAND ARGS... ** ** Subcommands: ** ** exec Compose and send pending email alerts. ** Some installations may want to do this via ** a cron-job to make sure alerts are sent ** in a timely manner. ** Options: ** ** --digest Send digests ** ** inbound [FILE] Receive an inbound email message. This message ** is analyzed to see if it is a bounce, and if ** necessary, subscribers may be disabled. ** ** reset Hard reset of all email notification tables ** in the repository. This erases all subscription |
︙ | ︙ | |||
472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 | ** --body FILENAME ** --html ** --stdout ** --subject|-S SUBJECT ** ** settings [NAME VALUE] With no arguments, list all email settings. ** Or change the value of a single email setting. */ void email_cmd(void){ const char *zCmd; int nCmd; db_find_and_open_repository(0, 0); email_schema(); zCmd = g.argc>=3 ? g.argv[2] : "x"; nCmd = (int)strlen(zCmd); if( strncmp(zCmd, "inbound", nCmd)==0 ){ Blob email; const char *zInboundDir = db_get("email-receive-dir",""); verify_all_options(); if( g.argc!=3 && g.argc!=4 ){ usage("inbound [FILE]"); } | > > > > > > > > > > | 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 | ** --body FILENAME ** --html ** --stdout ** --subject|-S SUBJECT ** ** settings [NAME VALUE] With no arguments, list all email settings. ** Or change the value of a single email setting. ** ** subscribers [PATTERN] List all subscribers matching PATTERN. ** ** unsubscribe EMAIL Remove a single subscriber with the given EMAIL. */ void email_cmd(void){ const char *zCmd; int nCmd; db_find_and_open_repository(0, 0); email_schema(); zCmd = g.argc>=3 ? g.argv[2] : "x"; nCmd = (int)strlen(zCmd); if( strncmp(zCmd, "exec", nCmd)==0 ){ u32 eFlags = 0; if( find_option("digest",0,0)!=0 ) eFlags |= SENDALERT_DIGEST; verify_all_options(); email_send_alerts(eFlags); }else if( strncmp(zCmd, "inbound", nCmd)==0 ){ Blob email; const char *zInboundDir = db_get("email-receive-dir",""); verify_all_options(); if( g.argc!=3 && g.argc!=4 ){ usage("inbound [FILE]"); } |
︙ | ︙ | |||
562 563 564 565 566 567 568 | blob_zero(&html); }else{ email_send(&hdr, &body, 0, zDest); } blob_zero(&hdr); blob_zero(&body); blob_zero(&prompt); | | | > > > > > > > > > > > > > > > > > | > > > > | > > > > > > > | | 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 | blob_zero(&html); }else{ email_send(&hdr, &body, 0, zDest); } blob_zero(&hdr); blob_zero(&body); blob_zero(&prompt); }else if( strncmp(zCmd, "settings", nCmd)==0 ){ int isGlobal = find_option("global",0,0)!=0; int nSetting; const Setting *pSetting = setting_info(&nSetting); db_open_config(1, 0); verify_all_options(); if( g.argc!=3 && g.argc!=5 ) usage("setting [NAME VALUE]"); if( g.argc==5 ){ const char *zLabel = g.argv[3]; if( strncmp(zLabel, "email-", 6)!=0 || (pSetting = db_find_setting(zLabel, 1))==0 ){ fossil_fatal("not a valid email setting: \"%s\"", zLabel); } db_set(pSetting->name, g.argv[4], isGlobal); g.argc = 3; } pSetting = setting_info(&nSetting); for(; nSetting>0; nSetting--, pSetting++ ){ if( strncmp(pSetting->name,"email-",6)!=0 ) continue; print_setting(pSetting); } }else if( strncmp(zCmd, "subscribers", nCmd)==0 ){ Stmt q; verify_all_options(); if( g.argc!=3 && g.argc!=4 ) usage("subscribers [PATTERN]"); if( g.argc==4 ){ char *zPattern = g.argv[3]; db_prepare(&q, "SELECT semail FROM subscriber" " WHERE semail LIKE '%%%q%%' OR suname LIKE '%%%q%%'" " OR semail GLOB '*%q*' or suname GLOB '*%q*'" " ORDER BY semail", zPattern, zPattern, zPattern, zPattern); }else{ db_prepare(&q, "SELECT semail FROM subscriber" " ORDER BY semail"); } while( db_step(&q)==SQLITE_ROW ){ fossil_print("%s\n", db_column_text(&q, 0)); } db_finalize(&q); }else if( strncmp(zCmd, "unsubscribe", nCmd)==0 ){ verify_all_options(); if( g.argc!=4 ) usage("unsubscribe EMAIL"); db_multi_exec( "DELETE FROM subscriber WHERE semail=%Q", g.argv[3]); }else { usage("exec|inbound|reset|send|setting|subscribers|unsubscribe"); } } /* ** Do error checking on a submitted subscription form. Return TRUE ** if the submission is valid. Return false if any problems are seen. */ |
︙ | ︙ | |||
1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 | } email_free_eventlist(pEvent); email_footer(&out); fossil_print("%s", blob_str(&out)); blob_zero(&out); db_end_transaction(0); } #if INTERFACE /* ** Flags for email_send_alerts() */ #define SENDALERT_DIGEST 0x0001 /* Send a digest */ #define SENDALERT_PRESERVE 0x0002 /* Do not mark the task as done */ | > > > > > > > > > > > > > > > > > > > > > | 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 | } email_free_eventlist(pEvent); email_footer(&out); fossil_print("%s", blob_str(&out)); blob_zero(&out); db_end_transaction(0); } /* ** COMMAND: test-add-alerts ** ** Usage: %fossil test-add-alerts EVENTID ... ** ** Add one or more events to the pending_alert queue. Use this ** command during testing to force email notifications for specific ** events. */ void test_add_alert_cmd(void){ int i; db_find_and_open_repository(0, 0); verify_all_options(); db_begin_transaction(); email_schema(); for(i=2; i<g.argc; i++){ db_multi_exec("INSERT INTO pending_alert(eventId) VALUES(%Q)", g.argv[i]); } db_end_transaction(0); } #if INTERFACE /* ** Flags for email_send_alerts() */ #define SENDALERT_DIGEST 0x0001 /* Send a digest */ #define SENDALERT_PRESERVE 0x0002 /* Do not mark the task as done */ |
︙ | ︙ | |||
1414 1415 1416 1417 1418 1419 1420 | Stmt q; const char *zDigest = "false"; Blob hdr, body; const char *zUrl; const char *zRepoName; const char *zFrom; | > | | | | | 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 | Stmt q; const char *zDigest = "false"; Blob hdr, body; const char *zUrl; const char *zRepoName; const char *zFrom; db_begin_transaction(); if( !email_enabled() ) goto send_alerts_done; zUrl = db_get("email-url",0); if( zUrl==0 ) goto send_alerts_done; zRepoName = db_get("email-subname",0); if( zRepoName==0 ) goto send_alerts_done; zFrom = db_get("email-self",0); if( zFrom==0 ) goto send_alerts_done; db_multi_exec( "DROP TABLE IF EXISTS temp.wantalert;" "CREATE TEMP TABLE wantalert(eventId TEXT);" ); if( flags & SENDALERT_DIGEST ){ db_multi_exec( "INSERT INTO wantalert SELECT eventid FROM pending_alert" |
︙ | ︙ | |||
1491 1492 1493 1494 1495 1496 1497 1498 | if( flags & SENDALERT_DIGEST ){ db_multi_exec("UPDATE pending_alert SET sentDigest=true"); }else{ db_multi_exec("UPDATE pending_alert SET sentSep=true"); } db_multi_exec("DELETE FROM pending_alert WHERE sentDigest AND sentSep"); } } | > > | 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 | if( flags & SENDALERT_DIGEST ){ db_multi_exec("UPDATE pending_alert SET sentDigest=true"); }else{ db_multi_exec("UPDATE pending_alert SET sentSep=true"); } db_multi_exec("DELETE FROM pending_alert WHERE sentDigest AND sentSep"); } send_alerts_done: db_end_transaction(0); } |