Zig
Zig
BatchModify - Add a Label to each Message in Search Results
See more GMail REST API Examples
Searchs GMail for messages meeting a criteria and adds a label to each message found.Chilkat Zig Downloads
const std = @import("std");
const chilkat = @import("chilkat");
pub fn main(init: std.process.Init) !void {
const alloc = init.arena.allocator();
// This example requires the Chilkat API to have been previously unlocked.
// See Global Unlock Sample for sample code.
const http = try chilkat.Http.init();
defer http.deinit();
http.setAuthToken("GMAIL-ACCESS-TOKEN");
const user_id = "me";
http.setUrlVar("userId", user_id) catch {};
const query = "subject:questions";
http.setUrlVar("query", query) catch {};
var url: [:0]const u8 = "https://www.googleapis.com/gmail/v1/users/{$userId}/messages?q={$query}";
const sb = try chilkat.StringBuilder.init();
defer sb.deinit();
http.quickGetSb(url, sb) catch {
std.debug.print("{s}\n", .{try http.getLastErrorText(alloc)});
return;
};
const json = try chilkat.JsonObject.init();
defer json.deinit();
json.loadSb(sb) catch {};
json.setEmitCompact(false);
std.debug.print("{s}\n", .{try json.emit(alloc)});
if (http.getLastStatus() != 200) {
std.debug.print("Failed.\n", .{});
return;
}
// If successful, the received JSON looks like this:
// {
// "messages": [
// {
// "id": "166f583051d36144",
// "threadId": "166f583051d36144"
// },
// {
// "id": "166f5815e1f36144",
// "threadId": "166f5815e1f36144"
// },
// ...
// {
// "id": "166f580639e36144",
// "threadId": "166f580639e36144"
// },
// {
// "id": "15dbc2e28ec789c6",
// "threadId": "15dbc2e28ec789c6"
// }
// ],
// "nextPageToken": "13434766102274844688",
// "resultSizeEstimate": 103
// }
//
// Next, we'll be sending an HTTP POST to add the label "questions" to each message in the
// search results. The JSON to be sent for the batchModify is this:
// {
// "ids": [
// string
// ],
// "addLabelIds": [
// string
// ],
// "removeLabelIds": [
// string
// ]
// }
// We'll omit "removeLabelIds" because we're not removing any labels.
// We are parsing the JSON search results, and at the same time building the batchModify JSON.
const json2 = try chilkat.JsonObject.init();
defer json2.deinit();
var i: i32 = 0;
const num_messages = json.sizeOfArray("messages");
while (i < num_messages) {
json.setI(i);
const id = try json.stringOf(alloc, "messages[i].id");
json2.setI(i);
json2.updateString("ids[i]", id) catch {};
i = i + 1;
}
// We need the id of the label (not the name).
// I know the name of the label is "questions", but I need to know the id.
// See this example: Get Label Id by Name
// The id of my label named "questions" is "Label_43"
const label_id = "Label_43";
json2.updateString("addLabelIds[0]", label_id) catch {};
json2.updateNewArray("removeLabelIds") catch {};
json2.setEmitCompact(false);
std.debug.print("{s}\n", .{try json2.emit(alloc)});
// Send the batchModify
url = "https://www.googleapis.com/gmail/v1/users/{$userId}/messages/batchModify";
const resp = try chilkat.HttpResponse.init();
defer resp.deinit();
http.httpJson("POST", url, json2, "application/json", resp) catch {
std.debug.print("{s}\n", .{try http.getLastErrorText(alloc)});
return;
};
std.debug.print("status = {d}\n", .{resp.getStatusCode()});
// A 204 response status indicate success.
if (resp.getStatusCode() != 204) {
std.debug.print("{s}\n", .{try resp.getBodyStr(alloc)});
std.debug.print("Failed.\n", .{});
return;
}
// The 204 response has an empty response body..
std.debug.print("BatchModify success!\n", .{});
}