> ## Documentation Index
> Fetch the complete documentation index at: https://help.pipelime.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Import senders from a CSV

> Bulk-add mailboxes you already own, then let the importer verify each one.

export const UiPath = ({children}) => {
  const parts = String(children).split(/\s*(?:→|>)\s*/).filter(Boolean);
  return <span className="pl-path">
      {parts.map((part, index) => <span key={`${index}-${part}`}>
          {index > 0 && <span className="pl-path__sep">→</span>}
          {part}
        </span>)}
    </span>;
};

export const Screenshot = ({id, alt, caption, frame = 'browser', url, marks = [], lang = 'en', workspace = 'northwind-outbound'}) => {
  const src = `/images/screenshots/${lang}/${id}.png`;
  const chrome = url ? `app.pipelime.ai/${workspace}${url}` : 'app.pipelime.ai';
  return <figure className={`pl-shot pl-shot--${frame} not-prose`}>
      <div className="pl-shot__frame">
        {frame !== 'bare' && <div className="pl-shot__bar">
            <span className="pl-shot__dots">
              <span className="pl-shot__dot" />
              <span className="pl-shot__dot" />
              <span className="pl-shot__dot" />
            </span>
            <span className="pl-shot__url">{chrome}</span>
          </div>}
        <div className="pl-shot__media">
          <img src={src} alt={alt} loading="lazy" />
          {marks.map(mark => <span key={mark.n} className="pl-shot__mark" style={{
    left: `${mark.x}%`,
    top: `${mark.y}%`
  }} aria-hidden="true">
              {mark.n}
            </span>)}
        </div>
      </div>
      {caption && <figcaption className="pl-shot__caption">{caption}</figcaption>}
    </figure>;
};

Upload a CSV of mailboxes you already run, and each row becomes an email account in this workspace, verified the same way as one you connect by hand.

<div className="pl-availability">
  <div className="pl-availability__row">
    <div className="pl-availability__label">Where</div>
    <div className="pl-availability__value"><span className="pl-path">Integrations<span className="pl-path__sep">→</span>Integrations<span className="pl-path__sep">→</span>Email Accounts</span></div>
  </div>

  <div className="pl-availability__row">
    <div className="pl-availability__label">Your role needs</div>
    <div className="pl-availability__value">Read access to Email Accounts <code>read-senders</code>. Admin, Member and Viewer have it by default.</div>
  </div>

  <div className="pl-availability__row">
    <div className="pl-availability__label">To create or change</div>
    <div className="pl-availability__value"><code>create-senders</code> to add one, <code>update-senders</code> to change one, on top of the permission above.</div>
  </div>

  <div className="pl-availability__note">If you cannot find this in your sidebar, your workspace may have a custom menu configuration. Contact support and we will check it for you.</div>
</div>

## Before you begin

* Every account you import lands in the workspace you're currently in. Switch workspaces first if you keep more than one.
* Ten fields are required: the address, a first name, and the IMAP and SMTP host, username, password and port. Your file needs fewer columns than that. Both usernames are filled from the address column, and one password column is copied across to the other protocol, so address, first name, both hosts, both ports and a single password resolve all ten. Last name, a signature and a tracking domain are optional. [Connecting a mailbox by hand](/en/email-accounts/connect-other-smtp) asks for the same technical details, if you need to look any of them up first.
* A row whose address is already an email account in this workspace updates that account rather than adding a second one: the file's server settings, password and name replace what is stored, this batch's limit and delay replace the account's own, and this batch's sending windows are added to the ones it already has.
* An address that belongs to an email account in a *different* workspace cannot be imported. That row fails and nothing is created for it.

## Steps

