mirror of
https://github.com/tursom/TursomServer.git
synced 2025-03-02 22:00:09 +08:00
优化mail部分结构
This commit is contained in:
parent
9669ea20fe
commit
4e10c5dfcf
@ -11,4 +11,4 @@ include 'database:database-mysql'
|
||||
include 'database:mongodb'
|
||||
include 'utils:ws-client'
|
||||
include 'utils:mail'
|
||||
|
||||
include 'utils:csv'
|
@ -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
3
utils/csv/build.gradle
Normal file
@ -0,0 +1,3 @@
|
||||
dependencies {
|
||||
implementation project(":")
|
||||
}
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
@ -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)
|
||||
|
21
utils/mail/src/main/kotlin/cn/tursom/mail/Image.kt
Normal file
21
utils/mail/src/main/kotlin/cn/tursom/mail/Image.kt
Normal 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 })
|
||||
}
|
@ -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
|
||||
)
|
@ -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()
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user