0
0
mirror of https://github.com/tursom/TursomServer.git synced 2025-03-02 22:00:09 +08:00

优化mail部分结构

This commit is contained in:
tursom 2020-03-09 01:06:40 +08:00
parent 9669ea20fe
commit 4e10c5dfcf
8 changed files with 103 additions and 141 deletions

View File

@ -11,4 +11,4 @@ include 'database:database-mysql'
include 'database:mongodb'
include 'utils:ws-client'
include 'utils:mail'
include 'utils:csv'

View File

@ -1,7 +1,19 @@
package cn.tursom.core
import java.text.SimpleDateFormat
import java.util.*
class ThreadLocalSimpleDateFormat(val format: String = "YYYY-MM-dd'T'HH:mm:ssZZ") : SimpThreadLocal<SimpleDateFormat>({
SimpleDateFormat(format)
})
}) {
fun format(date: Any) = get().format(date)
fun format(date: Date) = get().format(date)
fun parse(date: String) = get().parse(date)
companion object {
val iso8601 = ThreadLocalSimpleDateFormat()
val standard = ThreadLocalSimpleDateFormat("YYYY-MM-dd HH:mm:ssZZ")
val simp = ThreadLocalSimpleDateFormat("YY-MM-dd HH:mm:ss")
val cn = ThreadLocalSimpleDateFormat("YYYY'年'MM'月'dd'日' HH'时'mm'分'ss'秒'")
}
}

3
utils/csv/build.gradle Normal file
View File

@ -0,0 +1,3 @@
dependencies {
implementation project(":")
}

View File

