Gmail API:如何在 swift 上将附件发送到草稿

2024-05-24

最近,我的项目添加了使用Gmail,所以我遇到了很多关于它的问题,这让我很伤心。 现在,我想知道如何将图像发送到草稿,我的代码如下:

func postEmailMessageRequest(model: MEMailMessageModel, request: CompletionRequest) {

        let uploadParameters = GTLUploadParameters()
        uploadParameters.data = "String".dataUsingEncoding(NSUTF8StringEncoding)
        uploadParameters.MIMEType = "message/rfc2822"

        let query = GTLQueryGmail.queryForUsersDraftsCreateWithUploadParameters(uploadParameters) as! GTLQueryProtocol!
        service.executeQuery(query) { (ticket : GTLServiceTicket!, messages : AnyObject!, error : NSError?) -> Void in
            if error == nil {
                let messages = (messages as! GTLGmailDraft)
                messages.message.threadId = model.threadID
                self.sendMailRequest(messages, model: model, request: request)
            } else {
                request(status: false, result: "failure")
            }
        }
    }

    func sendMailRequest(draft: GTLGmailDraft, model: MEMailMessageModel, request: CompletionRequest) {

        let query = GTLQueryGmail.queryForUsersDraftsSendWithUploadParameters(nil) as! GTLQueryGmail
        draft.message.raw = self.generateRawString(model)
        query.draft = draft

        self.service.executeQuery(query, completionHandler: { (ticket, response, error) -> Void in
            if error == nil {
                request(status: true, result: "success")
            } else {
                request(status: false, result: "failure")
            }
        })
    }

上面我可以成功发送文本,但我不知道如何发送图像或PDF到草稿。


