1 頁 (共 1 頁)

用 smtp.gmail.com 送信且 Related Attachment 方式附件

發表於 : 週六 12月 05, 2015 5:28 pm
rusli
Podfile:

代碼: 選擇全部

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!")
            }
        }
    }
}