Loading...
Loading...
Use the `googlemail-client` mops package whenever the user asks the canister to send email, compose a draft, list or read Gmail messages, or fetch the authenticated user's Gmail profile. The package wraps the Gmail REST API v1 at `https://gmail.googleapis.com` via outbound HTTPS calls.
npx skill4agent add caffeinelabs/skills connector-googlemailgmail_users_messages_sendgmail_users_drafts_{create,send,get,list}gmail_users_messages_{get,list}gmail_users_getProfileApis/UsersApi.mo#Err("auth_expired")messages.sendhttps://www.googleapis.com/auth/gmail.sendhttps://www.googleapis.com/auth/gmail.readonlyimport { gmail_users_messages_send; gmail_users_getProfile;
gmail_users_drafts_create; gmail_users_drafts_send }
"mo:googlemail-client/Apis/UsersApi";
import { Message; type Message } "mo:googlemail-client/Models/Message";
import { Draft; type Draft } "mo:googlemail-client/Models/Draft";
import { defaultConfig } "mo:googlemail-client/Config";
import Text "mo:core/Text"; // Text.encodeUtf8: build the raw RFC 2822 Blob
// Shared cfg — swap in the caller's short-lived bearer token.
let cfg = {
defaultConfig with
auth = ?#bearer "<off-chain OAuth2 access token>";
max_response_bytes = ?500_000;
is_replicated = ?false; // non-replicated: required for sends (see Notes); reads too
};
// Send a message. `raw` is the PLAIN RFC 2822 message as a Blob — the client
// base64-encodes it for the Gmail API; do NOT base64-encode it yourself.
let mime : Text = "From: me\r\nTo: friend@example.com\r\nSubject: Hi\r\n\r\nHello!";
let outMsg = Message.init {}; // all-null base, then layer fields:
let envelope : Message = { outMsg with raw = ?Text.encodeUtf8(mime) };
let result = await* gmail_users_messages_send(cfg,
"me", // userId: "me" = authenticated user
#_1_, // $.xgafv — use #_1_ (v1) for all calls
"", // accessToken — leave "" when auth = ?#bearer above
#json, // alt
"", "", "", "", true, "", "", "", // callback/fields/key/oauthToken/prettyPrint/quotaUser/uploadProtocol/uploadType
envelope
);
// Get the authenticated user's email address
let profile = await* gmail_users_getProfile(cfg, "me",
#_1_, "", #json, "", "", "", "", true, "", "", "");
let ?email = profile.emailAddress else return #Err("no email");is_replicated = ?falsegmail_users_messages_sendgmail_users_drafts_sendidDatenullgmail_users_messages_listgmail_users_messages_getgmail_users_getProfile?false$.xgafv#_1_alt#jsoncallbackfieldskeyoauthTokenquotaUseruploadProtocoluploadType""prettyPrintfalseuserId"me"https://mail.google.com/Blobraw?Text.encodeUtf8(mime)rawMessage.payloadMessagePart#Err("auth_expired")Draft.messageMessagegmail_users_drafts_creategmail_users_drafts_sendidmax_response_bytesdefaultConfig.cycles = 30_000_000_000InsufficientCycles