1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
import { API_URL } from "https://esm.town/v/std/API_URL";
import { parseSendGridEmail } from "https://esm.town/v/stevekrouse/parseSendGridEmail?v=8";
import { parseSendGridEmails } from "https://esm.town/v/stevekrouse/parseSendGridEmails?v=10";
/**
* Send emails. You can only send emails to yourself if
* you’re on Val Town Free. If you’re on Val Town Pro,
* you can email anyone. ([Docs ↗](https://docs.val.town/std/email))
*/
export const email = async (data: {
/**
* The email address(es) to send the email to. Only available to Val Town Pro subscribers.
* Can be a single string, IAddress object, or an array of strings/IAddress objects.
* @default the email of the logged user calling this function.
*/
to?: (IAddress | string)[] | IAddress | string;
/**
* The email address to set as the "from" address. It can only be set to username.valname@valtown.email addresses.
* Can be a string or IAddress object.
* @default notifications@val.town
*/
from?: IAddress | string;
/**
* The email address(es) to CC on the email. Only available to Val Town Pro subscribers.
* Can be a single string, IAddress object, or an array of strings/IAddress objects.
*/
cc?: (IAddress | string)[] | IAddress | string;
/**
* The email address(es) to blind carbon copy (BCC) on the email. Only available to Val Town Pro subscribers.
* Can be a single string, IAddress object, or an array of strings/IAddress objects.
*/
bcc?: (IAddress | string)[] | IAddress | string;
/**
* The subject line for the email.
*/
subject?: string;
/**
* The email address(es) to set as the "reply-to" address.
* Can be a single string, IAddress object, or an array of strings/IAddress objects.
*/
replyTo?: (IAddress | string)[] | IAddress | string;
/**
* The HTML content for the email body.
*/
html?: string;
/**
* The plain text content for the email body.
*/
text?: string;
/**
* An array of attachment data to include with the email.
*/
attachments?: AttachmentData[];
}) => {
let result = await fetch(
`${API_URL}/v1/email`,
{
method: "POST",
body: JSON.stringify({
to: parseSendGridEmails(data.to),
from: data.from && parseSendGridEmail(data.from),
cc: parseSendGridEmails(data.cc),
bcc: parseSendGridEmails(data.bcc),
replyToList: parseSendGridEmails(data.replyTo),
subject: data.subject,
html: data.html,
text: data.text,
attachments: data.attachments,
}),
headers: {
authorization: "Bearer " + Deno.env.get("valtown"),
},
},
).then(r => r.json());
if (result?.message !== "Email accepted to be sent") {
let message = result?.message ?? result?.error ?? JSON.stringify(result);
throw new Error("Val Town Email Error: " + message);
}
return result;
};
export interface IAddress {
email: string;
name?: string;
}
export interface AttachmentData {
content: string;
filename: string;
type?: string;
disposition?: string;
contentId?: string;
👆 This is a val. Vals are TypeScript snippets of code, written in the browser and run on our servers. Create scheduled functions, email yourself, and persist small pieces of data — all from the browser.
Comments
stevekrouse avatar

to - should explain the default is yourself from - should explain the default is notifications@val.town and that you can only set it to username.valname@valtown.email addresses cc - should explain that only available on val town pro bcc - only available on val town pro

For iteration, see what it outputs when referenced in another val, and include that image for review in the PR (somehow) or linear. It's a lot of info, so you may have to be clever about what to include and skip, and how to say it tersely. We could also look at tweaking the setting we have for rendering jsdoc strings...

andreterron avatar

Here's how the top-level object looks like:

Screenshot 2024-03-26 at 12.47.14 PM.png

Here's how the from parameter looks like:

Screenshot 2024-03-26 at 12.49.46 PM.png

Looks like @default and the other directives aren't displayed on the auto-complete, but are displayed on hover. I'll look into displaying them when auto-completing.

stevekrouse avatar

The to field should say "Only available to Val Town Pro subscribers."

Then, ready to merge!