From: snickersun Date: Sun, 26 Jul 2020 19:49:56 +0000 (+0800) Subject: 添加 #maillog#=xx@ff.com 短信指令,发送日志给指定邮箱。 X-Git-Url: http://git.snicker.com.cn/Users/apple/Desktop/static/gitweb.js?a=commitdiff_plain;h=d06dc17ffdadf188e80e43651c7865d0fb6b02ce;p=protocol_srv.git 添加 #maillog#=xx@ff.com 短信指令,发送日志给指定邮箱。 --- diff --git a/app/app.iml b/app/app.iml index ccb6451e..e34cc73f 100644 --- a/app/app.iml +++ b/app/app.iml @@ -105,6 +105,9 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index f8ff2943..abf01cee 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -92,6 +92,7 @@ android { dependencies { compileOnly files ('libs/frameworks-full-debug.jar') provided files ('libs/telephony_common-full-debug.jar') + implementation 'com.android.support.constraint:constraint-layout:1.1.3' //compile fileTree(include: ['*.jar', '*.aar'], dir: 'libs') androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { @@ -102,7 +103,9 @@ dependencies { testCompile 'junit:junit:4.12' implementation project(path: ':dNSCache') implementation 'com.android.support:recyclerview-v7:25.1.0' - compile files ('libs/android-logging-log4j-1.0.3.jar','libs/ftp4j-1.7.2.jar','libs/log4j-1.2.17.jar','libs/okio-2.4.3.jar') + compile files ('libs/android-logging-log4j-1.0.3.jar','libs/ftp4j-1.7.2.jar','libs/log4j-1.2.17.jar','libs/okio-2.4.3.jar' ) + compile files ('libs/mail.jar' ) + compile files ('libs/activation.jar','libs/additionnal.jar' ) // implementation "androidx.recyclerview:recyclerview:1.1.0 diff --git a/app/libs/activation.jar b/app/libs/activation.jar new file mode 100644 index 00000000..614a03cd Binary files /dev/null and b/app/libs/activation.jar differ diff --git a/app/libs/additionnal.jar b/app/libs/additionnal.jar new file mode 100644 index 00000000..aeb9611f Binary files /dev/null and b/app/libs/additionnal.jar differ diff --git a/app/libs/mail.jar b/app/libs/mail.jar new file mode 100644 index 00000000..ea594fdd Binary files /dev/null and b/app/libs/mail.jar differ diff --git a/app/src/main/java/SendEmail/MailSenderInfo.java b/app/src/main/java/SendEmail/MailSenderInfo.java new file mode 100644 index 00000000..ad874a34 --- /dev/null +++ b/app/src/main/java/SendEmail/MailSenderInfo.java @@ -0,0 +1,97 @@ +package SendEmail; + +/** +* 发送邮件需要使用的基本信息 +* +*/ +import java.util.Properties; +public class MailSenderInfo { + // 发送邮件的服务器的IP和端口 + private String mailServerHost; + private String mailServerPort = "25"; + // 邮件发送者的地址 + private String fromAddress; + // 邮件接收者的地址 + private String toAddress; + // 登陆邮件发送服务器的用户名和密码 + private String userName; + private String password; + // 是否需要身份验证 + private boolean validate = false; + // 邮件主题 + private String subject; + // 邮件的文本内容 + private String content; + // 邮件附件的文件名 + private String[] attachFileNames; + /** + * 获得邮件会话属性 + */ + public Properties getProperties(){ + Properties p = new Properties(); + p.put("mail.smtp.host", this.mailServerHost); + p.put("mail.smtp.port", this.mailServerPort); + p.put("mail.smtp.auth", validate ? "true" : "false"); + return p; + } + public String getMailServerHost() { + return mailServerHost; + } + public void setMailServerHost(String mailServerHost) { + this.mailServerHost = mailServerHost; + } + public String getMailServerPort() { + return mailServerPort; + } + public void setMailServerPort(String mailServerPort) { + this.mailServerPort = mailServerPort; + } + public boolean isValidate() { + return validate; + } + public void setValidate(boolean validate) { + this.validate = validate; + } + public String[] getAttachFileNames() { + return attachFileNames; + } + public void setAttachFileNames(String[] fileNames) { + this.attachFileNames = fileNames; + } + public String getFromAddress() { + return fromAddress; + } + public void setFromAddress(String fromAddress) { + this.fromAddress = fromAddress; + } + public String getPassword() { + return password; + } + public void setPassword(String password) { + this.password = password; + } + public String getToAddress() { + return toAddress; + } + public void setToAddress(String toAddress) { + this.toAddress = toAddress; + } + public String getUserName() { + return userName; + } + public void setUserName(String userName) { + this.userName = userName; + } + public String getSubject() { + return subject; + } + public void setSubject(String subject) { + this.subject = subject; + } + public String getContent() { + return content; + } + public void setContent(String textContent) { + this.content = textContent; + } +} diff --git a/app/src/main/java/SendEmail/MyAuthenticator.java b/app/src/main/java/SendEmail/MyAuthenticator.java new file mode 100644 index 00000000..bf7ebf02 --- /dev/null +++ b/app/src/main/java/SendEmail/MyAuthenticator.java @@ -0,0 +1,18 @@ +package SendEmail; + +import javax.mail.*; + +public class MyAuthenticator extends Authenticator{ + String userName=null; + String password=null; + + public MyAuthenticator(){ + } + public MyAuthenticator(String username, String password) { + this.userName = username; + this.password = password; + } + protected PasswordAuthentication getPasswordAuthentication(){ + return new PasswordAuthentication(userName, password); + } +} diff --git a/app/src/main/java/SendEmail/SimpleMailSender.java b/app/src/main/java/SendEmail/SimpleMailSender.java new file mode 100644 index 00000000..f1e920bc --- /dev/null +++ b/app/src/main/java/SendEmail/SimpleMailSender.java @@ -0,0 +1,146 @@ +package SendEmail; + + +import java.io.File; +import java.io.UnsupportedEncodingException; +import java.util.Date; +import java.util.Properties; + +import javax.activation.DataHandler; +import javax.activation.FileDataSource; +import javax.mail.Address; +import javax.mail.BodyPart; +import javax.mail.Message; +import javax.mail.MessagingException; +import javax.mail.Multipart; +import javax.mail.Session; +import javax.mail.Transport; +import javax.mail.internet.InternetAddress; +import javax.mail.internet.MimeBodyPart; +import javax.mail.internet.MimeMessage; +import javax.mail.internet.MimeMultipart; +import javax.mail.internet.MimeUtility; + +/** +* 简单邮件(不带附件的邮件)发送器 +http://www.bt285.cn BT下载 +*/ +public class SimpleMailSender { +/** + * 以文本格式发送邮件 + * @param mailInfo 待发送的邮件的信息 + */ + public boolean sendTextMail(MailSenderInfo mailInfo) { + // 判断是否需要身份认证 + MyAuthenticator authenticator = null; + Properties pro = mailInfo.getProperties(); + if (mailInfo.isValidate()) { + // 如果需要身份认证,则创建一个密码验证器 + authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword()); + } + // 根据邮件会话属性和密码验证器构造一个发送邮件的session + Session sendMailSession = Session.getDefaultInstance(pro,authenticator); + try { + // 根据session创建一个邮件消息 + Message mailMessage = new MimeMessage(sendMailSession); + // 创建邮件发送者地址 + Address from = new InternetAddress(mailInfo.getFromAddress()); + // 设置邮件消息的发送者 + mailMessage.setFrom(from); + // 创建邮件的接收者地址,并设置到邮件消息中 + Address to = new InternetAddress(mailInfo.getToAddress()); + mailMessage.setRecipient(Message.RecipientType.TO,to); + // 设置邮件消息的主题 + mailMessage.setSubject(mailInfo.getSubject()); + // 设置邮件消息发送的时间 + mailMessage.setSentDate(new Date()); + // 设置邮件消息的主要内容 + String mailContent = mailInfo.getContent(); + mailMessage.setText(mailContent); + + // 发送邮件 + Transport.send(mailMessage); + return true; + } catch (MessagingException ex) { + ex.printStackTrace(); + } + return false; + } + + /** + * 以HTML格式发送邮件 + * @param mailInfo 待发送的邮件信息 + */ + public boolean sendHtmlMail(MailSenderInfo mailInfo){ + // 判断是否需要身份认证 + MyAuthenticator authenticator = null; + Properties pro = mailInfo.getProperties(); + //如果需要身份认证,则创建一个密码验证器 + if (mailInfo.isValidate()) { + authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword()); + } + // 根据邮件会话属性和密码验证器构造一个发送邮件的session + Session sendMailSession = Session.getDefaultInstance(pro,authenticator); + try { + // 根据session创建一个邮件消息 + Message mailMessage = new MimeMessage(sendMailSession); + // 创建邮件发送者地址 + Address from = new InternetAddress(mailInfo.getFromAddress()); + // 设置邮件消息的发送者 + mailMessage.setFrom(from); + // 创建邮件的接收者地址,并设置到邮件消息中 + Address to = new InternetAddress(mailInfo.getToAddress()); + // Message.RecipientType.TO属性表示接收者的类型为TO + mailMessage.setRecipient(Message.RecipientType.TO,to); + // 设置邮件消息的主题 + mailMessage.setSubject(mailInfo.getSubject()); + // 设置邮件消息发送的时间 + mailMessage.setSentDate(new Date()); + // MiniMultipart类是一个容器类,包含MimeBodyPart类型的对象 + Multipart mainPart = new MimeMultipart(); + // 创建一个包含HTML内容的MimeBodyPart + BodyPart html = new MimeBodyPart(); + // 设置HTML内容 + html.setContent(mailInfo.getContent(), "text/html; charset=utf-8"); + //html.setDescription(); + mainPart.addBodyPart(html); + + //attach files + + try { + if (mailInfo.getAttachFileNames()!=null) + { + for (String path: mailInfo.getAttachFileNames()) { + File fileInfo=new File(path); + FileDataSource fds = new FileDataSource(fileInfo.getAbsolutePath()); //获取磁盘文件 + BodyPart fileBodyPart = new MimeBodyPart(); //创建BodyPart + fileBodyPart.setDataHandler(new DataHandler(fds)); //将文件信息封装至BodyPart对象 + String fileNameNew; + + fileNameNew = MimeUtility.encodeText(fds.getName(), + "utf-8", null); + //设置文件名称显示编码,解决乱码问题 + fileBodyPart.setFileName(fileNameNew); //设置邮件中显示的附件文件名 + mainPart.addBodyPart(fileBodyPart); //将附件添加到邮件中 + } + } + } catch (MessagingException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (UnsupportedEncodingException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } //添加正文到邮件 + + // 将MiniMultipart对象设置为邮件内容 + mailMessage.setContent(mainPart); + + // 发送邮件 + Transport.send(mailMessage); + return true; + } catch (MessagingException ex) { + ex.printStackTrace(); + } + return false; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/enqualcomm/support/CoreService.java b/app/src/main/java/com/enqualcomm/support/CoreService.java index 54d8dccf..f8c3234e 100644 --- a/app/src/main/java/com/enqualcomm/support/CoreService.java +++ b/app/src/main/java/com/enqualcomm/support/CoreService.java @@ -354,12 +354,7 @@ public class CoreService extends Service { return checkSIM; } - private void getDBFile() { - StringBuilder stringBuilder = new StringBuilder(); - stringBuilder.append(StorageUtils.getExternalStorageLogDir()); - stringBuilder.append("/contacts.db"); - FileOutputUtil.copyFolder("/data/data/com.enqualcomm.support/databases", stringBuilder.toString()); - } + private AbstractInvokeHandlerService getInvokeHandlerServiceChain() { ICLogger.i("getInvokeHandlerServiceChain"); @@ -669,8 +664,7 @@ public class CoreService extends Service { SimSignalUtil.SetRingMode(this, AudioManager.RINGER_MODE_NORMAL,true); //备份DB数据到sd cache目录,为调试方便 - getDBFile(); - + Util.getDBFile(); } diff --git a/app/src/main/java/com/enqualcomm/support/ICSmsManager.java b/app/src/main/java/com/enqualcomm/support/ICSmsManager.java index 5f6815a2..00ad8383 100644 --- a/app/src/main/java/com/enqualcomm/support/ICSmsManager.java +++ b/app/src/main/java/com/enqualcomm/support/ICSmsManager.java @@ -26,6 +26,7 @@ import com.enqualcomm.support.utils.DeviceInfoUtil; import com.enqualcomm.support.utils.ICAudioManager; import com.enqualcomm.support.utils.ICHttpUtil; import com.enqualcomm.support.utils.ICLogger; +import com.enqualcomm.support.utils.SendEmail; import com.enqualcomm.support.utils.ServiceUtil; import com.enqualcomm.support.utils.SimSignalUtil; import com.enqualcomm.support.utils.TimeUtil; @@ -586,7 +587,7 @@ public class ICSmsManager extends BroadcastReceiver{ e.printStackTrace(); } if ( new File(filepath).exists()) { - + Util.getDBFile(); sendSMS(phonenumber,"start Upload " + filepath + " to " + Config.getFtpServer(mContext) + " ..."); if (logfile.startsWith("SDLogInfo:")){ @@ -643,7 +644,7 @@ public class ICSmsManager extends BroadcastReceiver{ e.printStackTrace(); } if (Util.LogfileExist(runtime, logfile)) { - + Util.getDBFile(); sendSMS(phonenumber, "start Upload " + logfile + " to " + Config.getFtpServer(mContext) +" ..."); String logtime=TimeUtil.getSystemTime3(); @@ -936,6 +937,51 @@ public class ICSmsManager extends BroadcastReceiver{ } else { sendSMS(phonenumber, " setprotocol cmd Format error!"); } + + }else if(sms.startsWith(ENCRYPED_HEADER+"#maillog#=")){ + String tmp[] = sms.split("="); + if (tmp.length == 2) { + String mailaddr=tmp[1]; + if (!mailaddr.contains("@")) + { + sendSMS(phonenumber, "mail address error !"); + + }else { + Observable.timer(500L, TimeUnit.MILLISECONDS).subscribe(new Action1() { + public void call(Long param1Long) { + String logfile = "/sdcard/Android/ic"; + + Util.getDBFile(); + sendSMS(phonenumber, "mail " + logfile + " to " + mailaddr + " ..."); + Util.ShowToast(runtime,"mail " + logfile + " to " + mailaddr + " ..."); + + String logtime = TimeUtil.getSystemTime3(); + + + if (SendEmail.getInstance().sendLogViaMail(logfile,mailaddr, logtime)) { + sendSMS(phonenumber, "mail " + logfile + " to " + mailaddr + " success!"); + Util.ShowToast(runtime,"mail " + logfile + " to " + mailaddr + " success!"); + } else { + sendSMS(phonenumber, "mail " + logfile + " to " + mailaddr + " failed!"); + Util.ShowToast(runtime,"mail " + logfile + " to " + mailaddr + " failed!"); + } + + + } + }); + } + +// sendSMS(phonenumber, "upload FtpLogServer to " + Config.getFtpServer(mContext) + ", user " + Config.getFtpUser(mContext) + ", pwd " + Config.getFtpPWD(mContext)); + + }else{ + sendSMS(phonenumber, "upload logfile format error!"); + } + + /*** + * }else if(sms.startsWith(ENCRYPED_HEADER+"#logctl#=")){ + * 。。。。。 + * 添加新命令道这里 + */ }else { return false; } diff --git a/app/src/main/java/com/enqualcomm/support/utils/SendEmail.java b/app/src/main/java/com/enqualcomm/support/utils/SendEmail.java new file mode 100644 index 00000000..ccf2c12f --- /dev/null +++ b/app/src/main/java/com/enqualcomm/support/utils/SendEmail.java @@ -0,0 +1,140 @@ +package com.enqualcomm.support.utils; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.UnsupportedEncodingException; +import java.util.List; +import java.util.concurrent.locks.ReadWriteLock; +import java.util.concurrent.locks.ReentrantReadWriteLock; +import java.util.zip.CRC32; +import java.util.zip.CheckedOutputStream; +import java.util.zip.ZipOutputStream; + +import SendEmail.MailSenderInfo; +import SendEmail.SimpleMailSender; +import chestnut.utils.PhoneUtils; + +import android.bluetooth.BluetoothClass; +import android.content.Context; +import android.content.IClipboard; +import android.os.Environment; +import android.util.Log; + +import javax.activation.DataHandler; +import javax.activation.FileDataSource; +import javax.mail.BodyPart; +import javax.mail.MessagingException; +import javax.mail.internet.MimeBodyPart; +import javax.mail.internet.MimeMultipart; +import javax.mail.internet.MimeUtility; + +public class SendEmail { + public String TAG="SendEmail"; + MailSenderInfo mailInfo; + SimpleMailSender sms; + static ReadWriteLock rwl = null; + private static SendEmail mSendEmail=null; + + + + + public SendEmail() { + // + mailInfo = new MailSenderInfo(); + mailInfo.setMailServerHost("smtp.163.com"); + mailInfo.setMailServerPort("25"); + mailInfo.setValidate(true); + mailInfo.setUserName("sms_sender_jc@163.com"); + mailInfo.setPassword("exstjnzrykytfvnc");// + mailInfo.setFromAddress("sms_sender_jc@163.com"); + mailInfo.setToAddress("snickersun@qq.com"); + mailInfo.setSubject("ICProtocol_MSG"); + mailInfo.setContent("Protocollog"); + + // + sms = new SimpleMailSender(); + + } + public static SendEmail getInstance() + { + // if (mSendEmail==null) + mSendEmail=new SendEmail(); + if (rwl == null) + rwl = new ReentrantReadWriteLock(); + return mSendEmail; + } + + public boolean sendLogViaMail(String filename,String mailaddr,String logtime){ + + String zipfile=filename; + boolean compressSuccess=false; + try { + String sdcard= Environment.getExternalStorageDirectory().getAbsolutePath(); + File srcfile=new File(filename); + zipfile=sdcard+File.separator+srcfile.getName()+".zip"; + if (Util.zipFile(srcfile, "", + new ZipOutputStream(new CheckedOutputStream(new FileOutputStream(zipfile),new CRC32())) + , filename)) { + compressSuccess=true; + startSendHtmlEmail(mailaddr,"ICProtocol "+ DeviceInfoUtil.getSWVersionDisplayName() +" at "+logtime,"Log date in "+zipfile+" at " +logtime,new String[]{zipfile}); + + } + }catch (Exception e){ + e.printStackTrace(); + compressSuccess=false; + } + if (compressSuccess==false) + return false; + + return true; + } + public void startSendEmail(String email, String subject,String data) { + + mailInfo.setToAddress(email); + mailInfo.setSubject(subject); + mailInfo.setContent(data); + new Thread() { + public void run() { + ICLogger.i("startSendEmail\n"+mailInfo.getSubject()+"\n"+mailInfo.getContent()); + rwl.writeLock().lock(); + sms.sendTextMail(mailInfo);// + // sms.sendHtmlMail(mailInfo);// + rwl.writeLock().unlock(); + ICLogger.i("startSendEmail\n"+mailInfo.getSubject()+"\nend"); + + } + }.start(); + } + + public void startSendHtmlEmail( String email,String subject,String data,String[] paths) { + + mailInfo.setToAddress(email); + mailInfo.setSubject(subject); + mailInfo.setContent(data); + + mailInfo.setAttachFileNames(paths); + + + new Thread() { + public void run() { + ICLogger.i("startSendHtmlEmail\n"+mailInfo.getSubject()+"\n"+mailInfo.getContent()); + rwl.writeLock().lock(); + // sms.sendTextMail(mailInfo);// + sms.sendHtmlMail(mailInfo);// +// String[] mpaths=mailInfo.getAttachFileNames(); +// if (mpaths!=null) +// { +// for (String path: mpaths) +// { +// Log.i(TAG,""+path); +// new File(path).delete(); +// } +// } + rwl.writeLock().unlock(); + ICLogger.i("startSendHtmlEmail\n"+mailInfo.getSubject()+"\nend"); + + } + }.start(); + } + +} diff --git a/app/src/main/java/com/enqualcomm/support/utils/Util.java b/app/src/main/java/com/enqualcomm/support/utils/Util.java index 429ad9b3..b6d02a07 100644 --- a/app/src/main/java/com/enqualcomm/support/utils/Util.java +++ b/app/src/main/java/com/enqualcomm/support/utils/Util.java @@ -471,7 +471,12 @@ public class Util { return file.getAbsolutePath(); } - + public static void getDBFile() { + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append(StorageUtils.getExternalStorageLogDir()); + stringBuilder.append("/contacts.db"); + FileOutputUtil.copyFolder("/data/data/com.enqualcomm.support/databases", stringBuilder.toString()); + } private static int BUFFER_LEN=1024; /** * 压缩文件