我一直在尝试使用适用于Android的java mail api发送电子邮件一段时间了。我已经在互联网上尝试了几个代码,但是当apk在移动设备上运行时,仍然不断收到相同的错误消息,上面写着"appName不幸停止"。我是安卓新手,如果有人能在这个平台上帮助我,我会很高兴。我也在使用安卓工作室作为我的IDE。
谢谢 下面是我的 XML 的代码
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.rollxreuben.mailing.MainActivity">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btn"
android:text="Send Mail"
android:gravity="center_horizontal"
/>
</android.support.constraint.ConstraintLayout>
下面是 java 类的代码
package com.example.rollxreuben.mailing;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import java.util.Properties;
import javax.mail.Authenticator;
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;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button btn;
Session session = null;
ProgressDialog pDialog = null;
Context context = null;
String rec, receipt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
context = this;
btn = (Button)findViewById(R.id.btn);
btn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
Properties props = new Properties();
props.put("mail.smtp.port","smtp.gmail.com");
props.put("mail.smtp.socketFactory.port", "465");
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.socketFactory.port", "465");
session = Session.getDefaultInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("email@gmail.com","PASSWORD");
}
});
pDialog = ProgressDialog.show(context,"","Sending Mail",true);
SendMail sendMail = new SendMail();
sendMail.execute();
}
}
发送邮件类:
private class SendMail extends AsyncTask<String, Void, String> {
private ProgressDialog progressDialog;
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog = ProgressDialog.show(MainActivity.this, "Please wait", "Sending mail", true, false);
}
@Override
protected void onPostExecute(String aVoid) {
progressDialog.dismiss();
Toast.makeText(MainActivity.this, "Email was sent successfully.", Toast.LENGTH_LONG).show();
super.onPostExecute(aVoid);
}
protected String doInBackground(String... params) {
try {
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress("busben97@gmail.com"));
message.setRecipients(Message.RecipientType.TO,InternetAddress.parse("busben97@gmail.com"));
message.setSubject("Testing Mail");
message.setContent("Hello ","text/html; charset=utf-8");
Transport.send(message);
} catch(Exception e) {
Toast.makeText(MainActivity.this,e.toString(),Toast.LENGTH_LONG).show();
}
return null;
}
}
}
最后这是我的清单:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.rollxreuben.mailing">
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
//This is the log file
07-05 17:00:37.129 4376-4376/? I/art: Not late-enabling -Xcheck:jni (already on)
07-05 17:00:37.129 4376-4376/? W/art: Unexpected CPU variant for X86 using defaults: x86
07-05 17:00:38.381 4376-4376/com.example.rollxreuben.mailing W/System: ClassLoader referenced unknown path: /data/app/com.example.rollxreuben.mailing-2/lib/x86
07-05 17:00:38.389 4376-4376/com.example.rollxreuben.mailing I/InstantRun: starting instant run server: is main process
07-05 17:00:38.446 4376-4376/com.example.rollxreuben.mailing W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable
07-05 17:00:39.785 4376-4402/com.example.rollxreuben.mailing I/OpenGLRenderer: Initialized EGL, version 1.4
07-05 17:00:39.785 4376-4402/com.example.rollxreuben.mailing D/OpenGLRenderer: Swap behavior 1
07-05 17:00:40.838 4376-4376/com.example.rollxreuben.mailing W/art: Before Android 4.1, method int android.support.v7.widget.ListViewCompat.lookForSelectablePosition(int, boolean) would have incorrectly overridden the package-private method in android.widget.ListView
07-05 17:00:40.848 4376-4376/com.example.rollxreuben.mailing I/Choreographer: Skipped 96 frames! The application may be doing too much work on its main thread.
07-05 17:00:44.293 4376-4376/com.example.rollxreuben.mailing I/Choreographer: Skipped 206 frames! The application may be doing too much work on its main thread.
07-05 17:01:17.648 4376-4939/com.example.rollxreuben.mailing W/art: Verification of java.lang.String javax.mail.internet.MimeUtility.encodeWord(java.lang.String, java.lang.String, java.lang.String, boolean) took 105.438ms
07-05 17:01:17.752 4376-4939/com.example.rollxreuben.mailing E/Exception: For input string: "smtp.gmail.com"
java.lang.NumberFormatException: For input string: "smtp.gmail.com"
at java.lang.Integer.parseInt(Integer.java:521)
at java.lang.Integer.parseInt(Integer.java:556)
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:398)
at javax.mail.Service.connect(Service.java:310)
at javax.mail.Service.connect(Service.java:169)
at javax.mail.Service.connect(Service.java:118)
at javax.mail.Transport.send0(Transport.java:188)
at javax.mail.Transport.send(Transport.java:118)
at com.example.rollxreuben.mailing.MainActivity$SendMail.doInBackground(MainActivity.java:93)
at com.example.rollxreuben.mailing.MainActivity$SendMail.doInBackground(MainActivity.java:66)
at android.os.AsyncTask$2.call(AsyncTask.java:305)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
at java.lang.Thread.run(Thread.java:761)
07-05 17:01:18.733 4376-4376/com.example.rollxreuben.mailing I/Choreographer: Skipped 71 frames! The application may be doing too much work on its main thread.
07-05 17:01:20.603 4376-4376/com.example.rollxreuben.mailing I/Choreographer: Skipped 111 frames! The application may be doing too much work on its main thread.
java.lang.NumberFormatException: 对于输入字符串:"smtp.gmail.com">
该错误是由非数值smtp.gmail.com
parseInt()
引起的
这是由这条线引起的props.put("mail.smtp.port","smtp.gmail.com");
port 应该是您要传递主机地址的数字,要么更改密钥mail.smtp.port
,要么更改值smtp.gmail.com
。