代碼: 選擇全部
pod 'mailcore2-ios'
代碼: 選擇全部
// caller
Mailer.SendMail(self.salesOrder, sucess: self.sentSucess, fail: self.sentFail)
func sentSucess(m: SalesOrderViewModel, logs: String)
{
}
func sentFail(m: SalesOrderViewModel, logs: String)
{
}
代碼: 選擇全部
import Foundation
class Mailer
{
static var templateContent: String? = nil
static var templatePath: String? = nil
static var loopTemplate: [String] = [String]()
static var HtmlBody: String = ""
static let HOST_NAME: String = "smtp.gmail.com"
static let USER_NAME: String = "cncbugreporter@gmail.com"
static let USER_PWD: String = "XXXXXXX"
static var MAIL_TO_LIST: [MCOAddress] = [
//MCOAddress(displayName: "XXXXXXX", mailbox: "a@XXXXXXX.com"),
//MCOAddress(displayName: "XXXXXXX", mailbox: "b@XXXXXXX.com"),
//MCOAddress(displayName: "XXXXXXX", mailbox: "c@XXXXXXX.com"),
]
static let MAIL_BCC_LIST: [MCOAddress] = [
//MCOAddress(displayName: "XXXXXXX", mailbox: "a@XXXXXXX.com"),
//MCOAddress(displayName: "XXXXXXX", mailbox: "b@XXXXXXX.com"),
//MCOAddress(displayName: "XXXXXXX", mailbox: "c@XXXXXXX.com"),
]
static let MAIL_CC_LIST: [MCOAddress] = [
//MCOAddress(displayName: "XXXXXXX", mailbox: "a@XXXXXXX.com"),
//MCOAddress(displayName: "XXXXXXX", mailbox: "b@XXXXXXX.com"),
//MCOAddress(displayName: "XXXXXXX", mailbox: "c@XXXXXXX.com"),
]
static let MAIL_FROM: MCOAddress = MCOAddress(displayName: "XXXXXXX", mailbox: "XXXXXXX@XXXXXXX.com")
static let allRetalageAttachmets: [String] = ["logo", "facebook", "twitter", "pinterest", "tumblr", "instagram"]
static func Init()
{
self.Template()
self.LoopTemplate()
}
static func Template()
{
self.templatePath = NSBundle.mainBundle().pathForResource("mail_content_template", ofType: "html")
if(self.templatePath == nil)
{
print("template file not exists")
}
else
{
do
{
self.templateContent = try String(contentsOfFile: self.templatePath!, encoding: NSUTF8StringEncoding)
}catch { print(error) }
}
}
static func GetHtml(salesOrder: SalesOrderViewModel) -> String
{
if(self.loopTemplate.count >= 3)
{
var header = self.loopTemplate[0]
var footer = self.loopTemplate[2]
let body = self.GetLoopData(salesOrder)
header = header
.replace(salesOrder.CONTENT_NAME, withString: salesOrder.ContentName ?? "")
.replace(salesOrder.CONFIRMATION_ORDER_DATETIME, withString: salesOrder.ConfirmationOrderDateTime.FullDateTime() ?? "")
.replace(salesOrder.CONFIRMATION_ORDER_ID, withString: salesOrder.ConfirmationOrderId ?? "")
.replace(salesOrder.CONFIRMATION_PAYMENT, withString: salesOrder.ConfirmationPayment ?? "")
.replace(salesOrder.CONFIRMATION_DELIVERY, withString: salesOrder.ConfirmationDelivery ?? "")
.replace(salesOrder.BILLING_ADDR, withString: salesOrder.BillingAddr ?? "")
.replace(salesOrder.BILLING_TEL_DISPLAY, withString: salesOrder.BillingTelDisplay ?? "")
.replace(salesOrder.BILLING_TEL, withString: salesOrder.BillingTel ?? "")
.replace(salesOrder.SHIPPING_ADDR, withString: salesOrder.ShippingAddr ?? "")
.replace(salesOrder.SHIPPING_TEL_DISPLAY, withString: salesOrder.ShippingTelDisplay ?? "")
.replace(salesOrder.SHIPPING_TEL, withString: salesOrder.ShippingTel ?? "")
//print("footer total:\(salesOrder.OrderTotalSubtotal)")
//print("footer total:\(salesOrder.OrderTotalShipping)")
//print("footer total:\(salesOrder.OrderTotalTotal)")
//print("footer total:\(salesOrder.OrderTotalSubtotal!.toCurrency())")
//print("footer total:\(salesOrder.OrderTotalShipping!.toCurrency())")
//print("footer total:\(salesOrder.OrderTotalTotal!.toCurrency())")
footer = footer
.replace(salesOrder.ORDER_TOTAL_SUBTOTAL, withString: salesOrder.OrderTotalSubtotal!.toCurrency() ?? "")
.replace(salesOrder.ORDER_TOTAL_SHIPPING, withString: salesOrder.OrderTotalShipping!.toCurrency() ?? "")
.replace(salesOrder.ORDER_TOTAL_TOTAL, withString: salesOrder.OrderTotalTotal!.toCurrency() ?? "")
self.HtmlBody = "\(header)\(body)\(footer)"
}
return self.HtmlBody
}
static func GetLoopData(salesOrder: SalesOrderViewModel) -> String
{
let body = self.loopTemplate[1]
var result: String = ""
let shipping: Float = 0.0
var total: Float = 0.0
for (_, value) in salesOrder.Products.enumerate()
{
value.ProductSubtotal = value.ProductInfoQty * value.ProductInfoPrice
total += value.ProductSubtotal
result.appendContentsOf(body
.replace(salesOrder.PRODUCT_URL, withString: value.ProductUrl ?? "")
.replace(salesOrder.PRODUCT_IMG, withString: value.ProductImg ?? "")
.replace(salesOrder.PRODUCT_MODEL, withString: value.ProductModel ?? "")
.replace(salesOrder.PRODUCT_INFO_SIZE, withString: value.ProductInfoSize ?? "")
.replace(salesOrder.PRODUCT_INFO_PRICE, withString: value.ProductInfoPrice.toCurrency())
.replace(salesOrder.PRODUCT_INFO_QTY, withString: String(Int(value.ProductInfoQty)))
.replace(salesOrder.PRODUCT_SUBTOTAL, withString: value.ProductSubtotal.toCurrency()))
}
//print("total:\(total)")
//print("shipping:\(shipping)")
//print("OrderTotalTotal:\(String(total + shipping))")
salesOrder.OrderTotalSubtotal = String(total)
salesOrder.OrderTotalShipping = String(shipping)
salesOrder.OrderTotalTotal = String(total + shipping)
return result
}
static func LoopTemplate()
{
self.loopTemplate = self.templateContent!.componentsSeparatedByString("<!--#AOC_LOOP#-->")
//print("self.loopTemplate[0]:\(self.loopTemplate[0])")
//print("self.loopTemplate[1]:\(self.loopTemplate[1])")
//print("self.loopTemplate[2]:\(self.loopTemplate[2])")
//print("HtmlBody:\(self.templateContent)")
}
static func InlineImageFiles(builder: MCOMessageBuilder)
{
for name in self.allRetalageAttachmets
{
let imageName = name
let imageFile: MCOAttachment = MCOAttachment(data: UIImagePNGRepresentation(UIImage(named:imageName)!), filename: "\(imageName).jpg")
imageFile.contentID = imageName
builder.addRelatedAttachment(imageFile)
}
}
// resize: 101 x 101
static func ResizeProductItemImageSize(builder: MCOMessageBuilder, productItems: [CartListViewModel])
{
for item in productItems
{
let imageName = item.ProductImg
let newSize = CGSizeMake(101, 101)
let newImage = ImageUtil.Resize(imageName, sizeChange: newSize)
let imageFile: MCOAttachment = MCOAttachment(data: UIImageJPEGRepresentation(newImage, 100), filename: imageName)
imageFile.contentID = imageName
builder.addRelatedAttachment(imageFile)
}
}
// application/pdf
// application/vnd.sealed-xls
// text/csv
static func MakePDF(builder: MCOMessageBuilder, orderId: String)
{
let fileName = "\(orderId)"
PDFMaker.HtmlToPdf(fileName, html: builder.htmlBody)
let pdfFileAttachment: MCOAttachment = MCOAttachment(contentsOfFile: PDFMaker.FullPath())
builder.addAttachment(pdfFileAttachment)
}
static func MakeCSV(builder: MCOMessageBuilder, salesOrder: SalesOrderViewModel)
{
let fileName = salesOrder.ConfirmationOrderId!
CSVMaker.MakeIt(fileName, salesOrder: salesOrder)
let pdfFileAttachment: MCOAttachment = MCOAttachment(contentsOfFile: CSVMaker.FullPath())
builder.addAttachment(pdfFileAttachment)
}
static func MakeXLSX(builder: MCOMessageBuilder, salesOrder: SalesOrderViewModel)
{
let fileName = salesOrder.ConfirmationOrderId!
XLSXMaker.MakeIt(fileName, salesOrder: salesOrder)
let pdfFileAttachment: MCOAttachment = MCOAttachment(contentsOfFile: XLSXMaker.FullPath())
builder.addAttachment(pdfFileAttachment)
}
static func SendMail(salesOrder: SalesOrderViewModel, sucess: (SalesOrderViewModel, String) -> Void, fail:(SalesOrderViewModel, String) -> Void)
{
self.Init()
Mailer.MAIL_TO_LIST = salesOrder.MailTo
var logs: String = ""
let orderId: String = salesOrder.ConfirmationOrderId!
let subject: String = "Lafonn ‐ Everlasting Desire: Order #\(orderId) notification"
let smtpSession = MCOSMTPSession()
smtpSession.hostname = self.HOST_NAME
smtpSession.username = self.USER_NAME
smtpSession.password = self.USER_PWD
smtpSession.port = 465
smtpSession.authType = MCOAuthType.SASLPlain
smtpSession.connectionType = MCOConnectionType.TLS
smtpSession.connectionLogger = {(connectionID, type, data) in
if data != nil {
if let string = NSString(data: data, encoding: NSUTF8StringEncoding){
logs.appendContentsOf(String(string))
print("Connection: \(string)")
}
}
}
let builder = MCOMessageBuilder()
builder.header.to = self.MAIL_TO_LIST
builder.header.bcc = self.MAIL_BCC_LIST
builder.header.cc = self.MAIL_CC_LIST
builder.header.from = self.MAIL_FROM
builder.header.subject = subject
builder.htmlBody = self.GetHtml(salesOrder)
self.InlineImageFiles(builder)
self.ResizeProductItemImageSize(builder, productItems: salesOrder.Products)
self.MakePDF(builder, orderId: orderId)
self.MakeCSV(builder, salesOrder: salesOrder)
self.MakeXLSX(builder, salesOrder: salesOrder)
let rfc822Data = builder.data()
let sendOperation = smtpSession.sendOperationWithData(rfc822Data)
sendOperation.start { (error) -> Void in
if (error != nil) {
fail(salesOrder, logs)
print("Error sending email: \(error)")
} else {
sucess(salesOrder, logs)
print("Successfully sent email!")
}
}
}
}