diff --git a/app/src/apkFlavor/AndroidManifest.xml b/app/src/apkFlavor/AndroidManifest.xml
index 3fe42be..d0aa074 100644
--- a/app/src/apkFlavor/AndroidManifest.xml
+++ b/app/src/apkFlavor/AndroidManifest.xml
@@ -240,6 +240,7 @@
+
+
+
= Build.VERSION_CODES.JELLY_BEAN_MR1)
Actions.setSystemSetting(this.getParameter2(), AutomationService.getInstance());
break;
+ case sendEmail:
+ Actions.sendEmailFromAction(this);
+ break;
default:
Miscellaneous.logEvent("w", "Action", context.getResources().getString(R.string.unknownActionSpecified), 3);
break;
diff --git a/app/src/main/java/com/jens/automation2/Actions.java b/app/src/main/java/com/jens/automation2/Actions.java
index 1736a58..5d974c9 100644
--- a/app/src/main/java/com/jens/automation2/Actions.java
+++ b/app/src/main/java/com/jens/automation2/Actions.java
@@ -65,6 +65,7 @@ import java.lang.reflect.Method;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.security.KeyStore;
+import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Enumeration;
@@ -75,6 +76,7 @@ import java.util.Random;
import java.util.Set;
import java.util.concurrent.TimeUnit;
+import javax.mail.internet.InternetAddress;
import javax.net.ssl.SSLContext;
import eu.chainfire.libsuperuser.Shell;
@@ -2675,32 +2677,24 @@ public class Actions
android.provider.Settings.Secure.putString(context.getContentResolver(), android.provider.Settings.Secure.LOCATION_MODE, String.valueOf(desiredState));
}
- /*public static sendEmail()
+ public static boolean sendEmailFromAction(Action action)
{
- Properties props = new Properties();
- props.put("mail.smtp.host", smtpHost);
- props.put("mail.smtp.port", "587");
- props.put("mail.smtp.auth", "true");
- props.put("mail.smtp.starttls.enable", "true");
- props.put("mail.smtp.connectiontimeout", "10000");
- props.put("mail.smtp.timeout", "10000");
+ try
+ {
+ String[] components = action.getParameter2().split(Action.actionParameter2Split, -1);
+ EmailService es = new EmailService(Settings.smtpServerHostname, Integer.parseInt(Settings.smtpServerPort), Settings.smtpServerUseTls);
+ List toAddressList = new ArrayList<>();
+ toAddressList.add(new InternetAddress(components[0]));
- Session session = Session.getInstance(props, new Authenticator() {
- @Override
- protected PasswordAuthentication getPasswordAuthentication() {
- return new PasswordAuthentication(username, password);
- }
- });
-
- Message message = new MimeMessage(session);
- message.setFrom(new InternetAddress(fromAddress));
- message.setRecipients(
- Message.RecipientType.TO,
- InternetAddress.parse(recipientAddress)
- );
- message.setSubject(subject);
- message.setText(body);
-
- Transport.send(message);
- }*/
+ EmailService.Email em = new EmailService.Email(new EmailService.UserPassAuthenticator(Settings.smtpUsername, Settings.smtpPassword), new InternetAddress(Settings.smtpFromAddress), toAddressList, components[1], components[2]);
+ es.send(em);
+ Miscellaneous.logEvent("i", "sendEmail()", "Email sent.", 1);
+ return true;
+ }
+ catch (Exception e)
+ {
+ Miscellaneous.logEvent("e", "sendEmail()", "Email could not be sent: " + Log.getStackTraceString(e), 1);
+ return false;
+ }
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/jens/automation2/ActivityManageActionSendEmail.java b/app/src/main/java/com/jens/automation2/ActivityManageActionSendEmail.java
new file mode 100644
index 0000000..3ab373b
--- /dev/null
+++ b/app/src/main/java/com/jens/automation2/ActivityManageActionSendEmail.java
@@ -0,0 +1,89 @@
+package com.jens.automation2;
+
+import android.Manifest;
+import android.app.Activity;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Build;
+import android.os.Bundle;
+import android.provider.ContactsContract;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.Button;
+import android.widget.CompoundButton;
+import android.widget.EditText;
+import android.widget.RadioButton;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import androidx.annotation.NonNull;
+
+import com.google.android.material.textfield.TextInputEditText;
+import com.jens.automation2.Action.Action_Enum;
+
+import org.apache.commons.lang3.StringUtils;
+
+
+public class ActivityManageActionSendEmail extends Activity
+{
+ Button bSaveSendEmail;
+ TextView tvEmailServerConfigurationNotice;
+ EditText etEmailRecipient, etEmailSubject, etEmailText;
+
+ public static boolean edit = false;
+ public static Action resultingAction = null;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState)
+ {
+ super.onCreate(savedInstanceState);
+ Miscellaneous.setDisplayLanguage(this);
+ Miscellaneous.setUiTheme(this);
+ this.setContentView(R.layout.activity_manage_action_send_email);
+
+ tvEmailServerConfigurationNotice = (TextView)findViewById(R.id.tvEmailServerConfigurationNotice);
+ etEmailRecipient = (EditText)findViewById(R.id.etEmailRecipient);
+ etEmailSubject = (EditText)findViewById(R.id.etEmailSubject);
+ etEmailText = (EditText)findViewById(R.id.etEmailText);
+ bSaveSendEmail = (Button)findViewById(R.id.bSaveSendEmail);
+
+ if(getIntent().hasExtra(ActivityManageRule.intentNameActionParameter2))
+ {
+ String[] components = getIntent().getStringExtra(ActivityManageRule.intentNameActionParameter2).split(Action.actionParameter2Split, -1);
+ etEmailRecipient.setText(components[0]);
+ etEmailSubject.setText(components[1]);
+ etEmailText.setText(components[2]);
+ }
+
+ if(Settings.smtpServerHostname.isEmpty())
+ tvEmailServerConfigurationNotice.setVisibility(View.VISIBLE);
+ else
+ tvEmailServerConfigurationNotice.setVisibility(View.GONE);
+
+ bSaveSendEmail.setOnClickListener(new OnClickListener()
+ {
+ @Override
+ public void onClick(View v)
+ {
+ if(etEmailRecipient.getText().toString().length() > 0 && etEmailSubject.getText().toString().length() > 0 && etEmailText.getText().toString().length() > 0)
+ {
+ if (resultingAction == null)
+ resultingAction = new Action();
+
+ String responseString = etEmailRecipient.getText().toString() + Action.actionParameter2Split + etEmailSubject.getText().toString() + Action.actionParameter2Split + etEmailText.getText().toString();
+
+ Intent answer = new Intent();
+
+ answer.putExtra(ActivityManageRule.intentNameActionParameter2, responseString);
+
+ setResult(RESULT_OK, answer);
+ ActivityManageActionSendEmail.this.finish();
+ }
+ else
+ Toast.makeText(getBaseContext(), getResources().getString(R.string.enterAllValues), Toast.LENGTH_LONG).show();
+ }
+ });
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/jens/automation2/ActivityManageRule.java b/app/src/main/java/com/jens/automation2/ActivityManageRule.java
index 3c1f307..fa19852 100644
--- a/app/src/main/java/com/jens/automation2/ActivityManageRule.java
+++ b/app/src/main/java/com/jens/automation2/ActivityManageRule.java
@@ -151,6 +151,8 @@ public class ActivityManageRule extends Activity
final static int requestCodeTriggerProximityEdit = 838;
final static int requestCodeActionSetSystemSettingAdd = 839;
final static int requestCodeActionSetSystemSettingEdit = 840;
+ final static int requestCodeActionSendEmailAdd = 841;
+ final static int requestCodeActionSendEmailEdit = 842;
public static ActivityManageRule getInstance()
{
@@ -2263,6 +2265,32 @@ public class ActivityManageRule extends Activity
this.refreshActionList();
}
}
+ else if(requestCode == requestCodeActionSendEmailAdd)
+ {
+ if(resultCode == RESULT_OK)
+ {
+ newAction.setParentRule(ruleToEdit);
+// newAction.setParameter1(data.getBooleanExtra(intentNameActionParameter1, false));
+ newAction.setParameter2(data.getStringExtra(intentNameActionParameter2));
+ ruleToEdit.getActionSet().add(newAction);
+ this.refreshActionList();
+ }
+ }
+ else if(requestCode == requestCodeActionSendEmailEdit)
+ {
+ if(resultCode == RESULT_OK)
+ {
+ ruleToEdit.getActionSet().get(editIndex).setParentRule(ruleToEdit);
+// ruleToEdit.getActionSet().get(editIndex).setParameter1(data.getBooleanExtra(intentNameActionParameter1, false));
+
+ if(data.hasExtra(intentNameActionParameter2))
+ {
+ ruleToEdit.getActionSet().get(editIndex).setParameter2(data.getStringExtra(intentNameActionParameter2));
+ }
+
+ this.refreshActionList();
+ }
+ }
}
protected AlertDialog getActionTypeDialog()
@@ -2343,14 +2371,15 @@ public class ActivityManageRule extends Activity
items.add(new Item(typesLong[i].toString(), R.drawable.variable));
else if(types[i].toString().equals(Action_Enum.setLocationService.toString()))
items.add(new Item(typesLong[i].toString(), R.drawable.compass_small));
+ else if(types[i].toString().equals(Action_Enum.sendEmail.toString()))
+ items.add(new Item(typesLong[i].toString(), R.drawable.email));
else if(types[i].toString().equals(Action_Enum.takeScreenshot.toString()))
{
if(ActivityPermissions.isServiceAvailable(Miscellaneous.getAnyContext(), "MyAccessibilityService"))
items.add(new Item(typesLong[i].toString(), R.drawable.copier));
}
else if(types[i].toString().equals(Action_Enum.setSystemSetting.toString()))
- { items.add(new Item(typesLong[i].toString(), R.drawable.gears_small));
- }
+ items.add(new Item(typesLong[i].toString(), R.drawable.gears_small));
else
items.add(new Item(typesLong[i].toString(), R.drawable.placeholder));
}
@@ -2595,6 +2624,12 @@ public class ActivityManageRule extends Activity
Intent intent = new Intent(ActivityManageRule.this, ActivityManageActionSetSystemSetting.class);
startActivityForResult(intent, requestCodeActionSetSystemSettingAdd);
}
+ else if(actionTypes[which].toString().equals(Action_Enum.sendEmail.toString()))
+ {
+ newAction.setAction(Action_Enum.sendEmail);
+ Intent intent = new Intent(ActivityManageRule.this, ActivityManageActionSendEmail.class);
+ startActivityForResult(intent, requestCodeActionSendEmailAdd);
+ }
}
});
diff --git a/app/src/main/java/com/jens/automation2/AutomationService.java b/app/src/main/java/com/jens/automation2/AutomationService.java
index 160c82a..c84a7b4 100644
--- a/app/src/main/java/com/jens/automation2/AutomationService.java
+++ b/app/src/main/java/com/jens/automation2/AutomationService.java
@@ -434,33 +434,6 @@ public class AutomationService extends Service implements OnInitListener
Settings.writeSettings(Miscellaneous.getAnyContext());
}
-// try
-// {
- StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().permitAll().build());
- EmailService es = new EmailService(Settings.smtpServerHostname, Integer.parseInt(Settings.smtpServerPort));
-
- List addresses = new ArrayList();
- addresses.add(Settings.smtpFromAddress);
- try
- {
- EmailService.Email em = new EmailService.Email(new EmailService.UserPassAuthenticator(Settings.smtpUsername, Settings.smtpPassword), addresses, new InternetAddress(String.valueOf(addresses.get(0))), "test", "testbody");
- es.send(em);
- Miscellaneous.logEvent("i", "sendEmail()", "Email sent.", 1);
- }
- catch (AddressException e)
- {
- throw new RuntimeException(e);
- }
- catch (MessagingException e)
- {
- throw new RuntimeException(e);
- }
-// }
-// catch(Exception e)
-// {
-// Miscellaneous.logEvent("e", "sendMail()", Log.getStackTraceString(e), 1);
-// }
-
Settings.serviceStartDone = true;
Settings.deviceStartDone = true;
}
diff --git a/app/src/main/java/com/jens/automation2/EmailService.java b/app/src/main/java/com/jens/automation2/EmailService.java
index cd59b57..b519c90 100644
--- a/app/src/main/java/com/jens/automation2/EmailService.java
+++ b/app/src/main/java/com/jens/automation2/EmailService.java
@@ -10,7 +10,6 @@ import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
-import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
@@ -20,28 +19,30 @@ public class EmailService
{
private final String server;
private final int port;
+ private final boolean useTls;
public static final String CLIENT_NAME = "Android StackOverflow programmatic email";
- public EmailService(String server, int port)
+ public EmailService(String server, int port, boolean useTls)
{
this.server = server;
this.port = port;
+ this.useTls = useTls;
}
public static class Email
{
- private final Authenticator auth;
+ private Authenticator auth;
private final List toList;
private final Address from;
private final String subject;
private final String body;
- public Email(Authenticator auth, List toList, Address from, String subject, String body)
+ public Email(Authenticator auth, Address from, List toList, String subject, String body)
{
this.auth = auth;
- this.toList = toList;
this.from = from;
+ this.toList = toList;
this.subject = subject;
this.body = body;
}
@@ -93,12 +94,26 @@ public class EmailService
public void send(Email email) throws MessagingException
{
Properties props = new Properties();
- props.put("mail.smtp.auth", "true");
+ if(((UserPassAuthenticator)email.getAuth()).getPasswordAuthentication().getUserName().isEmpty())
+ {
+ props.put("mail.smtp.auth", "false");
+ email.auth = null;
+ }
+ else
+ props.put("mail.smtp.auth", "true");
+
props.put("mail.user", email.getFrom().toString());
props.put("mail.smtp.host", server);
props.put("mail.smtp.port", String.valueOf(port));
- props.put("mail.smtp.starttls.enable", "true");
- props.put("mail.smtp.ssl.trust", server);
+
+ if(useTls)
+ {
+ props.put("mail.smtp.starttls.enable", "true");
+ props.put("mail.smtp.ssl.trust", server);
+ }
+ else
+ props.put("mail.smtp.starttls.enable", "false");
+
props.put("mail.mime.charset", "UTF-8");
Session session = Session.getDefaultInstance(props, email.getAuth());
@@ -106,9 +121,8 @@ public class EmailService
msg.setFrom(email.getFrom());
msg.setSentDate(Calendar.getInstance().getTime());
- Address[] toarray = new Address[]{email.getFrom()};
- msg.setRecipients(Message.RecipientType.TO, toarray);
-// msg.setRecipients(Message.RecipientType.TO, email.getToList().toArray(new InternetAddress[0]));
+ Address[] toArray = new Address[]{email.getFrom()};
+ msg.setRecipients(Message.RecipientType.TO, toArray);
msg.setReplyTo(new Address[]{email.getFrom()});
diff --git a/app/src/main/java/com/jens/automation2/Miscellaneous.java b/app/src/main/java/com/jens/automation2/Miscellaneous.java
index d1d98ce..3a32330 100644
--- a/app/src/main/java/com/jens/automation2/Miscellaneous.java
+++ b/app/src/main/java/com/jens/automation2/Miscellaneous.java
@@ -111,6 +111,7 @@ import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
+import javax.mail.internet.InternetAddress;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
diff --git a/app/src/main/res/drawable-hdpi/email.png b/app/src/main/res/drawable-hdpi/email.png
new file mode 100644
index 0000000..8dc1410
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/email.png differ
diff --git a/app/src/main/res/layout/activity_manage_action_send_email.xml b/app/src/main/res/layout/activity_manage_action_send_email.xml
new file mode 100644
index 0000000..cd111c5
--- /dev/null
+++ b/app/src/main/res/layout/activity_manage_action_send_email.xml
@@ -0,0 +1,91 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 1c02bfb..aae990d 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -995,4 +995,10 @@
Leave empty for no authentication
Password
If username is empty, no authentication is used.
+ Send email
+ Recipient
+ Recipient
+ Subject
+ Enter all values.
+ Remember to configure an SMTP server in settings.
\ No newline at end of file
diff --git a/fastlane/metadata/android/en-US/changelogs/150.txt b/fastlane/metadata/android/en-US/changelogs/150.txt
index bd9d380..ace8a76 100644
--- a/fastlane/metadata/android/en-US/changelogs/150.txt
+++ b/fastlane/metadata/android/en-US/changelogs/150.txt
@@ -1,4 +1,5 @@
* Added: Triggers and actions can now be cloned
* Added: URL checker for triggerUrl action
+* Added: Send emails as action
* Fixed: Crash when starting to add/edit a triggerURL action while the app or the system are set to the German language
* Fixed: Crash when starting service in Google Play version
\ No newline at end of file