【问题标题】:Sending email without user Interaction - Android Studio在没有用户交互的情况下发送电子邮件 - Android Studio
【发布时间】:2015-06-29 02:57:36
【问题描述】:

动机:我正在创建一个注册活动,我需要在按钮点击下发送一封自动电子邮件。到目前为止,我已经关注了许多博客、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. 附加.jar
  3. mail.jar

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

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

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

然后展开树 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>

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

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

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

【问题讨论】:

  • 我不太确定问题出在哪里,但请注意,您永远不应该在应用程序中硬编码密码。我不确定你是否打算这样做,但只是让你知道人们很容易找到这些东西。
  • 我添加了一个后续问题链接,代码是相同的,并且对那里提到的许多人都有效。问题可能在于在 android studio 中添加 .jar 文件。如果你认为问题就在那里。你能不能纠正一下。但如果问题是其他事情。请也帮助我。我很想解决这个问题:(
  • 你的 jar 文件应该是正确的,否则如果它们丢失,它不应该编译。如果您希望验证,您可以发布您的应用模块 build.gradle 文件。
  • 我也在我的问题中添加了 build.gradle。如果我的 .jar 是正确的,请验证它
  • 我还尝试发布我如何添加 .jar 文件的屏幕截图。但是 stackoverflow 不允许发布低于 10 点声誉的图像。 :(

标签: java android jar jakarta-mail gmail-api


【解决方案1】:

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

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

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

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

然后将包含您的 json 的 HTTP POST 请求执行到此 uri: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,它可以更容易实现。

【讨论】:

  • 如果你能告诉我任何教程视频链接等会很可爱;在android studio中做到这一点。因为我是一个绝对的初学者。
  • Mandrill 是否提供支持在 Android Studio 中使用?
  • @hunny Android studio 只是 IDE,mandrill 为您提供了一个 API,您可以将您的请求从 android、php、python 和其他任何东西发送给它 :)
  • @hunny20006 我编辑了我的答案以向您展示如何实现这一点,如果它对您有帮助,请投票,如果它也解决了您的问题,请标记我接受的答案:)
  • 好吧,让我处理它.. 如果它对我有用......但请告诉我.. 它是否需要任何进口?还是我应该使用您的代码进行修改?
【解决方案2】:

您的 GMailSender.java 代码中充满了这些common JavaMail mistakes

确保您使用的是latest version of JavaMail

你不需要 ByteArrayDataSource 因为JavaMail includes it

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

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

【讨论】:

  • 你能指出我代码中的错误行吗?我没有这个应用程序的网站。而且我真的只需要通过应用程序向客户发送电子邮件。
  • 我已从问题中提供的链接中获取代码。并且正在为许多人工作。我害怕这样的事实。我没有对其进行任何更改。它仍然没有发送电子邮件。 :(
  • 对不起,我不会为你写代码。还有更多sample code on the JavaMail web siteJavaMail FAQ。如果没有看到 JavaMail 调试,很难判断问题出在您的代码中还是其他原因。
  • 我不是说要为我编写代码。我已经将代码发布在上面的代码中。我在这里唯一的任务是找出错误。就调试而言,它没有发现任何错误。
【解决方案3】:

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

【讨论】:

  • 感谢您的回答,但 mandrill 是一种更好、更简单的电子邮件发送方式。顺便说一句,这篇文章已在一年前得到答复:)
猜你喜欢
  • 1970-01-01
  • 2011-11-01
  • 2015-01-03
  • 1970-01-01
  • 2015-06-24
  • 2014-01-01
  • 1970-01-01
  • 2011-10-16
  • 1970-01-01
相关资源
最近更新 更多