我正在尝试使用gmail api阅读电子邮件。但身体信息的格式是不可读的。
static void Main(string[] args)
{
UserCredential credential;
using (var stream =
new FileStream("client_secret.json", FileMode.Open, FileAccess.Read))
{
string credPath = System.Environment.GetFolderPath(
System.Environment.SpecialFolder.Personal);
credPath = Path.Combine(credPath, ".credentials/gmail-dotnet-quickstart.json");
credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
GoogleClientSecrets.Load(stream).Secrets,
Scopes,
"user",
CancellationToken.None,
new FileDataStore(credPath, true)).Result;
Console.WriteLine("Credential file saved to: " + credPath);
}
// Create Gmail API service.
var service = new GmailService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential,
ApplicationName = ApplicationName,
});
UsersResource.MessagesResource.ListRequest request = service.Users.Messages.List("me");
IList<Message> messages = request.Execute().Messages;
if (messages != null && messages.Count > 0)
{
foreach (var messageItem in messages)
{
var readMessage = service.Users.Messages.Get("me", messageItem.Id).Execute();
var body = readMessage.Payload.Parts[0].Body.Data;
}
} }
当我调试我的测试应用程序时,body变量得到值:
body "DQpLaW5kIFJlZ2FyZHMsDQoNCldpbGwNCg0KV2lsbCBLZWx0eQ0KMzIzLjI1Mi44Njk5DQp3a2VsdHlAZ21haWwuY29tIDxtYWlsdG86d2tlbHR5QGdtYWlsLmNvbT4NCmh0dHBzOi8vd3d3LmZhY2Vib29rLmNvbS9iaWdibHVlZG93bnRvd24gPGh0dHBzOi8vd3d3LmZhY2Vib29rLmNvbS9iaWdibHVlZG93bnRvd24-DQp3d3cubWV0cm9saWZlcHJvcGVydGllcy5jb20gPGh0dHA6Ly93d3cubWV0cm9saWZlcHJvcGVydGllcy5jb20vPg0KDQpCZWdpbiBmb3J3YXJkZWQgbWVzc2FnZToNCg0KRnJvbTogIkNSRVhpIiA8bm90aWZpY2F0aW9uc0BjcmV4aS5jb20-DQpTdWJqZWN0OiBJbmR1c3RyaWFsIENSRSBBc3NldHMgRm9yIFNhbGUgfCBHcmVhdCBPaGlvIExvY2F0aW9ucyB8IEVhc3kgQWNjZXNzIHwgTkFJIFNwcmluZw0KRGF0ZTogSnVseSAxNCwgMjAxNyBhdCA5OjAxOjQwIEFNIFBEVA0KVG86IHdrZWx0eUBnbWFpbC5jb20NClJlcGx5LVRvOiBpbmZvQGNyZXhpLmNvbQ0KDQogPGh0dHA6Ly9lbWFpbC1saW5rcy5jcmV4aS5jb20vd2YvY2xpY2s_dXBuPWpvS3FmZnZFU3Y1RDU2eXI3cmpPd2lBREcwN3p4ek1EdnI0ZnNsdEY5QWJIT1Z1V2JrU0ZhWXN4aTNXY2hucE11SmhUTUlDZjQ3WVo5bDBoY0RtSGZ2NFl0VXJoN1g2TDh2ZzdMQnlkZi0yQmZzOFZSYVk5UGJyYzg4YjdsT1NRUDZfMGxhbklERktDMWU0bHUtMkZZZjdLNjA1d2ZJOWZHdXp2amlNdjYwUERQNFVCTzd5cjRBTHVjTW8tMkZpRDFadXFSTUV5Z2RISVBhRGU3M2FGeGhLS1hBaS0yRlo5UlVzVFhzampqVS0yRndZN1lIa045M1BQRnlaNEQ1QTBQRHlzSElxMWdIYlQtMkJJRWYtMkZRMDBUQU8yV0lMNC0yQlFVU2hueDlhVnhWSXc5NjRFYmNta0FVVDB5SWhqTXl5Mm9na29FWTR5QWZ1czhUQWVJZDBsU0RXMVBMQi0yQmctMkYxMUJRY3gzYWRoYmJxcG1Ma2FGdTdXU3U1STFkQmJjaXN5bW5tcHIyWXVpdTNOdHdiOFpsTm5jLTJGSDdrdThYU3FxTVdIOHhsWFA2Ykp0VTdVYVN4M2IxcVBITlNDblNDYWRhSkEyeEw0MVlGMjFlTm8wcEZXWTVVQk9LengzYkctMkI4V0g2QXpNR1FkNDJhZS0yRkFMN3c1VkxrSlZ1LTJGdTFlR0lNYjBkV3VmdnZkemlXVjgtMkZHcy0yQks1a3BYUi0yQmJhTUwzUE5NTFhpMWRHUjhEWEZndzh1WGZMSFdNUmc0R2Y2MWMwb2JNUEQtMkI4c1QtMkJ1NTFtRj4JDQogDQogPGh0dHA6Ly9lbWFpbC1saW5rcy5jcmV4aS5jb20vd2YvY2xpY2s_dXBuPVVnWW9yUXo0" string
有谁知道为什么?
由于
答案 0 :(得分:5)
更改此行
var body = readMessage.Payload.Parts[0].Body.Data;
到
var body = Base64UrlDecode(readMessage.Payload.Parts[0].Body.Data);
在代码中添加此方法:
public static string Base64UrlDecode(string input)
{
if (string.IsNullOrWhiteSpace(input))
return "<strong>Message body was not returned from Google</strong>";
string InputStr = input.Replace("-", "+").Replace("_", "/");
return System.Text.Encoding.UTF8.GetString(Convert.FromBase64String(InputStr));
}
此外,要处理多部分而不返回多部分,您可以使用以下代码:
if (ml.Payload.Parts != null) {
foreach (void bParts_loopVariable in ml.Payload.Parts) {
bParts = bParts_loopVariable;
if (bParts.MimeType == "text/html") {
if (bParts.Body != null) {
dynamic mp = bParts.Body;
if (mp != null) {
return Base64UrlDecode(mp.Data);
}
}
}
}
} else {
return Base64UrlDecode(ml.Payload.Body.Data);
}
答案 1 :(得分:0)
正文是Base64编码的。
您需要调用Convert.FromBase64String(string)来获取纯文本。
答案 2 :(得分:0)
您应该使用readMessage.GetRaw()
方法。请参阅下文如何解码base64字符串:
byte[] data = Convert.FromBase64String(readMessage.GetRaw());
string messageString = Encoding.UTF8.GetString(data);
参见ref https://developers.google.com/gmail/api/v1/reference/users/messages/get