Email List
If you downloaded the Gradebook at one time, the PIDs are listed in the file.
If not, you can get the emails from HokieSpa.
- Open HokieSpa
- Navigate to Faculty Access (tab)
- Click "Summary Class List"
- Hit F12 to get to the Developer Tools of the Brower
- Paste the following code into the Console (*You might need to type allow pasting first)
(() => { // Grab all mailto links inside the class list const anchors = document.querySelectorAll('.datadisplaytable a[href^="mailto:"]'); const emails = Array.from(anchors) .map(a => { // Prefer the mailto href, fall back to the visible text const fromHref = (a.getAttribute('href') || '') .replace(/^mailto:/i, '') .split('?')[0]; const fromText = (a.textContent || '').trim(); const raw = (fromHref || fromText).trim(); // Clean: remove trailing '#' some entries have, trim spaces return decodeURIComponent(raw).replace(/\s*#\s*$/, '').trim(); }) .filter(e => e && /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e)); // De-dupe case-insensitively, preserve order const seen = new Set(); const unique = emails.filter(e => { const k = e.toLowerCase(); if (seen.has(k)) return false; seen.add(k); return true; }); const out = unique.join('; '); // Try clipboard API; fallback to a prompt for manual copy (async () => { try { await navigator.clipboard.writeText(out); console.log(`Copied ${unique.length} email(s) to clipboard.`); } catch (err) { console.warn('Clipboard API failed, showing a copy prompt instead.', err); window.prompt(`Copy ${unique.length} email(s):`, out); } console.log(out); })(); })();
- Copy Emails
- Paste into BCC of Email
If you have a big class, you might need to in batches of less than 100.