有发送附件电子邮件和回复电子邮件的最终代码。 `

// send email
extension MENetworkUtil {

/**
 * block: typealias NetworkResponse = (status: Bool, result: AnyObject) -> Void
 *
 * model: MEMailMessageModel contains(threadID, messageID, toUsers, fromUser, ccUsers, bccUsers, subject, contentText, attachmentsModels, isReplyEmail)
 **/
func setMailReqest(model: MEMailMessageModel, responseBlock: NetworkResponse) {
    let query = GTLQueryGmail.queryForUsersMessagesSendWithUploadParameters(nil) as! GTLQueryGmail
    let message = GTLGmailMessage()

    message.threadId = model.threadID
    message.raw = getEmailRawString(model)
    query.message = message

    service.executeQuery(query) { (ticket, response, error) in
        if error == nil {
            let result = response as! GTLGmailMessage

            if model.isReply { // send reply email success
                responseBlock(status: ture, result: result)
            } else {
                responseBlock(status: ture, result: result)
            }

        } else {
            request(status: false, result: "send email failure")
            printLog(error.debugDescription)
        }
    }
}

func getEmailRawString(model: MEMailMessageModel) -> String {
    var headerMessage = ""
    headerMessage += setSimpleEmailHeader(model) // send email

    if model.isReply { // send reply email
        headerMessage += setReplyEmail(model)
    }

    if model.attachments.count > 0 { // send attachments
        headerMessage += setAttachmentsEmail(model)
    } else {
        headerMessage += "\r\n\(model.contentText)\r\n\r\n"
    }

    // it should be convert to base64 string
    return GTLEncodeWebSafeBase64(headerMessage.dataUsingEncoding(NSUTF8StringEncoding))
}

func setSimpleEmailHeader(model: MEMailMessageModel) -> String {
    var rawMessage = ""
    let fromEmail = MEGlobal.loginEmail // login google email

    // send email date
    let date = MEMailMessagelFormatUtil.coverDateFromDate(NSDate(), dateFormat: "EEE, dd MMM yyyy HH:mm:ss Z")!

    // send email subject
    let subject = "=?UTF-8?B?" + "\(GTLEncodeBase64(model.subject.dataUsingEncoding(NSUTF8StringEncoding)))" + "?="

    let toInfoStr = model.toUsersString
    let ccInfoStr = model.ccUsersString
    let fromInfoStr = model.fromUserString

    if !ccInfoStr.isEmpty {
        rawMessage += "Cc: \(ccInfoStr)\r\n"
    }

    rawMessage += "MIME-Version: 1.0\r\n"
    rawMessage += "Date: \(date)\r\n"
    rawMessage += "From: \(fromInfoStr)\r\n"
    rawMessage += "To: \(toInfoStr)\r\n"
    rawMessage += "Subject: \(subject) \r\n"

    return rawMessage
}

// send reply email you should add two properties: References/In-Reply-To
// references means the same thread messageIDs()
// In-Reply-To means you reply thread the last email messageID
func setReplyEmail(model: MEMailMessageModel) -> String { // 回复邮件样式
    var rawMessage = ""
    rawMessage = "" + "In-Reply-To: \(model.messageID)\r\n"

    if let references = model.references { // check thread has more than 1 message.
        rawMessage += "References: \(references) \(model.messageID)\r\n"
    } else {
        rawMessage += "References: \(model.messageID)\r\n"
    }

    return rawMessage
}

// the attachments email
// first of all, you should figure out 'Content-Type'
// MEMailAttachmentsModel: is constom attachment model, contains(attachment type, attachment name, data), and data should be convert NSData to Base64 String.
func setAttachmentsEmail(model: MEMailMessageModel) -> String {

    var rawMessage = ""
    rawMessage += "Content-Type: multipart/mixed; boundary=\"foo_bar_baz\"\r\n"
    rawMessage += "Content-Length: 99999999999999999999999999\r\n\r\n"
    rawMessage += "--foo_bar_baz\r\n"
    rawMessage += "Content-Type: text/plain; charset=\"UTF-8\"\r\n"
    rawMessage += "MIME-Version: 1.0\r\n\r\n"
    rawMessage += "\(model.contentText)\r\n\r\n"

    var attachments: [MEMailAttachmentsModel] = model.attachments

    for i in 0..<attachments.count {
        let attachment  = attachments[i]
        var contentType = ""
        switch attachment.attachmentType {
        case .Text:
            contentType = "text/plain"
        case .JPEG:
            contentType = "image/jpeg"
        case .PNG:
            contentType = "image/png"
        case .HTML:
            contentType = "text/html"
        case .Multipart:
            contentType = "multipart/mixed"
        case .Video:
            contentType = "video/mpeg"
        case .Application:
            contentType = "application/octet-stream"
        case .MSWord:
            contentType = "application/msword"
        case .PDF:
            contentType = "application/pdf"
        default: break
        }

        if attachment.mimeType != "" {
            contentType = attachment.mimeType
        }

        rawMessage += "--foo_bar_baz\r\n" +
            "Content-Type: \(contentType)\r\n" +
            "MIME-Version: 1.0\r\n" +
            "Content-Transfer-Encoding: base64\r\n" +
            "Content-Disposition: attachment; filename=\"\(attachment.fileName)\"\r\n" +
        "Content-Type: message/rfc822\r\n\r\n"
        rawMessage += "\(GTLEncodeBase64(attachment.fileData!))\r\n\r\n"
    }

    rawMessage += "--foo_bar_baz--"

    return rawMessage
}
}

`

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Gmail API:如何在 swift 上将附件发送到草稿 的相关文章

