无需用户交互即可发送电子邮件 - Android Studio

时间:2015-04-21 18:56:13

标签: java android jar javamail gmail-api

动机:我正在创建注册活动,我需要在按钮单击下发送自动电子邮件。我已经关注了一些博客,stackoverflow问题以及迄今为止无法发送电子邮件。

工作环境:Android Studio 1.2 Beta 3

目前关注的问题: Sending Email in Android using JavaMail API without using the default/built-in app

现在我已完成的工作:

下载了三个Jar文件

  1. 的activation.jar
  2. additional.jar
  3. 的mail.jar
  4. 然后我在下面的文件夹中复制了三个jar文件:

    G:\ Android Projects \ Email \ app \ libs \

    复制文件后,我通过指向Android Studio中的“Project Explorer”找到我的.jar文件,然后将我的树视图从“Android”更改为“Project”

    然后展开树Project> app> libs>

    找到文件后;在我做的每个.jar文件上:右键单击 - >添加为库

    一旦完成了graddle构建,我就会复制上面的代码,然后问题并运行到我自己的项目中。编译没有任何错误。

    现在的问题是:

    当我运行程序时,它显示一个Toast消息“电子邮件已成功发送”,但我从未收到电子邮件,也没有在我的帐户中发送任何邮件。

    这是我所有类和.xml文件的所有代码

    MainActivity.java

    import android.app.Activity;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    import android.widget.Toast;
    
    public class MainActivity extends Activity {
    
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        Button send = (Button)findViewById(R.id.send_email);
        send.setOnClickListener(new View.OnClickListener() {
    
            public void onClick(View v) {
                // TODO Auto-generated method stub
    
                try {
                    GMailSender sender = new     GMailSender("ars@gmail.com", "123abc-123abc");
                    sender.sendMail("ARS",
                            "This is Body HEELO WORLD",
                            "ars@gmail.com",
                            "reciever@gmail.com");
                    Toast.makeText(MainActivity.this, "Email was sent successfully.", Toast.LENGTH_LONG).show();
                } catch (Exception e) {
                    Log.e("SendMail", e.getMessage(), e);
                    Toast.makeText(MainActivity.this, "There was a problem   sending the email.", Toast.LENGTH_LONG).show();
                }
    
            }
        });
    
    }
    }
    

    GMailSender.java

    package com.example.hassnainmunir.email;
    
    import javax.activation.DataHandler;
    import javax.activation.DataSource;
    import javax.mail.Message;
    import javax.mail.PasswordAuthentication;
    import javax.mail.Session;
    import javax.mail.Transport;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeMessage;
    import java.io.ByteArrayInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.security.Security;
    import java.util.Properties;
    
    class GMailSender extends javax.mail.Authenticator {
    private String mailhost = "smtp.gmail.com";
    private String user;
    private String password;
    private Session session;
    
    static {
        Security.addProvider(new JSSEProvider());
    }
    
    public GMailSender(String user, String password) {
        this.user = user;
        this.password = password;
    
        Properties props = new Properties();
        props.setProperty("mail.transport.protocol", "smtp");
        props.setProperty("mail.host", mailhost);
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.port", "465");
        props.put("mail.smtp.socketFactory.port", "465");
        props.put("mail.smtp.socketFactory.class",
                "javax.net.ssl.SSLSocketFactory");
        props.put("mail.smtp.socketFactory.fallback", "false");
        props.setProperty("mail.smtp.quitwait", "false");
    
        session = Session.getDefaultInstance(props, this);
    }
    
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(user, password);
    }
    
    public synchronized void sendMail(String subject, String body, String sender, String recipients) throws Exception {
        try{
            MimeMessage message = new MimeMessage(session);
            DataHandler handler = new DataHandler(new ByteArrayDataSource(body.getBytes(), "text/plain"));
            message.setSender(new InternetAddress(sender));
            message.setSubject(subject);
            message.setDataHandler(handler);
            if (recipients.indexOf(',') > 0)
                message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipients));
            else
                message.setRecipient(Message.RecipientType.TO, new InternetAddress(recipients));
            Transport.send(message);
        }catch(Exception e){
                e.printStackTrace();
        }
    }
    
    public class ByteArrayDataSource implements DataSource {
        private byte[] data;
        private String type;
    
        public ByteArrayDataSource(byte[] data, String type) {
            super();
            this.data = data;
            this.type = type;
        }
    
        public ByteArrayDataSource(byte[] data) {
            super();
            this.data = data;
        }
    
        public void setType(String type) {
            this.type = type;
        }
    
        public String getContentType() {
            if (type == null)
                return "application/octet-stream";
            else
                return type;
        }
    
        public InputStream getInputStream() throws IOException {
            return new ByteArrayInputStream(data);
        }
    
        public String getName() {
            return "ByteArrayDataSource";
        }
    
        public OutputStream getOutputStream() throws IOException {
            throw new IOException("Not Supported");
        }
    }
    }
    

    JSSEProvider.java

    package com.example.hassnainmunir.email;
    
    import java.security.AccessController;
    import java.security.Provider;
    
    public final class JSSEProvider extends Provider {
    
    public JSSEProvider() {
        super("HarmonyJSSE", 1.0, "Harmony JSSE Provider");
        AccessController.doPrivileged(new java.security.PrivilegedAction<Void>() {
            public Void run() {
                put("SSLContext.TLS",
                        "org.apache.harmony.xnet.provider.jsse.SSLContextImpl");
                put("Alg.Alias.SSLContext.TLSv1", "TLS");
                put("KeyManagerFactory.X509",
                        "org.apache.harmony.xnet.provider.jsse.KeyManagerFactoryImpl");
                put("TrustManagerFactory.X509",
                        "org.apache.harmony.xnet.provider.jsse.TrustManagerFactoryImpl");
                return null;
            }
        });
    }
    }
    

    activity_main.xml中

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <Button android:id="@+id/send_email"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/Send_Email" />
    </LinearLayout>
    

    AndroidMenifest.xml

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.hassnainmunir.email" >
    <uses-permission android:name="android.permission.INTERNET"/>
    
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
    
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
    
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    </manifest>
    

    的strings.xml

    <resources>
    <string name="app_name">Email</string>
    
    <string name="hello_world">Hello world!</string>
    <string name="action_settings">Settings</string>
    <string name="Send_Email">Send Email</string>
    </resources>
    

    的build.gradle

    apply plugin: 'com.android.application'
    
    android {
    compileSdkVersion 21
    buildToolsVersion "22.0.0"
    
    defaultConfig {
        applicationId "com.example.hassnainmunir.email"
        minSdkVersion 14
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    }
    
    dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:22.0.0'
    compile files('libs/activation.jar')
    }
    

    你能帮我辨别我做错了吗?

    因为我被困在那里已经三天了。并且无法收到电子邮件。

