最近我的项目添加了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
}
}
`
关于swift - Gmail API : How to send attachments to the drafts on swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34264614/
当我将time.Now()编码到JSON对象时,它给出的结果为"2009-11-10T23:00:00Z"但打印时间。现在给出2009-11-1023:00:00+0000UTC。他们为什么不同。什么是T和Z。另外,如何根据this将其转换为swiftNSDate对象?表? 最佳答案 这些值的含义无关紧要,它们是该格式(ISO8601)的一部分。有几种方法可以解决这个问题。一种是为时间或您的结构定义自定义MarshalJSON()方法并使用它来格式化日期,另一种是首先在您的结构中将其表示为字符串,以便当默认实现执行你得到你正在寻找的
在C/C++/Java/Go中,我们使用,来分隔参数:(aint,bint)在ObjectiveC中,我们使用:来表示参数::(int)a:(int)b在Swift中,我们必须同时使用:和,:(a:int,b:int)是否需要冗余? 最佳答案 Swift可能有外部和内部参数名称:(externalinternal:Int)如果没有独特的分隔符,会产生很多歧义。 关于objective-c-为什么Swift函数定义语法是多余的?,我们在StackOverflow上找到一个类似的问题:
我的Swift应用程序与用Go编写的服务器通信。我希望使用Zlib压缩传输的数据,但压缩结果似乎与Swift和Go不同。这是Go版本:sourceString:="A-t-ellebesoind'autrespreuves?Acceptez-lapourleplaisir.J'aitantfaitquedelacueillir,Etc'estpresqueunefleur-des-veuves."//Compressionvarbbytes.Bufferwriter:=zlib.NewWriter(&b)writer.Write([]byte(sourceString))writer.
我正在使用rsaEncryptionOAEPSHA256AESGCM在iOS上使用SecKeyCreateEncryptedData加密一些数据,然后在golang后端解密相同的数据。我正在使用3072位rsa公钥来加密对称key。当我从iOS获取数据到后端时,我能够成功解密对称key,但gcm标签验证失败。我使用的是与iOS相同的16字节IV,但不知道iOS在加密时是否使用任何aad(附加身份验证数据)。有谁知道rsaEncryptionOAEPSHA256AESGCMforiOS是否使用了一些aad?这适用于iOS10+。我已经尝试过使用nil、空的16字节数组、aeskey本身、
我使用swiftyJSON从apiurl消费OData。这里的apiurl与VPN连接。并且apiurl看起来像http://192.xxx.xx.xx:8000/sap/opu/odata/sap/Z_SRV/PRListSetSet?$format=json当我在模拟器中运行时,我可以从odataapiurl获取数据,但是在设备中运行时,没有从odataapiurl接收到数据。由于没有vpn连接到移动设备。我如何以编程方式对我的VPN进行硬编码以在移动设备中接收数据?这是我如何从ODataapiurl获取数据:typealiasServiceResponse=(JSON,Error
我正在开发一个涉及一些XML解析的自定义框架,使用Kanna框架。每当我尝试将我的框架导入playground时,playground就会崩溃并出现以下错误:Playgroundexecutionfailed:expressionfailedtoparse,unknownerror*thread#1:tid=0x4e9448,0x00000001074bf360com.apple.dt.Xcode.PlaygroundStub-macosx`executePlayground,queue='com.apple.main-thread',stopreason=breakpoint1.1*
我尝试在Windows10上的Ubuntu上的bash上安装Swift4我的Ubuntu版本:我@DESKTOP:~$lsb_release-a没有可用的LSB模块。经销商ID:Ubuntu描述:Ubuntu16.04.3LTS发布:16.04代号:xenial我做了apt-getupgrade和apt-getupdate我遵循Linux步骤here:安装Swift4最终我得到了错误:我@DESKTOP:~$swift/home/me/swift4/swift-4.0.2-RELEASE-ubuntu16.04/usr/bin/lldb:加载共享库时出错:libpython2.7.so
概述音视频采集是直播架构的第一步音视频采集包括两部分视频采集音频采集iOS开发中,同音视频采集相关API都封装在AVFoundation中,导入该框架,即可实现音频、视频的同步采集采集步骤采集步骤文字描述导入框架同采集相关API在AVFoundation中,因此需要先导入框架创建捕捉会话(AVCaptureSession)会话:用于连接输入源、输出源输入源:摄像头、麦克风输出源:对应的视频、音频数据设置视频输入源、输出源输入源(AVCaptureDeviceInput):从摄像头输入(前置/后置)输出源(AVCaptureVideoDataOutput):可从代理方法中拿到数据将输入源、输出源
前言本期是Swift编辑组自主整理周报的第七期,每个模块已初步成型。各位读者如果有好的提议,欢迎在文末留言。欢迎投稿或推荐内容。目前计划每两周周一发布,欢迎志同道合的朋友一起加入周报整理。当你来到双水村以外的大世界,你的人生目标便不单单是一名庄稼人了。Swift社区陪你一起成长,一起创造更多可能!👊👊👊周报精选新闻和社区:【挑战上岛】适配实时活动和灵动岛提案:函数反向部署Swift论坛:围绕Swift6lock展开的讨论推荐博文:推荐500+款AppUI设计工具推荐:妙言话题讨论:如果您年龄超过35岁被裁员,再入职时能接受降薪吗?新闻和社区挑战上岛:适配实时活动和灵动岛Apple大中华区设计与
我的swiftmailer有问题,它没有向用户发送消息我将库提取到我网站的inc文件夹并创建了以下消息供swiftmailer发送:注意:如果您可以建议除SwiftMailer之外的其他解决方案,请发表评论。require_once'inc/lib/swift_required.php';//CreatetheTransport$transport=Swift_SmtpTransport::newInstance('mail.mywebsite.com',25)->setUsername('info@mywebsite.com')->setPassword('myPassword');