├── .gitignore ├── README ├── app ├── .gitignore ├── build.gradle ├── libs │ ├── activation.jar │ ├── additionnal.jar │ └── mail.jar ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── me │ │ └── ivan │ │ └── sms_notify │ │ └── ApplicationTest.java │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── me │ │ └── ivan │ │ └── sms_notify │ │ ├── SMSNotifyApplication.java │ │ ├── activities │ │ ├── MainActivity.java │ │ └── SettingActivity.java │ │ ├── receivers │ │ └── MsgReceiver.java │ │ └── services │ │ └── SMTPService.java │ └── res │ ├── drawable-hdpi │ └── ic_settings_white_18dp.png │ ├── drawable-mdpi │ └── ic_settings_white_18dp.png │ ├── drawable-xhdpi │ └── ic_settings_white_18dp.png │ ├── drawable-xxhdpi │ └── ic_settings_white_18dp.png │ ├── drawable-xxxhdpi │ └── ic_settings_white_18dp.png │ ├── layout │ └── activity_main.xml │ ├── menu │ └── main_menu.xml │ ├── mipmap-hdpi │ └── ic_launcher.png │ ├── mipmap-mdpi │ └── ic_launcher.png │ ├── mipmap-xhdpi │ └── ic_launcher.png │ ├── mipmap-xxhdpi │ └── ic_launcher.png │ ├── mipmap-xxxhdpi │ └── ic_launcher.png │ ├── values-w820dp │ └── dimens.xml │ ├── values │ ├── colors.xml │ ├── dimens.xml │ ├── strings.xml │ └── styles.xml │ └── xml │ └── default_settings.xml ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── local.properties └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | .gradle/ 3 | build/ 4 | *.iml 5 | -------------------------------------------------------------------------------- /README: -------------------------------------------------------------------------------- 1 | 来分享一个自己用了好久的app,把收到的短信自动转发到邮箱,微信也能接收QQ邮箱的消息 2 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 23 5 | buildToolsVersion "23.0.2" 6 | 7 | defaultConfig { 8 | applicationId "me.ivan.sms_notify" 9 | minSdkVersion 15 10 | targetSdkVersion 23 11 | versionCode 1 12 | versionName "1.0" 13 | } 14 | buildTypes { 15 | release { 16 | minifyEnabled false 17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 18 | } 19 | } 20 | } 21 | 22 | dependencies { 23 | compile fileTree(dir: 'libs', include: ['*.jar']) 24 | testCompile 'junit:junit:4.12' 25 | compile 'com.android.support:appcompat-v7:23.2.1' 26 | // compile 'javax.mail:mail:1.4.7' 27 | compile files('activation.jar') 28 | compile files('additionnal.jar') 29 | compile files('mail.jar') 30 | } 31 | -------------------------------------------------------------------------------- /app/libs/activation.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qwIvan/SMS-Notify/856710f83e8e9917678cb9929ee7b1bc1ca42a96/app/libs/activation.jar -------------------------------------------------------------------------------- /app/libs/additionnal.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qwIvan/SMS-Notify/856710f83e8e9917678cb9929ee7b1bc1ca42a96/app/libs/additionnal.jar -------------------------------------------------------------------------------- /app/libs/mail.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qwIvan/SMS-Notify/856710f83e8e9917678cb9929ee7b1bc1ca42a96/app/libs/mail.jar -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /home/ivan/android-sdk-linux/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /app/src/androidTest/java/me/ivan/sms_notify/ApplicationTest.java: -------------------------------------------------------------------------------- 1 | package me.ivan.sms_notify; 2 | 3 | import android.app.Application; 4 | import android.test.ApplicationTestCase; 5 | 6 | /** 7 | * Testing Fundamentals 8 | */ 9 | public class ApplicationTest extends ApplicationTestCase { 10 | public ApplicationTest() { 11 | super(Application.class); 12 | } 13 | } -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /app/src/main/java/me/ivan/sms_notify/SMSNotifyApplication.java: -------------------------------------------------------------------------------- 1 | package me.ivan.sms_notify; 2 | 3 | import android.app.Application; 4 | import android.preference.PreferenceManager; 5 | 6 | /** 7 | * Created by ivan. 8 | */ 9 | public class SMSNotifyApplication extends Application { 10 | @Override 11 | public void onCreate() { 12 | super.onCreate(); 13 | PreferenceManager.setDefaultValues(this,R.xml.default_settings,false); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/me/ivan/sms_notify/activities/MainActivity.java: -------------------------------------------------------------------------------- 1 | package me.ivan.sms_notify.activities; 2 | 3 | import android.content.Intent; 4 | import android.content.SharedPreferences; 5 | import android.preference.PreferenceManager; 6 | import android.support.v7.app.AppCompatActivity; 7 | import android.os.Bundle; 8 | import android.view.Menu; 9 | import android.view.MenuInflater; 10 | import android.view.MenuItem; 11 | import android.view.View; 12 | import android.view.View.OnClickListener; 13 | import android.widget.Button; 14 | import android.widget.TextView; 15 | import android.widget.Toast; 16 | 17 | import me.ivan.sms_notify.R; 18 | 19 | public class MainActivity extends AppCompatActivity { 20 | 21 | private SharedPreferences sharedPreferences; 22 | private TextView to_email; 23 | private TextView tv_receiver; 24 | private String to; 25 | private String from; 26 | private String password; 27 | private Button on_off; 28 | //status 29 | private boolean listening; 30 | private boolean setup; 31 | 32 | @Override 33 | protected void onCreate(Bundle savedInstanceState) { 34 | super.onCreate(savedInstanceState); 35 | setContentView(R.layout.activity_main); 36 | 37 | init(); 38 | 39 | updateView(); 40 | 41 | listen(); 42 | 43 | } 44 | 45 | @Override 46 | protected void onResume() { 47 | super.onResume(); 48 | updateView(); 49 | } 50 | 51 | private void updateData() { 52 | to = sharedPreferences.getString("to", ""); 53 | from = sharedPreferences.getString("from", ""); 54 | password = sharedPreferences.getString("password", ""); 55 | setup = to.length()>0 && from.length()>0 && password.length()>0; 56 | listening = sharedPreferences.getBoolean("listening",false); 57 | } 58 | 59 | private void updateView() { 60 | updateData(); 61 | //update text view 62 | if (setup) { 63 | if (to_email != null) { 64 | to_email.setVisibility(View.VISIBLE); 65 | to_email.setText(to); 66 | } 67 | if (tv_receiver != null) { 68 | tv_receiver.setVisibility(View.VISIBLE); 69 | } 70 | } else { 71 | if (to_email != null) { 72 | to_email.setVisibility(View.GONE); 73 | } 74 | if (tv_receiver != null) { 75 | tv_receiver.setVisibility(View.GONE); 76 | } 77 | } 78 | //update button 79 | if (listening) { 80 | if (on_off != null) { 81 | on_off.setBackgroundResource(R.color.colorPrimaryDark); 82 | on_off.setText(R.string.stop_listen); 83 | } 84 | } else { 85 | if (on_off != null) { 86 | on_off.setBackgroundResource(R.color.colorPrimary); 87 | on_off.setText(R.string.start_listen); 88 | } 89 | } 90 | } 91 | 92 | private void init() { 93 | sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); 94 | to_email = (TextView) findViewById(R.id.to_email); 95 | tv_receiver = (TextView) findViewById(R.id.tv_email_receiver); 96 | on_off = (Button) findViewById(R.id.on_off); 97 | } 98 | 99 | private void listen() { 100 | OnClickListener listener_to_setting = new OnClickListener() { 101 | @Override 102 | public void onClick(View v) { 103 | goSetting(); 104 | } 105 | }; 106 | 107 | if (to_email != null) { 108 | to_email.setOnClickListener(listener_to_setting); 109 | } 110 | if (tv_receiver != null) { 111 | tv_receiver.setOnClickListener(listener_to_setting); 112 | } 113 | 114 | if (on_off != null) { 115 | on_off.setOnClickListener(new OnClickListener() { 116 | @Override 117 | public void onClick(View v) { 118 | updateData(); 119 | 120 | if (!setup) { 121 | goSetting(); 122 | return; 123 | } 124 | 125 | SharedPreferences.Editor edit = sharedPreferences.edit(); 126 | if (listening) { 127 | edit.putBoolean("listening", false); 128 | Toast.makeText(MainActivity.this,getString(R.string.stoped),Toast.LENGTH_SHORT).show(); 129 | } else { 130 | edit.putBoolean("listening",true); 131 | Toast.makeText(MainActivity.this,getString(R.string.started),Toast.LENGTH_SHORT).show(); 132 | } 133 | edit.apply(); 134 | 135 | updateView(); 136 | } 137 | }); 138 | } 139 | } 140 | 141 | @Override 142 | public boolean onCreateOptionsMenu(Menu menu) { 143 | MenuInflater inflater = getMenuInflater(); 144 | inflater.inflate(R.menu.main_menu,menu); 145 | return super.onCreateOptionsMenu(menu); 146 | } 147 | 148 | @Override 149 | public boolean onOptionsItemSelected(MenuItem item) { 150 | switch (item.getItemId()) { 151 | case R.id.setting: 152 | goSetting(); 153 | default: 154 | return super.onOptionsItemSelected(item); 155 | } 156 | } 157 | 158 | private void goSetting() { 159 | Intent intent = new Intent(this,SettingActivity.class); 160 | startActivity(intent); 161 | } 162 | 163 | } 164 | -------------------------------------------------------------------------------- /app/src/main/java/me/ivan/sms_notify/activities/SettingActivity.java: -------------------------------------------------------------------------------- 1 | package me.ivan.sms_notify.activities; 2 | 3 | import android.app.AlertDialog; 4 | import android.os.Bundle; 5 | import android.preference.PreferenceActivity; 6 | 7 | import me.ivan.sms_notify.R; 8 | 9 | /** 10 | * Created by ivan. 11 | */ 12 | public class SettingActivity extends PreferenceActivity { 13 | 14 | @Override 15 | protected void onCreate(Bundle savedInstanceState) { 16 | super.onCreate(savedInstanceState); 17 | addPreferencesFromResource(R.xml.default_settings); 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /app/src/main/java/me/ivan/sms_notify/receivers/MsgReceiver.java: -------------------------------------------------------------------------------- 1 | package me.ivan.sms_notify.receivers; 2 | 3 | import android.content.BroadcastReceiver; 4 | import android.content.Context; 5 | import android.content.Intent; 6 | import android.content.SharedPreferences; 7 | import android.os.AsyncTask; 8 | import android.preference.PreferenceManager; 9 | import android.telephony.SmsMessage; 10 | 11 | import javax.mail.MessagingException; 12 | 13 | import me.ivan.sms_notify.services.SMTPService; 14 | 15 | /** 16 | * Created by ivan. 17 | */ 18 | public class MsgReceiver extends BroadcastReceiver{ 19 | 20 | private SMTPService smtpService; 21 | private SharedPreferences sharedPreferences; 22 | 23 | @Override 24 | public void onReceive(Context context, Intent intent) { 25 | sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context); 26 | if (!sharedPreferences.getBoolean("listening", true)) { 27 | return; 28 | } 29 | 30 | Object[] messages = (Object[]) intent.getSerializableExtra("pdus"); 31 | if (messages!=null) { 32 | for (Object object:messages){ 33 | SmsMessage sms = SmsMessage.createFromPdu((byte[]) object); 34 | if (sms!=null) { 35 | String displayMessageBody = sms.getDisplayMessageBody(); 36 | String displayOriginatingAddress = sms.getDisplayOriginatingAddress(); 37 | // System.out.println(displayMessageBody); 38 | // Toast.makeText(context,displayMessageBody,Toast.LENGTH_LONG).show(); 39 | 40 | this.send(context, displayOriginatingAddress +"发来的短信:",displayMessageBody); 41 | } 42 | } 43 | } 44 | } 45 | 46 | private void send(Context context, final String title, final String content) { 47 | String from = sharedPreferences.getString("from", ""); 48 | String to = sharedPreferences.getString("to", ""); 49 | String password = sharedPreferences.getString("password", ""); 50 | String host = sharedPreferences.getString("host", "smtp.qq.com"); 51 | String port = sharedPreferences.getString("port","587"); 52 | boolean tls = sharedPreferences.getBoolean("tls", true); 53 | 54 | smtpService = new SMTPService(from,tls,host,Integer.valueOf(port),password,to); 55 | new AsyncTask() { 56 | @Override 57 | protected Void doInBackground(Void... params) { 58 | try { 59 | smtpService.send(title,content); 60 | } catch (MessagingException e) { 61 | e.printStackTrace(); 62 | //// TODO: 16-4-26 63 | } 64 | return null; 65 | } 66 | }.execute(); 67 | } 68 | 69 | } 70 | -------------------------------------------------------------------------------- /app/src/main/java/me/ivan/sms_notify/services/SMTPService.java: -------------------------------------------------------------------------------- 1 | package me.ivan.sms_notify.services; 2 | 3 | import java.util.Properties; 4 | 5 | import javax.mail.Message; 6 | import javax.mail.MessagingException; 7 | import javax.mail.PasswordAuthentication; 8 | import javax.mail.Session; 9 | import javax.mail.Transport; 10 | import javax.mail.internet.InternetAddress; 11 | import javax.mail.internet.MimeMessage; 12 | 13 | /** 14 | * Created by ivan on 16-4-25. 15 | */ 16 | public class SMTPService { 17 | 18 | private boolean tls; 19 | private String host; 20 | private int port; 21 | private String from; 22 | private String password; 23 | private String to; 24 | 25 | public SMTPService(String from, boolean tls, String host, 26 | int port, String password, String to) { 27 | this.from = from; 28 | this.tls = tls; 29 | this.host = host; 30 | this.port = port; 31 | this.password = password; 32 | this.to = to; 33 | } 34 | 35 | // public SMTPService(Context context) { 36 | // tls = sharedPreferences.getBoolean("tls",false); 37 | // host = sharedPreferences.getString("host","smtp.qq.com"); 38 | // port = sharedPreferences.getInt("port",587); 39 | // from = sharedPreferences.getString("from", ""); 40 | // password = sharedPreferences.getString("password", ""); 41 | // String to = sharedPreferences.getString("to",""); 42 | // } 43 | 44 | public void send(String title,String content) 45 | throws MessagingException { 46 | 47 | 48 | Properties properties = new Properties(); 49 | properties.put("mail.smtp.starttls.enable", String.valueOf(tls)); 50 | properties.put("mail.smtp.auth", "true"); 51 | properties.put("mail.smtp.host", host); 52 | properties.put("mail.smtp.port", port); 53 | 54 | Session session = Session.getInstance(properties, 55 | new javax.mail.Authenticator() { 56 | protected PasswordAuthentication getPasswordAuthentication() { 57 | return new PasswordAuthentication(from, password); 58 | } 59 | }); 60 | 61 | MimeMessage message = new MimeMessage(session); 62 | message.setFrom(new InternetAddress(from)); 63 | message.addRecipient(Message.RecipientType.TO, new InternetAddress(to)); 64 | message.setSubject(title); 65 | message.setText(content); 66 | 67 | Transport.send(message); 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_settings_white_18dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qwIvan/SMS-Notify/856710f83e8e9917678cb9929ee7b1bc1ca42a96/app/src/main/res/drawable-hdpi/ic_settings_white_18dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_settings_white_18dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qwIvan/SMS-Notify/856710f83e8e9917678cb9929ee7b1bc1ca42a96/app/src/main/res/drawable-mdpi/ic_settings_white_18dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_settings_white_18dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qwIvan/SMS-Notify/856710f83e8e9917678cb9929ee7b1bc1ca42a96/app/src/main/res/drawable-xhdpi/ic_settings_white_18dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_settings_white_18dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qwIvan/SMS-Notify/856710f83e8e9917678cb9929ee7b1bc1ca42a96/app/src/main/res/drawable-xxhdpi/ic_settings_white_18dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_settings_white_18dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qwIvan/SMS-Notify/856710f83e8e9917678cb9929ee7b1bc1ca42a96/app/src/main/res/drawable-xxxhdpi/ic_settings_white_18dp.png -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 |