3 个答案:

答案 0 :(得分:4)

这不是你问题的答案,但我认为这可能会有所帮助

查看https://mandrillapp.com/api/docs/

我使用mandrill api在我的应用程序中发送电子邮件

首先,您在mandrill网站中创建帐户,然后填写电子邮件应包含的数据,如您在此链接中所看到的那样https://mandrillapp.com/api/docs/messages.html#method=send

然后执行包含你的json到这个uri的HTTP POST请求:https://mandrillapp.com/api/1.0/messages/send.json

实施

//**********Method to send email 
public void sendEmail(){ 
                new AsyncTask<Void, Void, Void>() {
                @Override
                protected void onPostExecute(Void result) {
                    Toast.makeText(MainActivity.this,
                            "Your message was sent successfully.",
                            Toast.LENGTH_SHORT).show();

                    super.onPostExecute(result);
                }

                @Override
                protected Void doInBackground(Void... params) {


                        String respond = POST(
                                URL,
                                makeMandrillRequest(fromEmail.getText()
                                        .toString(), toEmail.getText()
                                        .toString(), name.getText()
                                        .toString(), text.getText()
                                        .toString(), htmlText.getText()
                                        .toString()));
                        Log.d("respond is ", respond);


                    return null;
                }
            }.execute();
}

