Java 在没有用户交互的情况下发送电子邮件 - Android Studio

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/29780833/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-11 08:35:58  来源:igfitidea点击:

Sending email without user Interaction - Android Studio

javaandroidjarjavamailgmail-api

提问by Hassnain

Motivation: I am Creating a Signup Activity and I need to send an Automatic email under Button Click. I have Followed number of Blogs, stackoverflow questions and unable to send an email so-far.

动机:我正在创建一个注册活动,我需要在按钮单击下发送一封自动电子邮件。到目前为止,我已经关注了许多博客、stackoverflow 问题并且无法发送电子邮件。

Working Environment:Android Studio 1.2 Beta 3

工作环境:Android Studio 1.2 Beta 3

Currently Followed Question :Sending Email in Android using JavaMail API without using the default/built-in app

当前关注的问题:使用 JavaMail API 在 Android 中发送电子邮件而不使用默认/内置应用程序

Now Here is What I have Done :

现在这是我所做的:

Downloaded three Jar Files

下载了三个 Jar 文件

  1. activation.jar
  2. additional.jar
  3. mail.jar
  1. 激活文件
  2. 附加文件
  3. 邮件文件

Then i copied three jar files in follwoing folder:

然后我在以下文件夹中复制了三个 jar 文件:

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

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

After Copying files i found my .jar files by pointing into "Project Explorer" in Android Studio and then changing my tree view from "Android" to "Project"

复制文件后,我通过指向 Android Studio 中的“项目资源管理器”找到我的 .jar 文件,然后将我的树视图从“Android”更改为“项目”

Then expanding the tree Project > app > libs >

然后展开树 Project > app > libs >

After finding files; on each .jar file I did: Right click -> Add as Library

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

Once the graddle build was completed I then copied the code from above followed Question and run into my own project. It compiled without any errors.

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

Now the Problem is :

现在的问题是:

When i run a program it shows a toast Message "Email was Sent Successfully" but I never receive an email, Nor there is any sent mails in my account.

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

Here is all my code for all classes and .xml files

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

MainActivity.java

主活动.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("[email protected]", "123abc-123abc");
                sender.sendMail("ARS",
                        "This is Body HEELO WORLD",
                        "[email protected]",
                        "[email protected]");
                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

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

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

活动_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

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

字符串.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

构建.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')
}

Can you please Help me in identifying where i am doing Wrong.

你能帮我找出我做错的地方吗?

Because its been three days i am stuck in there. And unable to receive an email.

因为已经三天了,我被困在那里。而且收不到邮件。

采纳答案by Soroush

it's not the answer of your question , but i think it could be helpful

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

check this out https://mandrillapp.com/api/docs/

看看这个https://mandrillapp.com/api/docs/

i use mandrill api to send email in my application

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

first of all you create account in mandrill site then you fill data that email should contain in json format like what you see in this link https://mandrillapp.com/api/docs/messages.html#method=send

首先,您在 mandrill 站点中创建帐户,然后以 json 格式填写电子邮件应包含的数据,就像您在此链接中看到的内容https://mandrillapp.com/api/docs/messages.html#method=send

and after that excute HTTP POST requests that contain your json to this uri : https://mandrillapp.com/api/1.0/messages/send.json

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

implementation

执行

//**********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;
}

also check this library, it could make it easier to implement .

也检查这个,它可以使它更容易实现。

回答by Bill Shannon

Your GMailSender.java code is full of these common JavaMail mistakes.

您的 GMailSender.java 代码充满了这些常见的 JavaMail 错误

Make sure you're using the latest version of JavaMail.

确保您使用的是最新版本的 JavaMail

You don't need ByteArrayDataSource because JavaMail includes it.

您不需要 ByteArrayDataSource 因为JavaMail 包含它

To find out what's happening to your message, it would help to enable JavaMail Session debugging. The debug output might provide some clues.

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

But really, you should think about whether sending the email from your client application is the right approach. If your client application is interacting with your web site for some sort of "signup activity", it would be far better for the email to be sent as a result of the activity on the server. To do this on the client you either need to hardwire the password for your Gmail account into the client, or you need to ask the user of the app for their Gmail account and password.

但实际上,您应该考虑从您的客户端应用程序发送电子邮件是否是正确的方法。如果您的客户端应用程序正在与您的网站交互以进行某种“注册活动”,那么将电子邮件作为服务器上活动的结果发送会更好。要在客户端上执行此操作,您需要将 Gmail 帐户的密码硬连接到客户端,或者您需要向应用程序用户询问他们的 Gmail 帐户和密码。

回答by Ashutosh Srivastava

I think you need to do two things: 1. Add your all network code in async task because android support single thread model. SO if you directly run your sending email on main ui thread that may freeze your app. 2. You can use check your gmail setting where you can enable your security. So that you can receive it from app. Please follow the below links if you are interested in using java libs for sending email.. http://www.javatpoint.com/java-mail-api-tutorial

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