From f8718a348a21b041fa683001c530cbb13a45ce39 Mon Sep 17 00:00:00 2001 From: pppscn <35696959@qq.com> Date: Fri, 4 Mar 2022 14:48:05 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=EF=BC=9AEmail=E5=8F=91?= =?UTF-8?q?=E9=80=81=E9=80=9A=E9=81=93=E7=AE=80=E5=8C=96=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=EF=BC=88=E5=B8=B8=E8=A7=81=E9=82=AE=E7=AE=B1=E4=B8=8D=E9=9C=80?= =?UTF-8?q?=E8=A6=81=E5=A1=AB=E5=86=99smtp=E4=BF=A1=E6=81=AF=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../idormy/sms/forwarder/SenderActivity.java | 80 ++++++- .../forwarder/model/vo/EmailSettingVo.java | 15 +- .../idormy/sms/forwarder/sender/SendUtil.java | 3 +- .../sms/forwarder/sender/SenderMailMsg.java | 27 ++- .../res/layout/alert_dialog_setview_email.xml | 208 +++++++++--------- app/src/main/res/values-en/arrays.xml | 15 ++ app/src/main/res/values-en/strings.xml | 7 +- app/src/main/res/values/arrays.xml | 15 ++ app/src/main/res/values/strings.xml | 11 +- app/src/main/res/values/themes.xml | 6 + 10 files changed, 239 insertions(+), 148 deletions(-) create mode 100644 app/src/main/res/values-en/arrays.xml create mode 100644 app/src/main/res/values/arrays.xml diff --git a/app/src/main/java/com/idormy/sms/forwarder/SenderActivity.java b/app/src/main/java/com/idormy/sms/forwarder/SenderActivity.java index 719e4b8d..eb4050d3 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/SenderActivity.java +++ b/app/src/main/java/com/idormy/sms/forwarder/SenderActivity.java @@ -22,12 +22,17 @@ import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.os.Message; +import android.text.SpannableString; +import android.text.Spanned; +import android.text.SpannedString; import android.text.TextUtils; +import android.text.style.AbsoluteSizeSpan; import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; +import android.widget.AdapterView; import android.widget.Button; import android.widget.EditText; import android.widget.GridView; @@ -36,6 +41,7 @@ import android.widget.LinearLayout; import android.widget.ListView; import android.widget.RadioGroup; import android.widget.SimpleAdapter; +import android.widget.Spinner; import android.widget.Switch; import androidx.appcompat.app.AlertDialog; @@ -94,9 +100,6 @@ public class SenderActivity extends AppCompatActivity { public static final int NOTIFY = 0x9731993; private final String TAG = "SenderActivity"; - // 用于存储数据 - private List senderModels = new ArrayList<>(); - private SenderAdapter adapter; //消息处理者,创建一个Handler的子类对象,目的是重写Handler的处理消息的方法(handleMessage()) @SuppressLint("HandlerLeak") private final Handler handler = new Handler() { @@ -107,6 +110,9 @@ public class SenderActivity extends AppCompatActivity { } } }; + // 用于存储数据 + private List senderModels = new ArrayList<>(); + private SenderAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { @@ -514,6 +520,8 @@ public class SenderActivity extends AppCompatActivity { //邮箱 @SuppressLint("SimpleDateFormat") private void setEmail(final SenderModel senderModel, final boolean isClone) { + final String[] MAIL_TYPE = getResources().getStringArray(R.array.MailType); + EmailSettingVo emailSettingVo = null; //try phrase json setting if (senderModel != null) { @@ -541,9 +549,20 @@ public class SenderActivity extends AppCompatActivity { final ClearEditText editTextEmailPsw = view1.findViewById(R.id.editTextEmailPsw); final EditText editTextEmailToAdd = view1.findViewById(R.id.editTextEmailToAdd); final EditText editTextEmailTitle = view1.findViewById(R.id.editTextEmailTitle); - final RadioGroup radioGroupEmailProtocol = view1.findViewById(R.id.radioGroupEmailProtocol); + final Spinner spinnerEmailType = view1.findViewById(R.id.spinnerEmailType); + final LinearLayout layoutServiceSetting = view1.findViewById(R.id.layoutServiceSetting); if (emailSettingVo != null) { - radioGroupEmailProtocol.check(emailSettingVo.getEmailProtocolCheckId()); + String mailType = emailSettingVo.getMailType(); + if (!TextUtils.isEmpty(mailType)) { + for (int i = 0; i < MAIL_TYPE.length; i++) { + if (mailType.equals(MAIL_TYPE[i])) { + spinnerEmailType.setSelection(i); + break; + } + } + } else { + spinnerEmailType.setSelection(MAIL_TYPE.length - 1); + } editTextEmailHost.setText(emailSettingVo.getHost()); editTextEmailPort.setText(emailSettingVo.getPort()); switchEmailSSl.setChecked(emailSettingVo.getSsl()); @@ -564,6 +583,34 @@ public class SenderActivity extends AppCompatActivity { .create(); final AlertDialog show = alertDialog71.show(); + spinnerEmailType.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + String mailType = parent.getItemAtPosition(position).toString(); + //ToastUtils.show("选择的邮箱类型是:" + mailType); + + String hint; + if (mailType.equals(getString(R.string.other_mail_type))) { + hint = getString(R.string.hint_from_add_full); + layoutServiceSetting.setVisibility(View.VISIBLE); + ToastUtils.delayedShow(R.string.tips_other_mail_type, 3000); + } else { + hint = getString(R.string.hint_from_add); + layoutServiceSetting.setVisibility(View.GONE); + } + SpannableString ss = new SpannableString(hint);//定义hint的值 + AbsoluteSizeSpan ass = new AbsoluteSizeSpan(13, true);//设置字体大小 true表示单位是sp + ss.setSpan(ass, 0, ss.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + editTextEmailFromAdd.setHint(new SpannedString(ss)); + } + + @Override + public void onNothingSelected(AdapterView parent) { + // TODO Auto-generated method stub + } + }); + buttonOk.setOnClickListener(view -> { String senderName = editTextEmailName.getText().toString().trim(); int senderStatus = switchEmailEnable.isChecked() ? STATUS_ON : STATUS_OFF; @@ -572,7 +619,7 @@ public class SenderActivity extends AppCompatActivity { return; } - String protocol = radioGroupEmailProtocol.getCheckedRadioButtonId() == R.id.radioEmailProtocolSmtp ? "SMTP" : "IMAP"; + String mailType = spinnerEmailType.getSelectedItem().toString(); String host = editTextEmailHost.getText().toString().trim(); String port = editTextEmailPort.getText().toString().trim(); boolean ssl = switchEmailSSl.isChecked(); @@ -585,12 +632,17 @@ public class SenderActivity extends AppCompatActivity { String nickname = editTextEmailNickname.getText().toString().trim(); if (nickname.isEmpty()) nickname = "SmsForwarder"; - if (host.isEmpty() || port.isEmpty() || fromEmail.isEmpty() || pwd.isEmpty() || toEmail.isEmpty()) { + if (fromEmail.isEmpty() || pwd.isEmpty() || toEmail.isEmpty()) { ToastUtils.delayedShow(R.string.invalid_email, 3000); return; } - EmailSettingVo emailSettingVoNew = new EmailSettingVo(protocol, host, port, ssl, fromEmail, nickname, pwd, toEmail, title); + if (mailType.equals(getString(R.string.other_mail_type)) && (host.isEmpty() || port.isEmpty())) { + ToastUtils.delayedShow(R.string.tips_other_mail_type, 3000); + return; + } + + EmailSettingVo emailSettingVoNew = new EmailSettingVo(mailType, host, port, ssl, fromEmail, nickname, pwd, toEmail, title); if (isClone || senderModel == null) { SenderModel newSenderModel = new SenderModel(); newSenderModel.setName(senderName); @@ -622,7 +674,7 @@ public class SenderActivity extends AppCompatActivity { }); buttonTest.setOnClickListener(view -> { - String protocol = radioGroupEmailProtocol.getCheckedRadioButtonId() == R.id.radioEmailProtocolSmtp ? "SMTP" : "IMAP"; + String mailType = spinnerEmailType.getSelectedItem().toString(); String host = editTextEmailHost.getText().toString().trim(); String port = editTextEmailPort.getText().toString().trim(); boolean ssl = switchEmailSSl.isChecked(); @@ -636,14 +688,20 @@ public class SenderActivity extends AppCompatActivity { String nickname = editTextEmailNickname.getText().toString().trim(); if (nickname.isEmpty()) nickname = "SmsForwarder"; - if (host.isEmpty() || port.isEmpty() || fromEmail.isEmpty() || pwd.isEmpty() || toEmail.isEmpty()) { + if (fromEmail.isEmpty() || pwd.isEmpty() || toEmail.isEmpty()) { ToastUtils.delayedShow(R.string.invalid_email, 3000); return; } + if (mailType.equals(getString(R.string.other_mail_type)) && (host.isEmpty() || port.isEmpty())) { + ToastUtils.delayedShow(R.string.tips_other_mail_type, 3000); + return; + } + try { + EmailSettingVo emailSettingVoNew = new EmailSettingVo(mailType, host, port, ssl, fromEmail, nickname, pwd, toEmail, title); SmsVo smsVo = new SmsVo(getString(R.string.test_phone_num), getString(R.string.test_sender_sms), new Date(), getString(R.string.test_sim_info)); - SenderMailMsg.sendEmail(0, handler, protocol, host, port, ssl, fromEmail, nickname, pwd, toEmail, smsVo.getTitleForSend(title), smsVo.getSmsVoForSend()); + SenderMailMsg.sendEmail(0, handler, emailSettingVoNew, smsVo.getTitleForSend(title), smsVo.getSmsVoForSend()); } catch (Exception e) { ToastUtils.delayedShow(getString(R.string.failed_to_fwd) + e.getMessage(), 3000); e.printStackTrace(); diff --git a/app/src/main/java/com/idormy/sms/forwarder/model/vo/EmailSettingVo.java b/app/src/main/java/com/idormy/sms/forwarder/model/vo/EmailSettingVo.java index 9ce4eee5..66a9ad47 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/model/vo/EmailSettingVo.java +++ b/app/src/main/java/com/idormy/sms/forwarder/model/vo/EmailSettingVo.java @@ -1,13 +1,12 @@ package com.idormy.sms.forwarder.model.vo; -import com.idormy.sms.forwarder.R; - import java.io.Serializable; import lombok.Data; @Data public class EmailSettingVo implements Serializable { + private String mailType; private String host; private String port; private Boolean ssl; @@ -16,13 +15,12 @@ public class EmailSettingVo implements Serializable { private String pwd; private String toEmail; private String title; - private String protocol; public EmailSettingVo() { } - public EmailSettingVo(String protocol, String host, String port, Boolean ssl, String fromEmail, String nickname, String pwd, String toEmail, String title) { - this.protocol = protocol; + public EmailSettingVo(String mailType, String host, String port, Boolean ssl, String fromEmail, String nickname, String pwd, String toEmail, String title) { + this.mailType = mailType; this.host = host; this.port = port; this.ssl = ssl; @@ -33,11 +31,4 @@ public class EmailSettingVo implements Serializable { this.title = title; } - public int getEmailProtocolCheckId() { - if (protocol == null || protocol.equals("SMTP")) { - return R.id.radioEmailProtocolSmtp; - } else { - return R.id.radioEmailProtocolImap; - } - } } diff --git a/app/src/main/java/com/idormy/sms/forwarder/sender/SendUtil.java b/app/src/main/java/com/idormy/sms/forwarder/sender/SendUtil.java index 29231f24..60ac1445 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/sender/SendUtil.java +++ b/app/src/main/java/com/idormy/sms/forwarder/sender/SendUtil.java @@ -210,8 +210,7 @@ public class SendUtil { EmailSettingVo emailSettingVo = JSON.parseObject(senderModel.getJsonSetting(), EmailSettingVo.class); if (emailSettingVo != null) { try { - SenderMailMsg.sendEmail(logId, handError, emailSettingVo.getProtocol(), emailSettingVo.getHost(), emailSettingVo.getPort(), emailSettingVo.getSsl(), emailSettingVo.getFromEmail(), emailSettingVo.getNickname(), - emailSettingVo.getPwd(), emailSettingVo.getToEmail(), smsVo.getTitleForSend(emailSettingVo.getTitle(), regexReplace), smsVo.getSmsVoForSend(smsTemplate, regexReplace)); + SenderMailMsg.sendEmail(logId, handError, emailSettingVo, smsVo.getTitleForSend(emailSettingVo.getTitle(), regexReplace), smsVo.getSmsVoForSend(smsTemplate, regexReplace)); } catch (Exception e) { LogUtil.updateLog(logId, 0, e.getMessage()); Log.e(TAG, "senderSendMsg: SenderMailMsg error " + e.getMessage()); diff --git a/app/src/main/java/com/idormy/sms/forwarder/sender/SenderMailMsg.java b/app/src/main/java/com/idormy/sms/forwarder/sender/SenderMailMsg.java index 9266315f..1477c8d3 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/sender/SenderMailMsg.java +++ b/app/src/main/java/com/idormy/sms/forwarder/sender/SenderMailMsg.java @@ -1,8 +1,12 @@ package com.idormy.sms.forwarder.sender; import android.os.Handler; +import android.text.TextUtils; import android.util.Log; +import com.idormy.sms.forwarder.MyApplication; +import com.idormy.sms.forwarder.R; +import com.idormy.sms.forwarder.model.vo.EmailSettingVo; import com.idormy.sms.forwarder.utils.LogUtil; import com.smailnet.emailkit.Draft; import com.smailnet.emailkit.EmailKit; @@ -15,26 +19,33 @@ import java.util.Set; public class SenderMailMsg extends SenderBaseMsg { private static final String TAG = "SenderMailMsg"; - public static void sendEmail(final long logId, final Handler handError, final String protocol, final String host, final String port, final boolean ssl, final String fromEmail, final String nickname, final String pwd, final String toAdd, final String title, final String content) { + public static void sendEmail(final long logId, final Handler handError, final EmailSettingVo emailSettingVo, final String title, final String content) { - Log.d(TAG, "sendEmail: protocol:" + protocol + " host:" + host + " port:" + port + " ssl:" + ssl + " fromEmail:" + fromEmail + " nickname:" + nickname + " pwd:" + pwd + " toAdd:" + toAdd); + Log.d(TAG, "emailSettingVo: " + emailSettingVo.toString()); try { //初始化框架 //EmailKit.initialize(MyApplication.getContext()); //配置发件人邮件服务器参数 - EmailKit.Config config = new EmailKit.Config() - .setSMTP(host, Integer.parseInt(port), ssl) //设置SMTP服务器主机地址、端口和是否开启ssl - .setAccount(fromEmail) //发件人邮箱 - .setPassword(pwd); //密码或授权码 + String fromEmail = emailSettingVo.getFromEmail(); + EmailKit.Config config = new EmailKit.Config(); + if (TextUtils.isEmpty(emailSettingVo.getMailType()) || emailSettingVo.getMailType().equals(MyApplication.getContext().getString(R.string.other_mail_type))) { + config.setSMTP(emailSettingVo.getHost(), Integer.parseInt(emailSettingVo.getPort()), emailSettingVo.getSsl()); //设置SMTP服务器主机地址、端口和是否开启ssl + } else { + fromEmail += emailSettingVo.getMailType(); + config.setMailType(emailSettingVo.getMailType());//选择邮箱类型 + } + + config.setAccount(fromEmail) //发件人邮箱 + .setPassword(emailSettingVo.getPwd()); //密码或授权码 //多个收件人邮箱 - Set toSet = new HashSet<>(Arrays.asList(toAdd.replace(",", ",").split(","))); + Set toSet = new HashSet<>(Arrays.asList(emailSettingVo.getToEmail().replace(",", ",").split(","))); //设置一封草稿邮件 Draft draft = new Draft() - .setNickname(nickname) //发件人昵称 + .setNickname(emailSettingVo.getNickname()) //发件人昵称 .setTo(toSet) //收件人邮箱 .setSubject(title) //邮件主题 .setText(content); //邮件正文 diff --git a/app/src/main/res/layout/alert_dialog_setview_email.xml b/app/src/main/res/layout/alert_dialog_setview_email.xml index b0d63ff7..a1010fa6 100644 --- a/app/src/main/res/layout/alert_dialog_setview_email.xml +++ b/app/src/main/res/layout/alert_dialog_setview_email.xml @@ -20,7 +20,8 @@ + android:text="@string/set_name" + android:textStyle="bold" /> + android:text="@string/email_account" + android:textStyle="bold" /> + + + android:text="@string/email_password" + android:textStyle="bold" /> + android:layout_marginStart="3dp" + app:hint="填写登录密码 或 授权码" + app:showEye="true" + app:textColorHint="#9E9E9E" + app:textSize="13sp" /> + android:text="@string/email_nickname" + android:textStyle="bold" /> - - + android:layout_marginStart="10dp" + android:layout_marginTop="10dp" + android:text="@string/servers" + android:textColor="@color/colorBlueGreyDark" + android:textSize="14sp" + android:textStyle="bold" + tools:ignore="HardcodedText" /> - - + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - + tools:ignore="UseSwitchCompatOrMaterialXml" /> + + android:text="@string/email_to" + android:textStyle="bold" /> + android:text="@string/email_title" + android:textStyle="bold" /> + + + \@qq.com + \@foxmail.com + \@exmail.qq.com + \@outlook.com + \@office365.com + \@gmail.com + \@yeah.net + \@163.com + \@126.com + Other + + \ No newline at end of file diff --git a/app/src/main/res/values-en/strings.xml b/app/src/main/res/values-en/strings.xml index 21d068f3..06227770 100644 --- a/app/src/main/res/values-en/strings.xml +++ b/app/src/main/res/values-en/strings.xml @@ -135,9 +135,6 @@ Secret (optional) At Mobiles e.g. 18888888888,19999999999 - Protocol - SMTP - IMAP Server Host Server Port SSL @@ -444,4 +441,8 @@ One Pixel One Pixel Activity This can change the process priority from 4 to 1 + Fill in the username before @ + format: AAA@BBB.CCC + Other + For other email addresses, please fill in the complete email address and manually fill in the SMTP server information diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml new file mode 100644 index 00000000..c25058bd --- /dev/null +++ b/app/src/main/res/values/arrays.xml @@ -0,0 +1,15 @@ + + + + \@qq.com + \@foxmail.com + \@exmail.qq.com + \@outlook.com + \@office365.com + \@gmail.com + \@yeah.net + \@163.com + \@126.com + 其他邮箱 + + \ 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 b512217b..a20cfbf2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -135,14 +135,11 @@ 加签 Secret (没有可不填) 转发时@某人 Tips:多个手机号用逗号分开,例如:18888888888,19999999999 - 协议类型 - SMTP - IMAP 服务器地址 服务器端口 开启SSL - 发件人邮箱 - 登录密码/授权码 + 发件邮箱 + 登录密码 发件人昵称 收件地址 Tip:多个收件人以半角逗号,分隔 @@ -443,4 +440,8 @@ 1像素 1像素透明Activity保活 【按需启用】使进程的优先级在屏幕锁屏时间由4提升为最高优先级1 + 填写 @ 前面的用户名 + 填写格式: AAA@BBB.CCC + 其他邮箱 + 其他邮箱,请填写完整的邮箱地址并手动填写SMTP服务器信息 diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index d764a969..e326031c 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -106,4 +106,10 @@ + +