如何使用Gmail api快速发送电子邮件

Gmail的API没有明确的文件如何做到这一点,我一直在尝试这个,但有很多事情在空气中。

我曾经寻求过这样的外部来源。 来源1和来源2 。 第一个似乎使用API​​的潜力,使用函数queryForUsersMessagesSendWithUploadParameters

而第二个是多一点。 虽然在Objective-C中这不是一个问题,除了GTMMIMEDocument对象,它不知道它是在哪里获得的,或者是一个库。

我的问题是,如果有人有一个更清洁和/或代码更容易理解,或更好的指导发送电子邮件

我find了解决scheme

 class func sendEmail() { var gtlMessage = GTLGmailMessage() gtlMessage.raw = self.generateRawString() let appd = UIApplication.sharedApplication().delegate as! AppDelegate let query = GTLQueryGmail.queryForUsersMessagesSendWithUploadParameters(nil) query.message = gtlMessage appd.service.executeQuery(query, completionHandler: { (ticket, response, error) -> Void in println("ticket \(ticket)") println("response \(response)") println("error \(error)") }) } class func generateRawString() -> String { var dateFormatter:NSDateFormatter = NSDateFormatter() dateFormatter.dateFormat = "EEE, dd MMM yyyy HH:mm:ss Z"; //RFC2822-Format var todayString:String = dateFormatter.stringFromDate(NSDate()) var rawMessage = "" + "Date: \(todayString)\r\n" + "From: <mail>\r\n" + "To: username <mail>\r\n" + "Subject: Test send email\r\n\r\n" + "Test body" println("message \(rawMessage)") return GTLEncodeWebSafeBase64(rawMessage.dataUsingEncoding(NSUTF8StringEncoding)) } 

如果您的目标是发送电子邮件,我build议使用iOS的MailCore库。 在文档中只有Objective-c中的例子,但它与Swift兼容

这是一个如何使用MailCore和Swift发送邮件的例子:

 var smtpSession = MCOSMTPSession() smtpSession.hostname = "smtp.gmail.com" smtpSession.username = "matt@gmail.com" smtpSession.password = "xxxxxxxxxxxxxxxx" 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){ NSLog("Connectionlogger: \(string)") } } } var builder = MCOMessageBuilder() builder.header.to = [MCOAddress(displayName: "Rool", mailbox: "itsrool@gmail.com")] builder.header.from = MCOAddress(displayName: "Matt R", mailbox: "matt@gmail.com") builder.header.subject = "My message" builder.htmlBody = "Yo Rool, this is a test message!" let rfc822Data = builder.data() let sendOperation = smtpSession.sendOperationWithData(rfc822Data) sendOperation.start { (error) -> Void in if (error != nil) { NSLog("Error sending email: \(error)") } else { NSLog("Successfully sent email!") } } 

根据Google API文档( https://developers.google.com/gmail/api/guides/sending ),我们可以知道有两种方法可以帮助您发送消息成功(draft.send,message.send)。 毫无疑问,他们两人使用API​​都不一样,但结果是一样的。 正如你给上述方式之一可以得到的,我们只是把它叫做message.send。 另一种方式是draft.send,所以我们应该上传“UploadParameters”到Gmail草稿,上传成功之后,我们可以得到一些关于gmail草稿的信息。 最后发送邮件内容,发送成功后,草稿信息会自动删除。 代码如下:

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