@ -1,11 +1,9 @@
package cn.tursom.mail
import cn.tursom.core.base64
import com.sun.mail.util.MailSSLSocketFactory
import java.net.URL
import java.util.*
import javax.activation.DataHandler
import javax.activation.FileDataSource
import javax.activation.DataSource
import javax.mail.Address
import javax.mail.Session
import javax.mail.event.TransportListener
@ -32,7 +30,7 @@ import javax.mail.internet.MimeMultipart
data class EmailData(
var host: String?, var port: Int?, var name: String?, var password: String?, var from: String?,
var to: String?, var subject: String?, var html: String? = null, var text: String? = null,
var image: Map<String, String>? = null, var attachment: List<String>? = null
var image: Collection<Image>? = null, var attachment: Collection<DataSource>? = null
) {
/**
* 发送邮件
@ -52,45 +50,7 @@ data class EmailData(
val session = Session.getInstance(props)
//邮件内容部分
val msg = MimeMessage(session)
val multipart = MimeMultipart()
// 添加文本
if (html ?: "null" != "null") {
val htmlBodyPart = MimeBodyPart()
htmlBodyPart.setContent(html, "text/html;charset=UTF-8")
multipart.addBodyPart(htmlBodyPart)
} else {
val textPart = MimeBodyPart()
textPart.setText(text)
multipart.addBodyPart(textPart)
}
//添加图片
image?.forEach {
//创建用于保存图片的MimeBodyPart对象并将它保存到MimeMultipart中
val gifBodyPart = MimeBodyPart()
if (it.value.startsWith("http://") or it.value.startsWith("https://")) {
gifBodyPart.dataHandler = DataHandler(URL(it.value))
} else {
val fds = FileDataSource(it.value)//图片所在的目录的绝对路径
gifBodyPart.dataHandler = DataHandler(fds)
}
gifBodyPart.contentID = it.key //cid的值
multipart.addBodyPart(gifBodyPart)
}
//添加附件
attachment?.forEach { fileName ->
val adjunct = MimeBodyPart()
val fileDataSource = FileDataSource(fileName)
adjunct.dataHandler = DataHandler(fileDataSource)
// adjunct.fileName = changeEncode(fileDataSource.name)
adjunct.fileName = fileDataSource.name.base64()
multipart.addBodyPart(adjunct)
}
msg.setContent(multipart)
//邮件主题
msg.subject = subject
//邮件发送者
msg.setFrom(InternetAddress(from))
val msg = getMsg(session, from!!, subject, html, text, image, attachment)
//发送邮件
val transport = session.transport
transport.connect(host, name, password)
@ -100,4 +60,54 @@ data class EmailData(
}
fun clone(): EmailData = EmailData(host, port, name, password, from, to, subject, html, text, image, attachment)
companion object {
fun getMsg(
session: Session,
from: String,
subject: String?,
html: String?,
text: String?,
image: Collection<Image>?,
attachment: Collection<DataSource>?
): MimeMessage {
//邮件内容部分
val msg = MimeMessage(session)
val multipart = MimeMultipart()
// 添加文本
when {
html != null -> {
val htmlBodyPart = MimeBodyPart()
htmlBodyPart.setContent(html, "text/html;charset=UTF-8")
multipart.addBodyPart(htmlBodyPart)
}
text != null -> {
val textPart = MimeBodyPart()
textPart.setText(text)
multipart.addBodyPart(textPart)
}
}
//添加图片
image?.forEach { (contentID, dataHandler) ->
//创建用于保存图片的MimeBodyPart对象并将它保存到MimeMultipart中
val gifBodyPart = MimeBodyPart()
gifBodyPart.dataHandler = dataHandler
gifBodyPart.contentID = contentID
multipart.addBodyPart(gifBodyPart)
}
//添加附件
attachment?.forEach {
val adjunct = MimeBodyPart()
adjunct.dataHandler = DataHandler(it)
adjunct.fileName = it.name
multipart.addBodyPart(adjunct)
}
msg.setContent(multipart)
//邮件主题
msg.subject = subject
//邮件发送者
msg.setFrom(InternetAddress(from))
return msg
}
}
}

View File

@ -1,17 +1,11 @@
package cn.tursom.mail
import cn.tursom.core.base64
import com.sun.mail.util.MailSSLSocketFactory
import java.net.URL
import java.util.*
import javax.activation.DataHandler
import javax.activation.FileDataSource
import javax.activation.DataSource
import javax.mail.Session
import javax.mail.event.TransportListener
import javax.mail.internet.InternetAddress
import javax.mail.internet.MimeBodyPart
import javax.mail.internet.MimeMessage
import javax.mail.internet.MimeMultipart
/**
* 用于表示群发邮件的数据类
@ -19,8 +13,8 @@ import javax.mail.internet.MimeMultipart
*/
data class GroupEmailData(
var host: String?, var port: Int?, var name: String?, var password: String?, var from: String?,
var to: List<String>?, var subject: String?, var html: String? = null, var text: String? = null,
var image: Map<String, String>? = null, var attachment: List<String>? = null
var to: Collection<String>?, var subject: String?, var html: String? = null, var text: String? = null,
var image: Collection<Image>? = null, var attachment: Collection<DataSource>? = null
) {
fun send(transportListener: TransportListener? = null) {
if (host == null || port == null || name == null || password == null || from == null || to?.isEmpty() != false || subject == null) return
@ -37,44 +31,7 @@ data class GroupEmailData(
val session = Session.getInstance(props)
//邮件内容部分
val msg = MimeMessage(session)
val multipart = MimeMultipart()
// 添加文本
if (html ?: "null" != "null") {
val htmlBodyPart = MimeBodyPart()
htmlBodyPart.setContent(html, "text/html;charset=UTF-8")
multipart.addBodyPart(htmlBodyPart)
} else {
val textPart = MimeBodyPart()
textPart.setText(text)
multipart.addBodyPart(textPart)
}
//添加图片
image?.forEach {
//创建用于保存图片的MimeBodyPart对象并将它保存到MimeMultipart中
val gifBodyPart = MimeBodyPart()
if (it.value.startsWith("http://") or it.value.startsWith("https://")) {
gifBodyPart.dataHandler = DataHandler(URL(it.value))
} else {
val fds = FileDataSource(it.value)//图片所在的目录的绝对路径
gifBodyPart.dataHandler = DataHandler(fds)
}
gifBodyPart.contentID = it.key //cid的值
multipart.addBodyPart(gifBodyPart)
}
//添加附件
attachment?.forEach { fileName ->
val adjunct = MimeBodyPart()
val fileDataSource = FileDataSource(fileName)
adjunct.dataHandler = DataHandler(fileDataSource)
adjunct.fileName = fileDataSource.name.base64()
multipart.addBodyPart(adjunct)
}
msg.setContent(multipart)
//邮件主题
msg.subject = subject
//邮件发送者
msg.setFrom(InternetAddress(from))
val msg = EmailData.getMsg(session, from!!, subject, html, text, image, attachment)
//发送邮件
val transport = session.transport
transport.connect(host, name, password)

View File

@ -0,0 +1,21 @@
package cn.tursom.mail
import java.io.File
import java.net.URL
import javax.activation.DataHandler
import javax.activation.DataSource
import javax.activation.FileDataSource
import javax.mail.util.ByteArrayDataSource
data class Image(val contentID: String, val dataHandler: DataHandler) {
constructor(contentID: String, data: DataSource) : this(contentID, DataHandler(data))
constructor(contentID: String, file: File) : this(contentID, FileDataSource(file))
constructor(contentID: String, url: URL) : this(contentID, DataHandler(url))
constructor(contentID: String, data: Any, mimeType: String) : this(contentID, DataHandler(data, mimeType))
constructor(contentID: String, bytes: ByteArray, type: String, name: String = "") :
this(contentID, ByteArrayDataSource(bytes, type).apply { this.name = name })
constructor(contentID: String, data: String, type: String, name: String = "") :
this(contentID, ByteArrayDataSource(data, type).apply { this.name = name })
}

View File

@ -1,6 +1,8 @@
package cn.tursom.mail
import javax.activation.DataSource
data class MailStructure(
val to: String?, val subject: String?, val html: String?, val text: String? = null,
val image: Map<String, String>? = null, val attachment: List<String>? = null
val image: Collection<Image>? = null, val attachment: Collection<DataSource>? = null
)

View File

@ -1,17 +1,10 @@
package cn.tursom.mail
import cn.tursom.core.base64
import com.sun.mail.util.MailSSLSocketFactory
import java.net.URL
import java.util.*
import javax.activation.DataHandler
import javax.activation.FileDataSource
import javax.mail.Address
import javax.mail.Session
import javax.mail.internet.InternetAddress
import javax.mail.internet.MimeBodyPart
import javax.mail.internet.MimeMessage
import javax.mail.internet.MimeMultipart
data class MultipleEmailData(
var host: String?,
@ -19,9 +12,10 @@ data class MultipleEmailData(
var name: String?,
var password: String?,
var from: String?,
var to: List<MailStructure>?
var to: Collection<MailStructure>?
) {
fun send() {
val from = from ?: return
val props = Properties()
// props["mail.debug"] = "true" // 开启debug调试
props["mail.smtp.auth"] = "true" // 发送服务器需要身份验证
@ -38,47 +32,10 @@ data class MultipleEmailData(
//发送邮件
val transport = session.transport
transport.connect(host, name, password)
to?.forEach { structure ->
to?.forEach { (to, subject, html, text, image, attachment) ->
//邮件内容部分
val msg = MimeMessage(session)
val multipart = MimeMultipart()
// 添加文本
if (structure.html ?: "null" != "null") {
val htmlBodyPart = MimeBodyPart()
htmlBodyPart.setContent(structure.html, "text/html;charset=UTF-8")
multipart.addBodyPart(htmlBodyPart)
} else {
val textPart = MimeBodyPart()
textPart.setText(structure.text)
multipart.addBodyPart(textPart)
}
//添加图片
structure.image?.forEach {
//创建用于保存图片的MimeBodyPart对象并将它保存到MimeMultipart中
val gifBodyPart = MimeBodyPart()
if (it.value.startsWith("http://") or it.value.startsWith("https://")) {
gifBodyPart.dataHandler = DataHandler(URL(it.value))
} else {
val fds = FileDataSource(it.value)//图片所在的目录的绝对路径
gifBodyPart.dataHandler = DataHandler(fds)
}
gifBodyPart.contentID = it.key //cid的值
multipart.addBodyPart(gifBodyPart)
}
//添加附件
structure.attachment?.forEach { fileName ->
val adjunct = MimeBodyPart()
val fileDataSource = FileDataSource(fileName)
adjunct.dataHandler = DataHandler(fileDataSource)
adjunct.fileName = fileDataSource.name.base64()
multipart.addBodyPart(adjunct)
}
msg.setContent(multipart)
//邮件主题
msg.subject = structure.subject
//邮件发送者
msg.setFrom(InternetAddress(from))
transport.sendMessage(msg, arrayOf<Address>(InternetAddress(structure.to)))
val msg = EmailData.getMsg(session, from, subject, html, text, image, attachment)
transport.sendMessage(msg, arrayOf<Address>(InternetAddress(to)))
}
transport.close()
}