【问题标题】:Decode Email body in GMAIL (ios)在 GMAIL (ios) 中解码电子邮件正文
【发布时间】:2015-09-25 04:44:14
【问题描述】:

我在阅读来自 GMAIL 的电子邮件时遇到问题。

这是我收到每封电子邮件的方式:

- (void)displayResultMessageWithTicket:(GTLServiceTicket *)ticket
                    finishedWithObject:(GTLGmailMessage *)email
                                 error:(NSError *)error
{
    if (error == nil) {
        NSMutableString *labelString = [[NSMutableString alloc] init];

        GTLGmailMessagePart* payload=email.payload;
        NSLog(@"payload =%@",payload);

        for(GTLGmailMessagePart* part in payload.parts)
        {
            GTLGmailMessagePartBody* body = part.body;
            NSLog(@"body =%@",body);
            NSLog(@"data =%@",body.data);
        }
        self.output.text = labelString;
    }
    else
    {
        [self showAlert:@"Error" message:error.localizedDescription];
    }
}

我认为 body 是用 base64 之类的东西编码的,但我不确定。

这是我得到的一个例子:

Q3J1bmNoIERhaWx5DQoNClRvZGF5J3MgVG9wIFN0b3JpZXMgLy8gSnVsIDYsIDIwMTUgUmVhZCBtb3JlIGF0IHRlY2hjcnVuY2guY29tIDwjPiBJZiB5b3UgZG8gbm90IHdhbnQgdG8gcmVjZWl2ZSB0aGlzLCB5b3UgY2FuIHVuc3Vic2NyaWJlIHdpdGggb25lIGNsaWNrIGhlcmUgPGh0dHA6Ly9saW5rLnRlY2hjcnVuY2guY29tLzU0ZWQ3ZDc2ZmExM2ExYWQyMjhiNTA2ZjJzcGJnLmc4aS9VQnJ0TnFndnVHMEFyVWxLQjA5YWQ-Lg0KDQpUZWNoQ3J1bmNoIDQxMCBUb3duc2VuZCBTdHJlZXQsIFNhbiBGcmFuY2lzY28sIENBIDk0MTA3DQoNCsKpIDIwMTIgQU9MIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gUHJpdmFjeSBQb2xpY3kgPGh0dHA6Ly9saW5rLnRlY2hjcnVuY2guY29tLzU0ZWQ3ZDc2ZmExM2ExYWQyMjhiNTA2ZjJzcGJnLmc4aS9VQnJ0TnFndnVHMEFyVWxLQ2NiNWE-IFRlcm1zIG9mIFNlcnZpY2UgPGh0dHA6Ly9saW5rLnRlY2hjcnVuY2guY29tLzU0ZWQ3ZDc2ZmExM2ExYWQyMjhiNTA2ZjJzcGJnLmc4aS9VQnJ0TnFndnVHMEFyVWxLRDRkZjU-DQoNCklmIHlvdSBiZWxpZXZlIHRoaXMgaGFzIGJlZW4gc2VudCB0byB5b3UgaW4gZXJyb3IsIHBsZWFzZSBzYWZlbHkgdW5zdWJzY3JpYmUgPGh0dHA6Ly9saW5rLnRlY2hjcnVuY2guY29tL29jLzU0ZWQ3ZDc2ZmExM2ExYWQyMjhiNTA2ZjJzcGJnLmc4aS84YzIyN2ZiNz4u

如何解码??

【问题讨论】:

标签: ios google-api gmail-api


【解决方案1】:

消息的正文是 base64url 编码的。在base64解码之前,您需要在编码字符串中将“_”替换为“/”,将“-”替换为“+”。

【讨论】:

    【解决方案2】:

    补充弗汉的回答

    var parts = eachItem.payload.parts
    let body: AnyObject? = parts[0].valueForKey("body")
    var base64DataString =  body!.valueForKey("data") as! String
    base64DataString = base64DataString.stringByReplacingOccurrencesOfString("_", withString: "/", options: NSStringCompareOptions.LiteralSearch, range: nil)
    base64DataString = base64DataString.stringByReplacingOccurrencesOfString("-", withString: "+", options: NSStringCompareOptions.LiteralSearch, range: nil)
    
    let decodedData = NSData(base64EncodedString: base64DataString, options:NSDataBase64DecodingOptions(rawValue: 0))
    let decodedString = NSString(data: decodedData!, encoding: NSUTF8StringEncoding)
    println(decodedString)
    

    【讨论】:

      【解决方案3】:

      有一个 GTL API 可以解码 OOTB。 这是我的工作代码。

      //... get part
      let body : GTLGmailMessagePartBody = part.body
      let bodyAttachmentId = body.attachmentId
      let bodyData : String! = body.data
      let bodySize = body.size
      
      //Use GTLDecodeWebSafeBase64
      if bodyData != nil
      {
          let decodedData = GTLDecodeWebSafeBase64(bodyData)
          let decodedString = NSString(data: decodedData!, encoding: NSUTF8StringEncoding)
      
          print("after decoded: \(decodedString)")
      }
      

      【讨论】:

        【解决方案4】:
        if let bodyPart = message.payload?.parts.filter({ $0.mimeType == "text/html" }).first, let bodyDataEncoded = bodyPart.body?.data {
            logger(bodyPart.body?.size)
            let base64Encoded = bodyDataEncoded.replacingOccurrences(of: "_", with: "/").replacingOccurrences(of: "-", with: "+")
            let data = Data(base64Encoded: base64Encoded)
            logger(data?.count)
        }
        

        你可以在 webview 中加载数据

        webView.load(data, mimeType:mimeType, textEncodingName: "", baseURL: baseUrl)
        

        查看更多:https://developers.google.com/gmail/api/v1/reference/users/messages#resource

        【讨论】:

          猜你喜欢
          • 2017-10-28
          • 2018-07-28
          • 1970-01-01
          • 2014-05-15
          • 2018-03-03
          • 2020-12-23
          • 2021-06-03
          • 2012-12-11
          • 2017-03-07
          相关资源
          最近更新 更多