# send

Send a new mail.

### Usage

Below is a minimal example of how to use send method (with no optional parameters). It's highly recommended to also use encryption.

```ts
const txResponse = await mail.send({
  envelope,
});
```

### Returns

`Promise<EthereumTransactionResponse>`

A promise that resolves to the response from the `sendTransaction` method on the `walletClient` provided by the developer on `Mail` initialization.

### Parameters

#### options

* **Type** `MailSendOptions`

Configuration for sending mail.

#### options.envelope

* **Type** `Envelope`

The mail envelope to send.

```ts
import type { Envelope } from '@4thtech-sdk/types';

const envelope: Envelope = {
  content: {
    subject: 'Test subject',
    body: 'Test body...', // optional
    attachments: [], // optional
  },
  receiver: '0x...',
};
```

#### options.encryption (Optional)

* **Type** `Encryption`

The encryption method to apply to the mail.

```ts
const txResponse = await mail.send({
  envelope,
  encryption,
});
```

#### options.onStateChange (Optional)

* **Type** `(state: MailSendState) => void`

A callback function to track state changes during the sending process.

```ts
import type { MailSendState } from '@4thtech-sdk/types';

const txResponse = await mail.send({
  envelope,
  onStateChange: (state: MailSendState) => {
    console.log(state);
  },
});
```

`MailSendState` is an enum of the possible states of the sending process.

* When sending non-encrypted mail
  * STORING\_ATTACHMENTS
  * STORING\_ENVELOPE
  * SENDING\_TRANSACTION
* When sending encrypted mail
  * ENCRYPTING\_STORING\_ATTACHMENTS
  * ENCRYPTING\_STORING\_ENVELOPE
  * SENDING\_TRANSACTION

#### options.onUploadProgress (Optional)

* **Type** `(progressInfo: FileProgressInfo) => void`

A callback function to track the progress of file uploads when sending the mail.

```ts
import type { FileProgressInfo } from '@4thtech-sdk/types';

const txResponse = await mail.send({
  envelope,
  onUploadProgress: (progressInfo: FileProgressInfo) => {
    console.log(`Upload Progress (${progressInfo.fileName}): ${progressInfo.percent}%`);
  },
});
```
