android发送邮件乱码解决
情况说明
最近在写android的代码要用到发送邮件的功能,所以上github上找到一个库,但是发现接受的邮件中文显示乱码所以开始解决。
复现
- github上android发送mail的库
根据库中的readme文件在自己的工程中导入需要的包,并进行申请网络权限等操作。最后根据readme上的提示添加发送mail的代码。这里readme有一个小问题,示例里面导入的库的版本是0.0.2,而示例使用的代码有的属性是0.0.3才开始支持的,所以你导入库的时候
解决
问题分析
- 邮件中邮件的摘要中文正常显示,但是邮件的主体正文中文乱码
查阅资料发现,邮件的摘要和正文的显示方式是不同的。邮件的摘要是直接用字符串发送和显示的,而正文为了使邮件的展现能力更好采用了html的展示方式。html的编码格式需要指定,所以猜测是html的编码问题 - 在源码中找到邮件正文的处理代码
下面是调用函数的示例
MaildroidX.Builder()
.smtp("")
.smtpUsername("")
.smtpPassword("")
.smtpAuthentication()
.port("")
.type(MaildroidXType.HTML)
.to("")
.from("")
.subject("")
.body("")
.attachment("")
//or
.attachments() //List<String>
.onCompleteCallback(object : MaildroidX.onCompleteCallback{
override val timeout: Long = 3000
override fun onSuccess() {
Log.d("MaildroidX", "SUCCESS")
}
override fun onFail(errorMessage: String) {
Log.d("MaildroidX", "FAIL")
}
})
.mail()
注意上面的两个属性,一个是body,这里传入的就是邮件的正文,一个是type,这个指定邮件的发送格式,这里指定的就是html。知道了上面这些,接下来想到的肯定是我把正文传进去你是怎么处理我的正文并发送的。
- 查看源码的发送代码
ctrl加左键点击上面示例代码最后的mail()函数转到发送部分的源码,发现下面的处理body的代码
// Set Subject: header field
message.subject = subject
// Create the message part
var messageBodyPart: BodyPart = MimeBodyPart()
// Now set the actual message
messageBodyPart.setContent(body,type)
// Create a multipart message
val multipart = MimeMultipart()
// Set text message part
multipart.addBodyPart(messageBodyPart)
// Part two is attachment
messageBodyPart = MimeBodyPart()
看到这行代码messageBodyPart.setContent(body,type)
这一看就知道是将body以type指定的一种处理方式转化后存起来发送。那么问题应该是出在这个转化上。当我想查看setContent
函数的函数却发现找不到,只好上网找这个函数的用法,在这里(How do I send a HTML mail)我找到了答案。其中有代码setContent(message, "text/html; charset=utf-8")
对比库中的源码setContent(body,type)
其中type的值为text/html 到这里差不多就已经知道原因了。charset=utf-8
代表着编码格式是utf-8,以这种编码格式就不会出现乱码,而源码中没有写,就是用了默认的参数,而且我通过查询我邮件的源码发现这个默认的参数是charset=us-ascii
。到这里就已经知道了出现乱码的原因。
解决办法
- 因为仓库的代码是只读的,你要自己新建一个文件重写要修改的那个类,这里需要重写MaildroidX这个类,复制粘贴后只需修改你要修改的部分。
- 将所有MaildroidX类的引用换成你的MaildroidX类
- 添加需要的依赖
implementation 'com.sun.mail:android-mail:1.6.2'
implementation 'com.sun.mail:android-activation:1.6.2'
Tips
- 本次修改我已经提交了pull request,希望能被仓库的开发者采纳
- 另外附上我自己写的android上将短信转发邮件的app的github地址,SMS-Mail,欢迎start和fork