升级:android-mail升级为jakarta.mail

新增:添加iCloud邮箱支持 #541
This commit is contained in:
pppscn 2024-11-15 14:27:26 +08:00
parent b05d856f26
commit f029048d09
7 changed files with 53 additions and 38 deletions

View File

@ -346,9 +346,10 @@ dependencies {
//https://github.com/getActivity/MultiLanguages //https://github.com/getActivity/MultiLanguages
implementation 'com.github.getActivity:MultiLanguages:b47f7be' //9.3 implementation 'com.github.getActivity:MultiLanguages:b47f7be' //9.3
def mail_version = '1.6.7' // https://jakartaee.github.io/mail-api/Android
implementation "com.sun.mail:android-mail:$mail_version" def mail_version = '2.0.1'
implementation "com.sun.mail:android-activation:$mail_version" implementation "com.sun.mail:jakarta.mail:$mail_version"
implementation "com.sun.activation:jakarta.activation:$mail_version"
//SM4 JAVA实现(BC实现) //SM4 JAVA实现(BC实现)
def bouncycastle_version = '1.77' def bouncycastle_version = '1.77'

View File

@ -3,14 +3,16 @@ package com.idormy.sms.forwarder.utils.mail
import android.text.Html import android.text.Html
import android.text.Spanned import android.text.Spanned
import com.idormy.sms.forwarder.utils.Log import com.idormy.sms.forwarder.utils.Log
import com.sun.mail.util.MailSSLSocketFactory
import jakarta.mail.Authenticator
import jakarta.mail.PasswordAuthentication
import org.bouncycastle.openpgp.PGPPublicKeyRing import org.bouncycastle.openpgp.PGPPublicKeyRing
import org.bouncycastle.openpgp.PGPSecretKeyRing import org.bouncycastle.openpgp.PGPSecretKeyRing
import java.io.File import java.io.File
import java.security.PrivateKey import java.security.PrivateKey
import java.security.cert.X509Certificate import java.security.cert.X509Certificate
import java.util.Properties import java.util.Properties
import javax.mail.Authenticator
import javax.mail.PasswordAuthentication
@Suppress("PrivatePropertyName", "DEPRECATION") @Suppress("PrivatePropertyName", "DEPRECATION")
class EmailSender( class EmailSender(
@ -32,7 +34,6 @@ class EmailSender(
private val listener: EmailTaskListener? = null, private val listener: EmailTaskListener? = null,
// 安全选项 // 安全选项
private val openSSL: Boolean = false, //是否开启ssl验证 默认关闭 private val openSSL: Boolean = false, //是否开启ssl验证 默认关闭
private val sslFactory: String = "javax.net.ssl.SSLSocketFactory", //SSL构建类名
private val startTls: Boolean = false, //是否开启starttls加密方式 默认关闭 private val startTls: Boolean = false, //是否开启starttls加密方式 默认关闭
// 邮件加密方式: S/MIME、OpenPGP、Plain不传证书 // 邮件加密方式: S/MIME、OpenPGP、Plain不传证书
private val encryptionProtocol: String = "S/MIME", private val encryptionProtocol: String = "S/MIME",
@ -58,7 +59,11 @@ class EmailSender(
// 设置是否启用 SSL 连接 // 设置是否启用 SSL 连接
if (openSSL) { if (openSSL) {
put("mail.smtp.ssl.enable", "true") put("mail.smtp.ssl.enable", "true")
put("mail.smtp.socketFactory.class", sslFactory) // 使用 TLSv1.2 协议 & 信任所有主机
val sf = MailSSLSocketFactory("TLSv1.2")
sf.setTrustedHosts("*")
put("mail.smtp.ssl.socketFactory", sf)
put("mail.smtp.ssl.protocols", "TLSv1.2")
} }
// 设置是否启用 TLS 连接 // 设置是否启用 TLS 连接
if (startTls) { if (startTls) {

View File

@ -1,6 +1,18 @@
package com.idormy.sms.forwarder.utils.mail package com.idormy.sms.forwarder.utils.mail
import com.idormy.sms.forwarder.utils.Log import com.idormy.sms.forwarder.utils.Log
import jakarta.activation.DataHandler
import jakarta.activation.FileDataSource
import jakarta.mail.Authenticator
import jakarta.mail.Message
import jakarta.mail.Session
import jakarta.mail.Transport
import jakarta.mail.internet.InternetAddress
import jakarta.mail.internet.MimeBodyPart
import jakarta.mail.internet.MimeMessage
import jakarta.mail.internet.MimeMultipart
import jakarta.mail.internet.MimeUtility
import jakarta.mail.util.ByteArrayDataSource
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import org.bouncycastle.jce.provider.BouncyCastleProvider import org.bouncycastle.jce.provider.BouncyCastleProvider
@ -22,18 +34,6 @@ import java.io.InputStream
import java.security.Security import java.security.Security
import java.util.Date import java.util.Date
import java.util.Properties import java.util.Properties
import javax.activation.DataHandler
import javax.activation.FileDataSource
import javax.mail.Authenticator
import javax.mail.Message
import javax.mail.Session
import javax.mail.Transport
import javax.mail.internet.InternetAddress
import javax.mail.internet.MimeBodyPart
import javax.mail.internet.MimeMessage
import javax.mail.internet.MimeMultipart
import javax.mail.internet.MimeUtility
import javax.mail.util.ByteArrayDataSource
@Suppress("PrivatePropertyName") @Suppress("PrivatePropertyName")
@ -244,4 +244,3 @@ class PgpUtils(
} }
} }

View File

@ -1,6 +1,17 @@
package com.idormy.sms.forwarder.utils.mail package com.idormy.sms.forwarder.utils.mail
import com.idormy.sms.forwarder.utils.Log import com.idormy.sms.forwarder.utils.Log
import jakarta.activation.DataHandler
import jakarta.activation.FileDataSource
import jakarta.mail.Authenticator
import jakarta.mail.Message
import jakarta.mail.Session
import jakarta.mail.Transport
import jakarta.mail.internet.InternetAddress
import jakarta.mail.internet.MimeBodyPart
import jakarta.mail.internet.MimeMessage
import jakarta.mail.internet.MimeMultipart
import jakarta.mail.internet.MimeUtility
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import org.bouncycastle.cert.jcajce.JcaCertStore import org.bouncycastle.cert.jcajce.JcaCertStore
@ -24,17 +35,7 @@ import java.security.Security
import java.security.cert.X509Certificate import java.security.cert.X509Certificate
import java.util.Date import java.util.Date
import java.util.Properties import java.util.Properties
import javax.activation.DataHandler
import javax.activation.FileDataSource
import javax.mail.Authenticator
import javax.mail.Message
import javax.mail.Session
import javax.mail.Transport
import javax.mail.internet.InternetAddress
import javax.mail.internet.MimeBodyPart
import javax.mail.internet.MimeMessage
import javax.mail.internet.MimeMultipart
import javax.mail.internet.MimeUtility
@Suppress("PrivatePropertyName") @Suppress("PrivatePropertyName")
class SmimeUtils( class SmimeUtils(

View File

@ -137,6 +137,14 @@ class EmailUtils {
setting.fromEmail += setting.mailType setting.fromEmail += setting.mailType
} }
"@icloud.com" -> {
setting.host = "smtp.mail.me.com"
setting.port = "587"
setting.ssl = false
setting.startTls = true
setting.fromEmail += setting.mailType
}
else -> {} else -> {}
} }

View File

@ -127,6 +127,7 @@
<item>\@sina.cn</item> <item>\@sina.cn</item>
<item>\@139.com</item> <item>\@139.com</item>
<item>\@189.cn</item> <item>\@189.cn</item>
<item>\@icloud.com</item>
<item>@string/other_mail_type</item><!--注意这里不能修改--> <item>@string/other_mail_type</item><!--注意这里不能修改-->
</string-array> </string-array>

View File

@ -6,14 +6,14 @@
# http://www.gradle.org/docs/current/userguide/build_environment.html # http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process. # Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings. # The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 org.gradle.jvmargs=-Xmx4096m -XX:MaxPermSize=1024m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
# When configured, Gradle will run in incubating parallel mode. # When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit # This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true # org.gradle.parallel=true
# 是否打包APK打正式包时请设置为true,使用正式的签名 # 是否打包APK打正式包时请设置为true,使用正式的签名
isNeedPackage=true isNeedPackage=true
isNeedClean=false isNeedClean=true
# 是否排除Frpc动态库打正式包时请设置为true # 是否排除Frpc动态库打正式包时请设置为true
excludeFrpclib=true excludeFrpclib=true
# 是否使用leakcanary检测内存泄漏打正式包时请设置为false # 是否使用leakcanary检测内存泄漏打正式包时请设置为false