提问人:are_flour 提问时间:6/13/2023 最后编辑:Younes Charfaouiare_flour 更新时间:6/13/2023 访问量:758
在 Kotlin 中从 android 发送电子邮件
Sending an email from an android in Kotlin
问:
每当我打开包含此代码的页面时,我的应用程序都会崩溃
class MainActivity2 : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main2)
val button1: Button = findViewById(R.id.button1)
button1.setOnClickListener {
Toast.makeText(this, "Button 1 Clicked!", Toast.LENGTH_SHORT).show()}
main(arrayOf("[email protected]","password1","[email protected]","[email protected]", "[email protected]"))
}
fun main(args: Array<String>) {
val userName = args[0]
val password = args[1]
val emailFrom = args[2]
val emailTo = args[3]
val emailCC = args[4]
val subject = "SMTP Test"
val text = "Hello Kotlin Mail"
val props = Properties()
putIfMissing(props, "mail.smtp.host", "smtp.office365.com")
putIfMissing(props, "mail.smtp.port", "587")
putIfMissing(props, "mail.smtp.auth", "true")
putIfMissing(props, "mail.smtp.starttls.enable", "true")
val session = Session.getDefaultInstance(props, object : javax.mail.Authenticator() {
override fun getPasswordAuthentication(): PasswordAuthentication {
return PasswordAuthentication(userName, password)
}
})
session.debug = true
try {
val mimeMessage = MimeMessage(session)
mimeMessage.setFrom(InternetAddress(emailFrom))
mimeMessage.setRecipients(Message.RecipientType.TO, InternetAddress.parse(emailTo, false))
mimeMessage.setRecipients(Message.RecipientType.CC, InternetAddress.parse(emailCC, false))
mimeMessage.setText(text)
mimeMessage.subject = subject
mimeMessage.sentDate = Date()
val smtpTransport = session.getTransport("smtp")
smtpTransport.connect()
smtpTransport.sendMessage(mimeMessage, mimeMessage.allRecipients)
smtpTransport.close()
} catch (messagingException: MessagingException) {
messagingException.printStackTrace()
}
}
private fun putIfMissing(props: Properties, key: String, value: String) {
if (!props.containsKey(key)) {
props[key] = value
}
}
}
尝试在 kotlin 中制作一个能够在不打开电子邮件应用程序的情况下发送电子邮件的应用程序,上面是我的代码。每当我在应用程序中转到此页面时,它都会崩溃,我不知道该怎么做,有什么想法吗?目标是在没有用户交互的情况下自动发送电子邮件,他们会输入一次他们的信息,然后他们所要做的就是点击发送,它将生成日期和时间等信息,然后它将根据先前输入的信息发送。
这是 logcat 提供的错误堆栈跟踪:
---------------------------- PROCESS STARTED (17141) for package com.example.myapplication ----------------------------
2023-06-12 14:46:20.090 17141-17141 ziparchive com.example.myapplication W Unable to open '/data/data/com.example.myapplication/code_cache/.overlay/base.apk/classes3.dm': No such file or directory
2023-06-12 14:46:20.098 17141-17141 ziparchive com.example.myapplication W Unable to open '/data/app/~~ElgGTbi-0GuD4FTf5MgSLg==/com.example.myapplication-D5fAv_4aBc46ggVTmpQXYg==/base.dm': No such file or directory
2023-06-12 14:46:20.102 17141-17141 ziparchive com.example.myapplication W Unable to open '/data/app/~~ElgGTbi-0GuD4FTf5MgSLg==/com.example.myapplication-D5fAv_4aBc46ggVTmpQXYg==/base.dm': No such file or directory
2023-06-12 14:46:20.586 17141-17141 nativeloader com.example.myapplication D Configuring clns-6 for other apk /data/app/~~ElgGTbi-0GuD4FTf5MgSLg==/com.example.myapplication-D5fAv_4aBc46ggVTmpQXYg==/base.apk. target_sdk_version=33, uses_libraries=, library_path=/data/app/~~ElgGTbi-0GuD4FTf5MgSLg==/com.example.myapplication-D5fAv_4aBc46ggVTmpQXYg==/lib/x86_64, permitted_path=/data:/mnt/expand:/data/user/0/com.example.myapplication
2023-06-12 14:46:20.663 17141-17141 GraphicsEnvironment com.example.myapplication V Currently set values for:
2023-06-12 14:46:20.665 17141-17141 GraphicsEnvironment com.example.myapplication V angle_gl_driver_selection_pkgs=[]
2023-06-12 14:46:20.666 17141-17141 GraphicsEnvironment com.example.myapplication V angle_gl_driver_selection_values=[]
2023-06-12 14:46:20.668 17141-17141 GraphicsEnvironment com.example.myapplication V ANGLE GameManagerService for com.example.myapplication: false
2023-06-12 14:46:20.670 17141-17141 GraphicsEnvironment com.example.myapplication V com.example.myapplication is not listed in per-application setting
2023-06-12 14:46:20.671 17141-17141 GraphicsEnvironment com.example.myapplication V Neither updatable production driver nor prerelease driver is supported.
2023-06-12 14:46:21.063 17141-17173 libEGL com.example.myapplication D loaded /vendor/lib64/egl/libEGL_emulation.so
2023-06-12 14:46:21.076 17141-17173 libEGL com.example.myapplication D loaded /vendor/lib64/egl/libGLESv1_CM_emulation.so
2023-06-12 14:46:21.115 17141-17173 libEGL com.example.myapplication D loaded /vendor/lib64/egl/libGLESv2_emulation.so
2023-06-12 14:46:21.416 17141-17141 AppCompatDelegate com.example.myapplication D Checking for metadata for AppLocalesMetadataHolderService : Service not found
2023-06-12 14:46:21.821 17141-17141 e.myapplication com.example.myapplication W Accessing hidden method Landroid/view/View;->computeFitSystemWindows(Landroid/graphics/Rect;Landroid/graphics/Rect;)Z (unsupported, reflection, allowed)
2023-06-12 14:46:21.826 17141-17141 e.myapplication com.example.myapplication W Accessing hidden method Landroid/view/ViewGroup;->makeOptionalFitsSystemWindows()V (unsupported, reflection, allowed)
2023-06-12 14:46:22.230 17141-17141 Compatibil...geReporter com.example.myapplication D Compat change id reported: 210923482; UID 10184; state: ENABLED
2023-06-12 14:46:22.783 17141-17141 Compatibil...geReporter com.example.myapplication D Compat change id reported: 237531167; UID 10184; state: DISABLED
2023-06-12 14:46:22.787 17141-17141 OpenGLRenderer com.example.myapplication W Unknown dataspace 0
2023-06-12 14:46:22.916 17141-17171 OpenGLRenderer com.example.myapplication W Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without...
2023-06-12 14:46:22.918 17141-17141 AutofillManager com.example.myapplication D notifyViewEnteredForFillDialog:1073741824
2023-06-12 14:46:22.921 17141-17171 OpenGLRenderer com.example.myapplication W Failed to initialize 101010-2 format, error = EGL_SUCCESS
2023-06-12 14:46:22.924 17141-17141 AutofillManager com.example.myapplication D Triggering pre-emptive request for fill dialog.
2023-06-12 14:46:22.949 17141-17141 AutofillManager com.example.myapplication D notifyViewEnteredForFillDialog:1073741825
2023-06-12 14:46:23.559 17141-17171 Gralloc4 com.example.myapplication I mapper 4.x is not supported
2023-06-12 14:46:23.616 17141-17171 OpenGLRenderer com.example.myapplication E Unable to match the desired swap behavior.
2023-06-12 14:46:23.846 17141-17141 Choreographer com.example.myapplication I Skipped 61 frames! The application may be doing too much work on its main thread.
2023-06-12 14:46:23.875 17141-17141 Compatibil...geReporter com.example.myapplication D Compat change id reported: 163400105; UID 10184; state: ENABLED
2023-06-12 14:46:23.877 17141-17177 OpenGLRenderer com.example.myapplication I Davey! duration=1035ms; Flags=1, FrameTimelineVsyncId=126882, IntendedVsync=8948596577142, Vsync=8948596577142, InputEventId=0, HandleInputStart=8948603131000, AnimationStart=8948603283200, PerformTraversalsStart=8948603452900, DrawStart=8949415107000, FrameDeadline=8948613243808, FrameInterval=8948602987400, FrameStartTime=16666666, SyncQueued=8949456775900, SyncStart=8949458121900, IssueDrawCommandsStart=8949461528900, SwapBuffers=8949627627500, FrameCompleted=8949633292400, DequeueBufferDuration=193600, QueueBufferDuration=2014400, GpuCompleted=8949631385600, SwapBuffersCompleted=8949633292400, DisplayPresentTime=0, CommandSubmissionCompleted=8949627627500,
2023-06-12 14:46:23.906 17141-17141 AssistStructure com.example.myapplication I Flattened final assist data: 1820 bytes, containing 1 windows, 9 views
2023-06-12 14:46:25.461 17141-17171 EGL_emulation com.example.myapplication D app_time_stats: avg=268.99ms min=26.57ms max=1325.92ms count=6
2023-06-12 14:46:26.087 17141-17141 System.out com.example.myapplication I DEBUG: setDebug: JavaMail version 1.6.0
2023-06-12 14:46:26.350 17141-17141 System.out com.example.myapplication I DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle]
2023-06-12 14:46:26.414 17141-17141 AndroidRuntime com.example.myapplication D Shutting down VM
2023-06-12 14:46:26.430 17141-17141 AndroidRuntime com.example.myapplication E FATAL EXCEPTION: main
Process: com.example.myapplication, PID: 17141
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.myapplication/com.example.myapplication.MainActivity2}: android.os.NetworkOnMainThreadException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3782)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3922)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:139)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:96)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2443)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loopOnce(Looper.java:205)
at android.os.Looper.loop(Looper.java:294)
at android.app.ActivityThread.main(ActivityThread.java:8176)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:971)
Caused by: android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1675)
at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:115)
at java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:103)
at java.net.InetAddress.getByName(InetAddress.java:1106)
at javax.mail.URLName.getHostAddress(URLName.java:520)
at javax.mail.URLName.hashCode(URLName.java:496)
at java.util.Hashtable.get(Hashtable.java:383)
at javax.mail.Session.getPasswordAuthentication(Session.java:889)
at javax.mail.Service.connect(Service.java:349)
at javax.mail.Service.connect(Service.java:246)
at javax.mail.Service.connect(Service.java:195)
at com.example.myapplication.MainActivity2.main(MainActivity2.kt:87)
at com.example.myapplication.MainActivity2.onCreate(MainActivity2.kt:24)
at android.app.Activity.performCreate(Activity.java:8595)
at android.app.Activity.performCreate(Activity.java:8573)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1456)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3764)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3922)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:139)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:96)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2443)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loopOnce(Looper.java:205)
at android.os.Looper.loop(Looper.java:294)
at android.app.ActivityThread.main(ActivityThread.java:8176)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:971)
2023-06-12 14:46:26.487 17141-17171 EGL_emulation com.example.myapplication D app_time_stats: avg=19.01ms min=7.05ms max=67.51ms count=32
2023-06-12 14:46:26.550 17141-17141 Process com.example.myapplication I Sending signal. PID: 17141 SIG: 9
---------------------------- PROCESS ENDED (17141) for package com.example.myapplication ----------------------------
答:
1赞
JustSightseeing
6/13/2023
#1
好吧,从例外:
java.lang.RuntimeException:无法启动 Activity ComponentInfo{com.example.myapplication/com.example.myapplication.MainActivity2}:android.os.NetworkOnMainThreadException
基本上,您不能在主 (UI) 线程上执行网络操作,这是一个防止应用程序来自 ANR 的策略(应用程序无响应,如果应用程序在 5 秒内没有响应用户交互,android 将关闭应用程序!),您应该在不同的线程中处理网络“东西”,这使用户体验更好(如果应用程序只是......按下按钮后停止了一段时间)
这个问题已经在许多帖子中介绍过,比如这篇文章,但是:
要解决您的问题,您可以:
- 覆盖此规则(BAD WAY,可能会导致崩溃)
- 使用可运行的网络请求或将网络请求分开到使用 viewModelScope 的 viewModel 函数
此外,请确保 AppManifest 包含:
<uses-permission android:name="android.permission.INTERNET"/>
评论
0赞
are_flour
6/13/2023
所以你是说我可以做这样的事情吗?class MainActivity2 : AppCompatActivity() { ... } fun sendEmail(args: Array<String>) { run{ ... } } 和 itd 工作吗?对不起,格式错误,idk该怎么做
0赞
JustSightseeing
6/13/2023
不,这仍然会让它在主线程中运行,如果你真的对 viewModel、scopes、runables 和线程一无所知,你可以使用 GlobalScope(不推荐,但它可能会起作用)你可以包装网络操作,它应该不会崩溃(希望)GlobalScope.launch(Dispatchers.IO) {/*put your operation here (in your case, probably the try...catch block) */ }
0赞
are_flour
6/14/2023
我以后可以了解更多关于这些东西的信息,现在我希望它运行。我把它放在全局范围内,它现在没有崩溃,但它也没有发送任何东西。有什么想法吗?谢谢你的帮助
0赞
JustSightseeing
6/14/2023
您可以检查日志中的日志
0赞
are_flour
6/14/2023
是的,它说身份验证失败,但我知道这是正确的信息。我也只是有一个想法,双因素身份验证是否意味着这不起作用?javax.mail.AuthenticationFailed异常:535 5.7.3
评论