How do I add multiple addresses to a Contact List?

Dunn, Matthew 20 Reputation points
2025-08-11T19:01:05.7766667+00:00

I go: PEOPLE > NEW CONTACT > NEW CONTACT LIST.

How do I add multiple email addresses to the list all at once?

(Yes, I have tried importing a CSV file with UTF-8 encoding. It never works. So, please, do not suggest this.)

Thanks!

Outlook | Web | Outlook.com | Contacts
0 comments No comments
{count} votes

Accepted answer
  1. Sin-D 1,855 Reputation points Microsoft External Staff Moderator
    2025-08-12T01:43:03.9066667+00:00

    Hello Dunn,

    Thank you for reaching out!

    Currently, Outlook on the web does not provide a direct option to bulk-add multiple email addresses to a new contact list in one step (other than the CSV import, which you’ve already tried). However, you can try apply this to add multiple email addresses for Web version:

    • Open Outlook Web and go to People > New Contact List.
    • In the Add email addresses field, click once so it’s active (please make sure don't forget this step)
    • Press F12 (or right-click → Inspect) to open Developer Tools.
    • Go to the Console tab.
    • Paste this snippet (sometimes, you need to write allow pasting first in Console):
    (() => {
    	const ADDRESSES_TEXT = ` user1@example.com, user2@example.com, user3@example.com, user4@example.com `.trim();
    	const SEPARATOR_TO_FORCE_COMMIT = '; ';
    	const SUGGESTION_APPEAR_TIMEOUT = 3000
    	const AFTER_CLICK_SETTLE_DELAY  = 200;
    	const BETWEEN_ITEMS_DELAY       = 220;
    	const ADD_ENABLE_TIMEOUT        = 2500;
    	const ADD_LABELS = [     'add','thêm','ajouter','añadir','hinzufügen','aggiungi','adicionar','добавить','添加','追加','추가'   ];
    	const sleep = ms => new Promise(r => setTimeout(r, ms));
    	const visible = el => !!(el && el.offsetParent !== null && getComputedStyle(el).visibility !== 'hidden');
    	const active = document.activeElement;
    	let input = (active && (active.tagName === 'INPUT' || active.tagName === 'TEXTAREA'))     ? active     : (active && active.querySelector && active.querySelector('input,textarea'));
    	if (!input) { alert('Click into the "Add email addresses" field once, then run again.'); return; }
    	const setReactValue = (el, value) => {
    		const proto = Object.getPrototypeOf(el);
    		const setter =       
    			Object.getOwnPropertyDescriptor(proto, 'value')?.set || Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value')?.set;     
    		setter.call(el, value);     
    		el.dispatchEvent(new Event('input', { bubbles: true }));   };   
    	const clickLikeAUser = (el) => {     
    		el.dispatchEvent(new PointerEvent('pointerdown', { bubbles: true }));     
    		el.dispatchEvent(new MouseEvent('mousedown',     { bubbles: true }));     
    		el.dispatchEvent(new PointerEvent('pointerup',   { bubbles: true }));     
    		el.dispatchEvent(new MouseEvent('mouseup',       { bubbles: true }));     
    		el.dispatchEvent(new MouseEvent('click',         { bubbles: true }));   };
    	const findSuggestions = () => {    
    		let root = input.closest('[role="dialog"], [data-is-focusable], .ms-Layer, .ms-Callout') || document;     
    		let list = root.querySelector('[role="listbox"]');     
    		if (!list) list = document.querySelector('[role="listbox"]');     
    		return list && visible(list) ? list : null;   };   
    	const getSuggestionOptions = () => {     
    		const list = findSuggestions();     
    		if (!list) return [];
    		const opts = Array.from(list.querySelectorAll('[role="option"], .ms-Suggestions-itemButton, button[role="option"]')).filter(visible);     
    		return opts;   };
    		const findAddButton = () => {     
    			const scope = input.closest('div[role="dialog"], [data-automationid], .ms-Panel, .root-') || document;     
    			const cands = Array.from(scope.querySelectorAll('button, [role="button"]')).filter(visible);     
    			for (const b of cands) {       
    				const label = (b.getAttribute('aria-label') || b.getAttribute('title') || b.textContent || '').trim().toLowerCase();       
    				const looksAdd = ADD_LABELS.some(k => label.includes(k));       
    				if (looksAdd) return b;     }          
    			return cands.find(b => /\bms-Button--primary\b/.test(b.className) && !b.disabled) || null;   };   
    		const waitForAddEnabled = async (btn, timeoutMs) => {     
    		const start = Date.now();     
    		while (Date.now() - start < timeoutMs) {       
    			if (btn && !btn.disabled && btn.getAttribute('aria-disabled') !== 'true' && visible(btn)) return true;       
    			await sleep(120);     }     
    		return false;   };   
    	const addresses = ADDRESSES_TEXT.split(/[,\n;]+/).map(s => s.trim()).filter(Boolean);   
    	(async () => {     
    		input.focus();     
    		for (const addr of addresses) {       
    			setReactValue(input, addr);       
    			await sleep(140);       
    			let clickedSuggestion = false;       
    			const t0 = Date.now();       
    			while (Date.now() - t0 < SUGGESTION_APPEAR_TIMEOUT && !clickedSuggestion) {         	const options = getSuggestionOptions();         
    			if (options.length) {           
    				const lower = addr.toLowerCase();           
    				const match = options.find(o => (o.innerText || o.textContent || '').toLowerCase().includes(lower)) || options[0];           
    				clickLikeAUser(match);           
    				clickedSuggestion = true;           
    				break;         
    			}         
    			await sleep(120);       
    		}       
    		let committed = false;       
    		const addBtn = findAddButton();       
    		if (addBtn) {         
    			const ok = await waitForAddEnabled(addBtn, ADD_ENABLE_TIMEOUT);         
    			if (ok) {           
    				clickLikeAUser(addBtn);           
    				committed = true;           
    				await sleep(AFTER_CLICK_SETTLE_DELAY);         
    			}       
    		}              
    		if (!committed && !clickedSuggestion) {         
    			setReactValue(input, addr + SEPARATOR_TO_FORCE_COMMIT);         
    			await sleep(140);         
    			input.blur();         
    			await sleep(160);         
    			input.focus();       
    		}       
    		await sleep(BETWEEN_ITEMS_DELAY);     
    	}     
    	input.blur();     
    	console.log(`✅ Processed ${addresses.length} address(es) via suggestion click + Add button (with fallback).`);   
    })(); })();
    
    
    

    Note: Please change userX@example.com to your real email addresses. You can use AI or any tools to create format 'user1@example.com, user2@example.com, ...'. Then replace it in this part of above code:

    ADDRESSES_TEXT = ` user1@example.com, user2@example.com, user3@example.com, user4@example.com `.trim();
    

    If the issue persists, please let me know. I’ll be happy to guide you further.

    If the answer is helpful, please click "Accept Answer" and kindly upvote it. If you have extra questions about this answer, please click "Comment". 

    Note: Please follow the steps in our documentation to enable e-mail notifications if you want to receive the related email notification for this thread. 

    Best regards,

    Sin Dau

    1 person found this answer helpful.

0 additional answers

Sort by: Most helpful

Your answer

Answers can be marked as Accepted Answers by the question author, which helps users to know the answer solved the author's problem.