Sfoglia il codice sorgente

update gitignore + add full multi to/cc/bcc sending functionality via jakarta api, but more work needs to be done like making verbose toasts

Noah Vogt 3 anni fa
parent
commit
793b44d7d5

+ 4 - 0
.gitignore

@@ -17,3 +17,7 @@ local.properties
 local.properties
 app/release/
 *__pycache__*
+.project
+.settings/
+app/.classpath
+app/schemas/

+ 75 - 0
app/src/main/java/com/noahvogt/snailmail/mail/SendMail.java

@@ -0,0 +1,75 @@
+package com.noahvogt.snailmail.mail;
+
+import android.content.Context;
+
+import java.util.Properties;
+
+import jakarta.mail.Authenticator;
+import jakarta.mail.Message;
+import jakarta.mail.MessagingException;
+import jakarta.mail.PasswordAuthentication;
+import jakarta.mail.Session;
+import jakarta.mail.Transport;
+import jakarta.mail.internet.InternetAddress;
+import jakarta.mail.internet.MimeMessage;
+
+public class SendMail {
+    static Message message;
+    static Session session;
+    static Properties properties;
+
+    public static void sendMessage(String fromAddress, String toAddresses, String smtpHostname, int smtpPort, String username, String password,
+                                   String subject, String messageBody, Context context, String cc, String bcc) {
+        setupProperties(smtpHostname, smtpPort);
+        getSessionInstance(username, password);
+        composeMessage(fromAddress, subject, messageBody, toAddresses, cc, bcc);
+        transportMessage();
+    }
+
+    public static void composeMessage(String fromAddress, String subject, String messageBody, String to, String cc, String bcc) {
+        message = new MimeMessage(session);
+        try {
+            message.setFrom(new InternetAddress(fromAddress));
+
+            addRecipientsOfCertainTypeSuccess(Message.RecipientType.TO, to);
+            addRecipientsOfCertainTypeSuccess(Message.RecipientType.CC, cc);
+            addRecipientsOfCertainTypeSuccess(Message.RecipientType.BCC, bcc);
+
+            message.setSubject(subject);
+            message.setText(messageBody);
+        } catch (MessagingException e) {
+            System.out.println("Error while parsing message");
+        }
+    }
+
+    public static void addRecipientsOfCertainTypeSuccess(Message.RecipientType recipientType, String recipients) throws MessagingException {
+        String[] recipientsArray = recipients.split(",");
+        for (String recipient: recipientsArray)
+            message.addRecipient(recipientType, new InternetAddress(recipient));
+    }
+
+    public static void setupProperties(String smtpHostname, int smtpPort) {
+        properties = new Properties();
+        properties.put("mail.smtp.auth", "true");
+        properties.put("mail.smtp.starttls.enable", "true");
+        properties.put("mail.smtp.host", smtpHostname);
+        properties.put("mail.smtp.port", smtpPort);
+    }
+
+    public static void getSessionInstance(String username, String password) {
+        session = Session.getInstance(properties, new Authenticator() {
+            protected PasswordAuthentication getPasswordAuthentication() {
+                return new PasswordAuthentication(username, password);
+            }
+        });
+    }
+
+    public static void transportMessage() {
+        try {
+            Transport.send(message);
+            System.out.println("Message sent successfully");
+        } catch (MessagingException e) {
+            System.out.println("Error while sending message");
+        }
+    }
+}

+ 18 - 6
app/src/main/java/com/noahvogt/snailmail/ui/editor/EditorButtonHandler.java

@@ -10,6 +10,7 @@ import static com.noahvogt.snailmail.ui.editor.EditorFragment.replyIntent;
 
 import android.app.Activity;
 import android.app.Dialog;
+import android.content.Context;
 import android.content.Intent;
 import android.content.SharedPreferences;
 import android.widget.EditText;
@@ -22,6 +23,7 @@ import com.google.gson.reflect.TypeToken;
 import com.noahvogt.snailmail.MainActivity;
 import com.noahvogt.snailmail.data.MailServerCredentials;
 import com.noahvogt.snailmail.data.MailFunctions;
+import com.noahvogt.snailmail.mail.SendMail;
 
 import java.lang.reflect.Type;
 import java.util.ArrayList;
@@ -38,7 +40,7 @@ public class EditorButtonHandler {
 
     public void handleSendButton(Activity activity, SharedPreferences credentialPreferences, Dialog dialog, String currentMailUser,
                                  EditText sendingAddressObject, EditText receivingAddressObject, EditText subjectObject, EditText messageBodyObject,
-                                 EditText ccObject, EditText bccObject) {
+                                 EditText ccObject, EditText bccObject, Context context) {
         getCredentialsJsonData(credentialPreferences);
 
         if (jsonData.isEmpty()) {
@@ -50,7 +52,8 @@ public class EditorButtonHandler {
             if (isValidMessage(messageBodyObject, subjectObject, receivingAddressObject, sendingAddressObject)) {
                 try {
                     Toast.makeText(activity, "Sending ... ", Toast.LENGTH_SHORT).show();
-                    sendMessage(dialog);
+                    sendMessageViaNewThread(context);
+                    dialog.dismiss();
                 } catch (com.chaquo.python.PyException pyException) {
                     Toast.makeText(activity, "Could not send message", Toast.LENGTH_SHORT).show();
                 }
@@ -118,7 +121,7 @@ public class EditorButtonHandler {
                 MailFunctions.validateEmail(receivingAddressObject) && MailFunctions.validateEmail(sendingAddressObject);
     }
 
-    public void sendMessage(Dialog dialog) {
+    public void sendMessage(Dialog dialog, Context context) {
         MailFunctions.sendStarttlsMail(smtpHost, sendingAddress, receivingAddress, password, messageBody,
                 subject, ccStr, bccStr, smtpPort);
         dialog.dismiss();
@@ -156,16 +159,25 @@ public class EditorButtonHandler {
                     Intent intent = new Intent(activity, NewDraftMessageActivity.class);
                     activity.startActivityForResult(intent, MainActivity.NEW_WORD_ACTIVITY_REQUEST_CODE);
 
-                    /* close the whole fragment */
                     dialog.dismiss();
                 })
                 .setNegativeButton("No", (closeDialog, id) -> {
-                    /* if this button is clicked, close the hole fragment */
                     dialog.dismiss();
                 });
 
-        /* create + show alert dialog */
         AlertDialog alertDialog = alertDialogBuilder.create();
         alertDialog.show();
     }
+
+    public void sendMessageViaNewThread(Context context) {
+        Thread thread = new Thread(() -> {
+            try {
+                SendMail.sendMessage(sendingAddress, receivingAddress, smtpHost, smtpPort, sendingAddress, password, subject, messageBody, context, ccStr, bccStr);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        });
+
+        thread.start();
+    }
 }

+ 1 - 1
app/src/main/java/com/noahvogt/snailmail/ui/editor/EditorFragment.java

@@ -95,7 +95,7 @@ public class EditorFragment extends DialogFragment implements PopupMenu.OnMenuIt
         sendButton.setOnClickListener(v -> {
             EditorButtonHandler editorButtonHandler = new EditorButtonHandler();
             editorButtonHandler.handleSendButton(getActivity(), mailServerCredentials, getDialog(), currentMailUser, sendingAddressObject,
-                    receivingAddressObject, subjectObject, messageBodyObject, ccObject, bccObject);
+                    receivingAddressObject, subjectObject, messageBodyObject, ccObject, bccObject, getContext());
         });
 
         return view;