随机推荐

  • Javascript:函数的“无限”参数?

    在 Chrome 中 当我输入console log在下面的一项中 console log A parameter A parameter A parameter A parameter A parameter A parameter A
  • 查找导航属性的相关 FK 属性

    在运行时 我想查找 EntityObject 是否也具有给定 NavigationProperty 的外键属性 我在下面的两个步骤中做到了这一点 我想这将需要一些元数据查询 我不确定如何测试元数据类是否指向特定 EntityObject 类
  • 检索用户关注的所有用户的帖子 -rails -ActiveRecord

    我有一个简单的 Rails 应用程序 用户可以在其中互相赠送虚拟礼物 每件礼物都属于两个用户 赠送者和接收者 In my User rb has many given gifts class name Gift foreign key gi
  • 如何使第一行变成第二级MultiIndex

    我有一个现有的 DataFrame 如下所示 1 1 1 2 2 2 2 abc def ghi jkl mno pqr stu 1 00 2 00 3 00 4 00 5 00 6 00 7 00 1 00 2 00 3 00 4 00
  • 何时计划 (SELECT) 查询?

    在 PostgreSQL 中 什么时候计划 SELECT 查询 Is it 在报表准备时 或者 在处理 SELECT 开始时 或者 别的东西 我问的原因是 Stackoverflow 上有一个问题 相同的查询 两种不同的方式 性能截然不同
  • 同时运行 ng build --watch 和 ngserve 时,Angular 7 库 html 模板更改不会影响应用程序

    当 Angular 7 库 html 模板更改使用 ng build library watch 和 ngserve application 在不同的 cmd 中同时运行时 不会影响 Angular 应用程序 所以我首先使用 watch 标
  • 在 C++20 中获取当前日期/时间是线程安全的吗?

    简短的问题 在 C 17 之前 包括 C 17 C 不提供线程安全的方式来获取当前时间或日期 这个问题会在 C 20 中修复吗 长问题 获取当前时间和日期的唯一可移植方法是使用 std gmtime 或 std localtime 函数 这
  • 在非输入元素上反应 onKeyDown/onKeyUp 事件

    我需要捕获 cmd 按钮向上和向下事件 以便选择是否在 setState 中使用串联 例如 我如何在表元素上获取这些事件 您必须在主体 窗口级别捕获按键 表元素没有输入焦点 因此您无法从表中捕获键 没有输入元素 var cmdDown fa
  • Shell Crontab 不工作

    GNU nano 2 0 9 文件 tmp crontab XXXXzBQgwS 5 check phpfpm sh 5 check nginx sh 5 disk clean sh 5 loadcheck sh 按理说我的代码应该每 5
  • XNA中窗口系统的渲染策略(RenderTarget性能)

    我目前正在从头开始为 XNA 游戏创建一个窗口系统 我主要针对 Windows 进行开发 但谁知道我将来可能支持哪些平台 如果您知道本机 Direct3D 的这一点 请随意回答 因为性能语义应该类似 如果可能 请考虑如果目标平台是 X Bo
  • 使用 Print 进行简单的芹菜测试不会进入终端

    EDIT 1 实际上 print语句输出到 Celery 终端 而不是运行 python 程序的终端 正如 PatrickAllen 所示 OP 我最近开始使用Celery http www celeryproject org 但甚至无法进
  • 使用 boost 线程和非静态类函数

    所以我做了一些研究 发现你可以创建一个 boost thread 对象 并通过使用 this 和 boost bind 等以非静态类函数开头 这确实没有多大意义对我来说 我能找到的所有示例都在与其启动的函数相同的类中启动了 boost th
  • 软件开发/项目中“后端”和“前端”的定义/区别是什么? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 新手如何区分这一点 如何知道自己正在工作的是后端系统还是前端系统 前端 通常是指项目中与用户交互的部分 例如图形用户界面或命令行 这是一个模
  • 使用 urllib2 进行 Python 身份验证

    所以我尝试使用 python 从名为 vsearch cisco com 的网站下载文件 python Connects to the Cisco Server and Downloads files at the URL specifie
  • 具有多个输入的kerasvalidation_data

    我尝试使用validation data方法 但是有问题 model fit X macd train X rsi train X ema train Y train sample weight sample weight validati
  • Magento:获取给定产品的购物车数量

    我使用这个代码 items Mage getModel checkout cart gt getQuote gt getAllItems items Mage getSingleton checkout session gt getQuot
  • 如何重写复杂的C++代码行(嵌套三元运算符)

    我一直在查看别人的代码以进行调试 发现了这一点 m seedsfilter good true m seedsfilter 1 good newClusters Sp good newSeed Sp 这是什么意思 是否有一个自动化工具可以将
  • R中两个时间之间的时间差

    我正在尝试计算 R 中两个时间之间的差异 例如 两个时间之间的时间差 03 15 和 01 40 将为 1 小时 35 分钟 我在 R 中尝试了以下代码 difftime 03 15 01 40 tz units secs 但我收到以下错误
  • 如何停止覆盖数据

    我正在尝试在我的 iOS 应用程序中保存一些数据 我使用以下代码 NSArray paths NSSearchPathForDirectoriesInDomains NSDocumentDirectory NSUserDomainMask
  • Gmail API:如何在 swift 上将附件发送到草稿

    最近 我的项目添加了使用Gmail 所以我遇到了很多关于它的问题 这让我很伤心 现在 我想知道如何将图像发送到草稿 我的代码如下 func postEmailMessageRequest model MEMailMessageModel r