The Gmail Api has no clear documentation on how to do this, I have been trying with this but there are many things that are in the air.
I have sought external source
According to Google API documentation(https://developers.google.com/gmail/api/guides/sending), we can know there are have two ways can help you send message success(draft.send, message.send). without a doubt, both of them use api are different, but the result is the same. As you give one of the above way can got that, we just call it message.send. With another way is draft.send, so we should upload "UploadParameters" to Gmail draft, after we upload success, we can get some message about gmail draft. At last, we should send mail content, when we send success, the draft message will automatic delete. Code goes be as follows:
func postEmailMessageRequest(model: MEMailMessageModel, request: CompletionRequest) {
let uploadParameters = GTLUploadParameters()
uploadParameters.data = model.snippet.dataUsingEncoding(NSUTF8StringEncoding)
uploadParameters.MIMEType = model.mimeType!
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: "upload success")
}
}
}
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: "send success") // after this, the draft will be delete
} else {
request(status: false, result: "send failure")
}
})
}
func generateRawString(model: MEMailMessageModel) -> String {
let date = MEMailMessagelFormatUtil.coverDateFromDate(NSDate(), dateFormat: "EEE, dd MMM yyyy HH:mm:ss Z")! // get current date
var fromEamil = ""
if let str = NSUserDefaults.standardUserDefaults().valueForKey("userEmail") as? String {
fromEamil = str
}
var rawMessage = ""
if model.isReply { // how to reply, but how to reply the email is another question.
rawMessage = "" + "In-Reply-To: \(model.messageID!)\r\n"
if let references = model.references {
rawMessage += "References: \(references) \(model.messageID!)\r\n"
} else {
rawMessage += "References: \(model.messageID!)\r\n"
}
}
rawMessage += "Date: \(date)\r\n" +
"From: <\(fromEamil)>\r\n" +
"To: \(model.toName!) <\(model.toMail)>\r\n" +
"Subject: \(model.subject) \r\n\r\n" + "\(model.snippet)"
return GTLEncodeWebSafeBase64(rawMessage.dataUsingEncoding(NSUTF8StringEncoding))
}