//*********method to post json to uri
    public String POST(String url , JSONObject jsonObject) {
    InputStream inputStream = null;
    String result = "";
    try {


        Log.d("internet json ", "In post Method");
        // 1. create HttpClient
        DefaultHttpClient httpclient = new DefaultHttpClient();
        // 2. make POST request to the given URL
        HttpPost httpPost = new HttpPost(url);
        String json = "";

        // 3. convert JSONObject to JSON to String
        json = jsonObject.toString();

        StringEntity se = new StringEntity(json);

        // 4. set httpPost Entity
        httpPost.setEntity(se);

        // 5. Set some headers to inform server about the type of the
        // content
        httpPost.setHeader("Accept", "application/json");
        httpPost.setHeader("Content-type", "application/json");

        // 6. Execute POST request to the given URL
        HttpResponse httpResponse = httpclient.execute(httpPost);

        // 7. receive response as inputStream
        inputStream = httpResponse.getEntity().getContent();

        // 8. convert inputstream to string
        if(inputStream != null){
            result = convertStreamToString(inputStream);
        }else{
            result = "Did not work!";
            Log.d("json", "Did not work!" );
        }
    } catch (Exception e) {
        Log.d("InputStream", e.toString());
    }

    // 9. return result
    return result;
}





//*****************TO create email json
     private JSONObject makeMandrillRequest(String from, String to, String name,
        String text, String htmlText) {

    JSONObject jsonObject = new JSONObject();
    JSONObject messageObj = new JSONObject();
    JSONArray toObjArray = new JSONArray();
    JSONArray imageObjArray = new JSONArray();
    JSONObject imageObjects = new JSONObject();
    JSONObject toObjects = new JSONObject();

    try {
        jsonObject.put("key", "********************");

        messageObj.put("html", htmlText);
        messageObj.put("text", text);
        messageObj.put("subject", "testSubject");
        messageObj.put("from_email", from);
        messageObj.put("from_name", name);

        messageObj.put("track_opens", true);
        messageObj.put("tarck_clicks", true);
        messageObj.put("auto_text", true);
        messageObj.put("url_strip_qs", true);
        messageObj.put("preserve_recipients", true);

        toObjects.put("email", to);
        toObjects.put("name", name);
        toObjects.put("type", "to");

        toObjArray.put(toObjects);

        messageObj.put("to", toObjArray);
        if (encodedImage != null) {
            imageObjects.put("type", "image/png");
            imageObjects.put("name", "IMAGE");
            imageObjects.put("content", encodedImage);

            imageObjArray.put(imageObjects);
            messageObj.put("images", imageObjArray);
        }

        jsonObject.put("message", messageObj);

        jsonObject.put("async", false);



        Log.d("Json object is ", " " + jsonObject);

    } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return jsonObject;
}

还要检查此library,它可以更容易实现。

答案 1 :(得分:1)

您的GMailSender.java代码中包含这些common JavaMail mistakes

确保您使用latest version of JavaMail

您不需要ByteArrayDataSource,因为JavaMail includes it

要了解您的消息发生了什么,将有助于启用JavaMail Session debugging。调试输出可能会提供一些线索。

但实际上,您应该考虑从客户端应用程序发送电子邮件是否正确。如果您的客户端应用程序正在与您的网站进行某种&#34;注册活动&#34;进行交互,那么由于服务器上的活动而发送电子邮件会好得多。要在客户端上执行此操作,您需要将Gmail帐户的密码硬连接到客户端,或者您需要向应用程序用户询问其Gmail帐户和密码。

答案 2 :(得分:1)

我认为你需要做两件事:  1.在异步任务中添加所有网络代码,因为android支持单线程模型。如果您直接在主ui线程上运行您的发送电子邮件,可能会冻结您的应用程序。  2.您可以使用检查gmail设置来启用安全性。这样你就可以从app收到它。如果您有兴趣使用java库发送电子邮件,请按照以下链接.. http://www.javatpoint.com/java-mail-api-tutorial