我试图在Android中创建一个邮件发送应用程序。

如果我使用:

Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);

这将启动内置的Android应用程序;我试图发送邮件按钮点击直接不使用这个应用程序。


当前回答

GmailBackground是一个小型库,可以在后台发送电子邮件,无需用户交互:

用法:

    BackgroundMail.newBuilder(this)
            .withUsername("username@gmail.com")
            .withPassword("password12345")
            .withMailto("toemail@gmail.com")
            .withType(BackgroundMail.TYPE_PLAIN)
            .withSubject("this is the subject")
            .withBody("this is the body")
            .withOnSuccessCallback(new BackgroundMail.OnSuccessCallback() {
                @Override
                public void onSuccess() {
                    //do some magic
                }
            })
            .withOnFailCallback(new BackgroundMail.OnFailCallback() {
                @Override
                public void onFail() {
                    //do some magic
                }
            })
            .send();

配置:

repositories {
    // ...
    maven { url "https://jitpack.io" }
 }
 dependencies {
            compile 'com.github.yesidlazaro:GmailBackground:1.2.0'
    }

权限:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>

对于附件,你需要设置READ_EXTERNAL_STORAGE权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

(我自己测试过)

其他回答

这里有很多解决方案。然而,我认为我们必须改变GMail的配置,以允许从不太安全的设备访问。转到下面的链接并启用它。这对我很有用

https://myaccount.google.com/lesssecureapps?pli=1

我为其他需要帮助的人找到了一个更短的选择。代码是:

package com.example.mail;

import java.util.Properties;

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class SendMailTLS {

    public static void main(String[] args) {

        final String username = "username@gmail.com";
        final String password = "password";

        Properties props = new Properties();
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.smtp.host", "smtp.gmail.com");
        props.put("mail.smtp.port", "587");

        Session session = Session.getInstance(props,
          new javax.mail.Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(username, password);
            }
          });

        try {

            Message message = new MimeMessage(session);
            message.setFrom(new InternetAddress("from-email@gmail.com"));
            message.setRecipients(Message.RecipientType.TO,
                InternetAddress.parse("to-email@gmail.com"));
            message.setSubject("Testing Subject");
            message.setText("Dear Mail Crawler,"
                + "\n\n No spam to my email, please!");

            Transport.send(message);

            System.out.println("Done");

        } catch (MessagingException e) {
            throw new RuntimeException(e);
        }
    }
}

来源:通过JavaMail API发送电子邮件

希望这能有所帮助!好运!

SMTP

使用SMTP是一种方法,其他方法已经指出了如何做到这一点。请注意,在这样做的时候,您完全绕过了内置的邮件应用程序,并且必须提供SMTP服务器的地址、该服务器的用户名和密码,可以在代码中静态地提供,也可以从用户那里查询。

HTTP

另一种方法是使用一个简单的服务器端脚本,比如php,它接受一些URL参数并使用它们发送邮件。这样,您只需要从设备发出一个HTTP请求(使用内置库很容易实现),而不需要在设备上存储SMTP登录数据。与直接使用SMTP相比,这是一种更间接的方式,但由于从PHP发出HTTP请求和发送邮件非常容易,因此它甚至可能比直接方式更简单。

邮件应用程序

如果邮件将从用户已经在手机上注册的默认邮件帐户发送,则必须采用其他方法。如果你有足够的时间和经验,你可能想要检查Android Email应用程序的源代码,看看它是否提供了一些不需要用户交互就可以发送邮件的入口点(我不知道,但也许有一个)。

也许你甚至可以找到一种方法来查询用户的帐户详细信息(这样你就可以将它们用于SMTP),尽管我高度怀疑这是可能的,因为这将是一个巨大的安全风险,而Android是建立得相当安全。

我试着用@Vinayak B提交的代码。然而,我得到一个错误说:没有提供smtp

我在这里创建了一个新问题,提供了更多信息

我终于自己修好了。我得用另一个邮件罐 我必须确保我的“不太安全的应用程序访问权限”被打开。

我希望这能帮助那些有同样问题的人。这样做后,这段代码也可以在谷歌玻璃上工作。

为了帮助那些获得网络主线程异常与SDK目标>9。这是使用droopie的代码上面,但将类似于任何工作。

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();

StrictMode.setThreadPolicy(policy); 

android.os.NetworkOnMainThreadException

您可以如下所示使用AsyncTask

public void onClickMail(View view) {
    new SendEmailAsyncTask().execute();
}

class SendEmailAsyncTask extends AsyncTask <Void, Void, Boolean> {
    Mail m = new Mail("from@gmail.com", "my password");

    public SendEmailAsyncTask() {
        if (BuildConfig.DEBUG) Log.v(SendEmailAsyncTask.class.getName(), "SendEmailAsyncTask()");
        String[] toArr = { "to mail@gmail.com"};
        m.setTo(toArr);
        m.setFrom("from mail@gmail.com");
        m.setSubject("Email from Android");
        m.setBody("body.");
    }

    @Override
    protected Boolean doInBackground(Void... params) {
        if (BuildConfig.DEBUG) Log.v(SendEmailAsyncTask.class.getName(), "doInBackground()");
        try {
            m.send();
            return true;
        } catch (AuthenticationFailedException e) {
            Log.e(SendEmailAsyncTask.class.getName(), "Bad account details");
            e.printStackTrace();
            return false;
        } catch (MessagingException e) {
            Log.e(SendEmailAsyncTask.class.getName(), m.getTo(null) + "failed");
            e.printStackTrace();
            return false;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }