Android Studio使用JavaMail API发邮件提示用户名/密码错误求助
Android使用JavaMail API发送Gmail提示用户名/密码错误的解决方案
你用Android Studio结合JavaMail API实现邮件发送功能,发件人和收件人是同一个Gmail邮箱,但执行代码时日志提示用户名和/或密码错误,以下是针对性的排查和解决方法:
核心原因
Gmail目前限制第三方应用使用普通密码登录,主要是出于账户安全考虑,常见情况是:账户开启了两步验证,或者未开启对应权限允许第三方应用访问。
解决步骤
1. 应用专用密码(推荐,适用于开启两步验证的账户)
如果你的Gmail账户开启了两步验证,必须使用Google提供的应用专用密码替代普通密码:
- 登录你的Google账户,进入「安全」设置页面
- 找到「应用专用密码」选项,生成一个仅用于该Android应用的密码
- 将代码中
stringPasswordSenderEmail的值替换为这个生成的密码
2. 临时开启不太安全的应用访问(仅测试用,不推荐正式环境)
若未开启两步验证,可临时开启此选项让应用登录:
- 登录Google账户安全设置,找到「不太安全的应用访问」
- 开启该选项(注意:此操作会降低账户安全性,正式发布的应用不要使用)
3. 代码优化建议
你的代码配置基本正确,可补充以下配置确保SSL连接稳定:
// 在properties配置中添加 properties.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
4. 其他检查点
- 确认发件人邮箱地址拼写完全正确,Gmail不区分大小写,但代码中尽量保持一致
- 确认设备网络正常,能正常访问Gmail服务器
以下是你提供的代码:
MainActivity.java
import android.os.Bundle; import android.view.View; import java.util.Properties; import javax.mail.Authenticator; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void buttonSendEmail(View view){ try { String stringSenderEmail = "SenderEmail963@gmail.com"; String stringReceiverEmail = "receiveremail963@gmail.com"; String stringPasswordSenderEmail = "Test*123"; String stringHost = "smtp.gmail.com"; Properties properties = System.getProperties(); properties.put("mail.smtp.host", stringHost); properties.put("mail.smtp.port", "465"); properties.put("mail.smtp.ssl.enable", "true"); properties.put("mail.smtp.auth", "true"); javax.mail.Session session = Session.getInstance(properties, new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(stringSenderEmail, stringPasswordSenderEmail); } }); MimeMessage mimeMessage = new MimeMessage(session); mimeMessage.addRecipient(Message.RecipientType.TO, new InternetAddress(stringReceiverEmail)); mimeMessage.setSubject("Subject: Android App email"); mimeMessage.setText("Hello Programmer, \n\nProgrammer World has sent you this 2nd email. \n\n Cheers!\nProgrammer World"); Thread thread = new Thread(new Runnable() { @Override public void run() { try { Transport.send(mimeMessage); } catch (MessagingException e) { e.printStackTrace(); } } }); thread.start(); } catch (AddressException e) { e.printStackTrace(); } catch (MessagingException e) { e.printStackTrace(); } } }
build.gradle (Module level)
plugins { id 'com.android.application' } android { compileSdk 31 defaultConfig { applicationId "com.programmerworld.sendemailapp" minSdk 31 targetSdk 31 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } packagingOptions{ exclude 'META-INF/NOTICE.md' exclude 'META-INF/LICENSE.md' } } dependencies { implementation 'androidx.appcompat:appcompat:1.4.1' implementation 'com.google.android.material:material:1.5.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.3' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' implementation 'com.sun.mail:android-mail:1.6.6' implementation 'com.sun.mail:android-activation:1.6.7' }
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.programmerworld.sendemailapp"> <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/Theme.SendEmailApp"> <activity android:name=".MainActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.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=".MainActivity"> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="105dp" android:layout_marginTop="103dp" android:onClick="buttonSendEmail" android:text="Send Email" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>
内容的提问来源于stack exchange,提问作者wuad
相关产品推荐
相关产品推荐

