我试图在Android中创建一个邮件发送应用程序。
如果我使用:
Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
这将启动内置的Android应用程序;我试图发送邮件按钮点击直接不使用这个应用程序。
我试图在Android中创建一个邮件发送应用程序。
如果我使用:
Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
这将启动内置的Android应用程序;我试图发送邮件按钮点击直接不使用这个应用程序。
当前回答
为了帮助那些获得网络主线程异常与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;
}
}
其他回答
SMTP
使用SMTP是一种方法,其他方法已经指出了如何做到这一点。请注意,在这样做的时候,您完全绕过了内置的邮件应用程序,并且必须提供SMTP服务器的地址、该服务器的用户名和密码,可以在代码中静态地提供,也可以从用户那里查询。
HTTP
另一种方法是使用一个简单的服务器端脚本,比如php,它接受一些URL参数并使用它们发送邮件。这样,您只需要从设备发出一个HTTP请求(使用内置库很容易实现),而不需要在设备上存储SMTP登录数据。与直接使用SMTP相比,这是一种更间接的方式,但由于从PHP发出HTTP请求和发送邮件非常容易,因此它甚至可能比直接方式更简单。
邮件应用程序
如果邮件将从用户已经在手机上注册的默认邮件帐户发送,则必须采用其他方法。如果你有足够的时间和经验,你可能想要检查Android Email应用程序的源代码,看看它是否提供了一些不需要用户交互就可以发送邮件的入口点(我不知道,但也许有一个)。
也许你甚至可以找到一种方法来查询用户的帐户详细信息(这样你就可以将它们用于SMTP),尽管我高度怀疑这是可能的,因为这将是一个巨大的安全风险,而Android是建立得相当安全。
这里有很多解决方案。然而,我认为我们必须改变GMail的配置,以允许从不太安全的设备访问。转到下面的链接并启用它。这对我很有用
https://myaccount.google.com/lesssecureapps?pli=1
我试着用@Vinayak B提交的代码。然而,我得到一个错误说:没有提供smtp
我在这里创建了一个新问题,提供了更多信息
我终于自己修好了。我得用另一个邮件罐 我必须确保我的“不太安全的应用程序访问权限”被打开。
我希望这能帮助那些有同样问题的人。这样做后,这段代码也可以在谷歌玻璃上工作。
无法连接到SMTP主机: Smtp.gmail.com,端口:465
在清单中添加这一行:
<uses-permission android:name="android.permission.INTERNET" />
为了帮助那些获得网络主线程异常与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;
}
}