[geary/mjog/mail-merge-plugin: 9/9] MailMerge.Folder: Implement sending merged email




commit 050ab580318b95d0f18e325795ca4f191087039c
Author: Michael Gratton <mike vee net>
Date:   Sat Aug 15 10:57:24 2020 +1000

    MailMerge.Folder: Implement sending merged email

 .../plugin/mail-merge/mail-merge-folder.vala       | 63 +++++++++++++++++++++-
 1 file changed, 62 insertions(+), 1 deletion(-)
---
diff --git a/src/client/plugin/mail-merge/mail-merge-folder.vala 
b/src/client/plugin/mail-merge/mail-merge-folder.vala
index cac11090a..404e55a07 100644
--- a/src/client/plugin/mail-merge/mail-merge-folder.vala
+++ b/src/client/plugin/mail-merge/mail-merge-folder.vala
@@ -132,11 +132,18 @@ public class MailMerge.Folder : Geary.AbstractLocalFolder {
 
     private Gee.List<Geary.EmailIdentifier> ids =
         new Gee.ArrayList<Geary.EmailIdentifier>();
+    private Gee.Map<Geary.EmailIdentifier,Geary.ComposedEmail> composed =
+        new Gee.HashMap<Geary.EmailIdentifier,Geary.ComposedEmail>();
     private Gee.Map<Geary.EmailIdentifier,Geary.Email> email =
         new Gee.HashMap<Geary.EmailIdentifier,Geary.Email>();
     private Geary.Email template;
     private Csv.Reader data;
     private GLib.Cancellable loading = new GLib.Cancellable();
+    private GLib.Cancellable sending = new GLib.Cancellable();
+
+
+    /** Emitted when an error sending an email is reported. */
+    public signal void send_error(GLib.Error error);
 
 
     public async Folder(Geary.Account account,
@@ -167,7 +174,24 @@ public class MailMerge.Folder : Geary.AbstractLocalFolder {
 
     /** Starts or stops the folder sending mail. */
     public void set_sending(bool is_sending) {
-        this.is_sending = is_sending;
+        if (is_sending && !this.is_sending) {
+            this.send_loop.begin();
+            this.is_sending = true;
+        } else if (!is_sending && this.is_sending) {
+            this.sending.cancel();
+            this.sending = new GLib.Cancellable();
+        }
+    }
+
+    /** {@inheritDoc} */
+    public override async bool close_async(GLib.Cancellable? cancellable = null)
+        throws GLib.Error {
+        var is_closing = yield base.close_async(cancellable);
+        if (is_closing) {
+            this.loading.cancel();
+            set_sending(false);
+        }
+        return is_closing;
     }
 
     /** {@inheritDoc} */
@@ -307,10 +331,15 @@ public class MailMerge.Folder : Geary.AbstractLocalFolder {
 
                 var id = new EmailIdentifier(next_id++);
                 var email = new Geary.Email.from_message(id, message);
+                // Don't set a date since it would be re-set on send,
+                // and we don't want to give people the wrong idea of
+                // what it will be
+                email.set_send_date(null);
                 email.set_flags(new Geary.EmailFlags());
 
                 // Update folder state then notify about the new email
                 this.ids.add(id);
+                this.composed.set(id, composed);
                 this.email.set(id, email);
                 this._properties.set_total((int) next_id);
                 this.email_total = (uint) next_id;
@@ -336,4 +365,36 @@ public class MailMerge.Folder : Geary.AbstractLocalFolder {
         return template;
     }
 
+    private async void send_loop() {
+        var cancellable = this.sending;
+        var smtp = this._account.outgoing as Geary.Smtp.ClientService;
+        if (smtp != null) {
+            while (!this.ids.is_empty && !this.sending.is_cancelled()) {
+                var last = this.ids.size - 1;
+                var id = this.ids[last];
+
+                try {
+                    var composed = this.composed.get(id);
+                    composed.set_date(new GLib.DateTime.now());
+                    yield smtp.send_email(composed, cancellable);
+
+                    this.email_sent++;
+
+                    this.ids.remove_at(last);
+                    this.email.unset(id);
+                    this.composed.unset(id);
+                    this._properties.set_total(last);
+                    notify_email_removed(Geary.Collection.single(id));
+                } catch (GLib.Error err) {
+                    warning("Error sending merge email: %s", err.message);
+                    send_error(err);
+                    break;
+                }
+            }
+        } else {
+            warning("Account has no outgoing SMTP service");
+        }
+        this.is_sending = false;
+    }
+
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]