<Steps>
  <Step title="Open the import wizard">
    From Email Accounts (<UiPath>Integrations → Integrations → Email Accounts</UiPath>), open **Add senders**
    and choose the **Import senders** card: its button reads **Import CSV**. With no email accounts at all,
    the empty page puts the same route one click closer: an **Import Senders** button sits right next to
    **Add senders**.

    The same panel also connects a single mailbox you own, and, in workspaces that offer it, orders
    infrastructure we set up for you. Both are covered on the Add senders page, linked below.
  </Step>

  <Step title="Upload your CSV">
    Drop a file onto the panel, or use **Browse files** to pick one. The file has to be a `.csv`, and one
    with no rows under its header is rejected too. **Download template CSV** (1) gives you a starting file
    with columns already named to match.

    <Screenshot id="email-accounts/import-senders-csv--upload" url="/senders" alt="The CSV upload panel: a dashed dropzone, a Browse files button, and a Download template CSV link underneath" caption="Whatever your own columns are called, the next step tries to match them to what we need before it asks you to." marks={[{ n: 1, x: 50, y: 84 }]} />

    <Note>
      That template also carries `smtp_type`, `imap_type` and `daily_limit` columns, and none of the three is
      a field this importer maps. Nothing outside the ten required and three optional fields is read. We work
      out each mailbox's encryption from the port instead: IMAP `993` is TLS, SMTP `587` is TLS and `465` is
      SSL, anything else is none. The daily limit is set once for the whole batch, on the review screen.
    </Note>
  </Step>

  <Step title="Match your columns, if it asks">
    Your header names are matched to our fields automatically as soon as the file uploads. When all ten
    required fields resolve this way, this screen is skipped and you land straight on the review below:
    **Back** from there always returns here anyway, so the mapping stays reachable even on a run that
    skipped it.

    When something doesn't resolve, pick the CSV column for each field yourself, from a dropdown per field.
    Two fields may point at the same column, which is how one password column covers both protocols.
    **Continue** stays off until every required field has a column.
  </Step>

  <Step title="Review and set sending defaults">
    The review screen previews the first five rows as they will be mapped, and counts the rows it is about to
    import. A collapsed panel underneath sets the daily send limit and the random delay between emails every
    imported account starts with. Change either per account afterwards. The submit button counts the rows in
    your file, and stays off while an address in it is malformed or repeated, or while the minimum delay is
    not below the maximum.
  </Step>

  <Step title="Watch it import">
    Submitting uploads the file and queues one job per row. Each job checks that row's server details and
    password first, then saves the account and gives it this batch's sending schedule. The bar moves with rows
    that have actually finished; the three lines narrated above it advance on a timer and are not a report of
    where the importer has got to.

    <Screenshot id="email-accounts/import-senders-csv--processing" url="/senders" alt="The import progress screen mid-run: a narrated step ticker above a determinate progress bar" caption="What this doesn't show: a row that fails verification is still created, just not as an account ready to send." />
  </Step>
</Steps>

## What happens next

<Check>
  The panel lands on a result screen: a single count when every row went through, or a split of imported
  against failed when some rows didn't. **Done** closes the panel and refreshes Email Accounts, so every
  account you added is already there.
</Check>

A row that imports isn't automatically ready to send. We verify its password and server details on the way in,
and a row that fails that check is created anyway: it just lands in Error status rather than Active, the same
as a mailbox connected by hand with the wrong details. The wizard's own success count doesn't tell the two
apart, so check the status column on Email Accounts, not just the result screen.

If the run itself fails rather than any single row, you get **Import failed** and the reason instead of either
count, and **Back to review** puts you back on the review screen with the file still loaded.

Sender imports are listed behind the **Imports** button on Email Accounts, newest first: the ones you ran in
this workspace, not your colleagues', and the most recent rather than all of them. A run that failed outright
gets a button on its row, labelled **Retry** on hover, that starts it again from the file already uploaded. A
run that finished with some rows failed gets no such button, so those rows have to go in a fresh file. Retry is
refused when the workspace has no credits left, and the subscription prompt opens instead.

<Screenshot id="email-accounts/import-senders-csv--imports-dialog" url="/senders" alt="The Imports dialog on Email Accounts, open with no import runs yet in this workspace" caption="A representative example: the run list behind this dialog is simulated empty, because no demo workspace can be left without a run. Runs land here once you've made one, each with its row counts and, on a failure, the reason." />

## Troubleshooting

<AccordionGroup>
  <Accordion title="Some imported accounts show Error, not Active">
    The result screen still counts those as imported: the row was created, we just couldn't verify it. Either
    the password or the server details are wrong for that mailbox, or the row carried a tracking domain whose
    DNS record doesn't resolve yet, which puts the account in Error on its own even when the mailbox itself
    answers. Check the status column on Email Accounts after any run, not only the count the import reports,
    and see [Sender statuses](/en/email-accounts/sender-statuses).
  </Accordion>

  <Accordion title="A row counted as failed and no account appeared">
    Failed rows are the ones nothing was created for. The cause you can fix is an address that already belongs
    to an email account in another workspace: an address can only be an email account in one workspace at a
    time, so that row is skipped. Remove it from the file, or delete the account from the other workspace
    first. The run's failed count sits on its row in the **Imports** list.
  </Accordion>

  <Accordion title="Continue, or the submit button, stays off">
    Three different checks block it. On the Match columns screen it's a required field with no CSV column
    chosen: fix that in place, by picking a column in that field's dropdown. On the review screen it's either
    an address in your file that isn't a valid email or repeats another row, or a minimum delay that isn't
    below the maximum. The delay you fix in the sending defaults panel; the addresses you can't fix here, so
    press **Back** to Upload (twice, from the review screen), correct the file and add it again.
  </Accordion>
</AccordionGroup>

## Related

<CardGroup cols={2}>
  <Card title="Add senders: connect, import or managed infrastructure" icon="layers" href="/en/email-accounts/add-senders">
    The routes out of the Add senders panel, what each one gives you, and how to choose between them.
  </Card>

  <Card title="Sender statuses: Active, Paused, Error and the chips" icon="circle-check" href="/en/email-accounts/sender-statuses">
    Three states, who can set each one, and the extra chips that outrank the status on a row.
  </Card>

  <Card title="Bulk actions on email accounts" icon="list-check" href="/en/email-accounts/bulk-actions">
    Select several mailboxes and activate, pause, delete or edit their limits, schedule and signature at once.
  </Card>
</CardGroup>
