---
title: "Managing emails with Outlook"
author: Hong Ooi
output:
rmarkdown::html_vignette:
toc: true
vignette: >
%\VignetteIndexEntry{Managing emails with Outlook}
%\VignetteEngine{knitr::rmarkdown}
%\VignetteEncoding{utf8}
---
This vignette describes how to use Microsoft365R to interact with [Outlook](https://www.microsoft.com/en-au/microsoft-365/outlook/email-and-calendar-software-microsoft-outlook) for managing and sending email. See the "Authenticating to Microsoft 365" vignette for more details on authentication if required.
Note that Microsoft365R only works with your _primary_ Outlook (Microsoft Exchange) account. It does not support other email providers that you may have connected to your Outlook account, eg Gmail.
## Outlook client
To access your Outlook inbox, call either `get_personal_outlook()` or `get_business_outlook()`. The first one is for your personal account, and the second is for your work & school account. They return objects of R6 class `ms_outlook`, which has methods for drafting new emails, listing emails in your Inbox, and working with folders.
```r
outl <- get_personal_outlook()
outlb <- get_business_outlook()
# list the most recent emails in your Inbox
outl$list_emails()
# create and send a new email
outl$create_email("Hello from R", subject="Hello", to="bob@example.com")$send()
# list your mail folders
outl$list_folders()
# get some common folders
inbox <- outl$get_inbox()
drafts <- outl$get_drafts()
sent <- outl$get_sent_items()
deleted <- outl$get_deleted_items()
# get a specific folder by name
folder <- outl$get_folder("myfolder")
```
## Writing emails
To write a new email, call the `create_email()` method as noted above; this returns an object of R6 class `ms_outlook_email`. You can create a blank email which you then edit using the object's methods, or supply the details in the `create_email()` call itself. The message will be saved in the Drafts folder.
```r
# create a draft email
em <- outl$create_email("Hello from R", subject="Hello",
to="bob@example.com", cc="charlie@example.com")
# or: create a blank draft, then add details
em <- outl$create_email()
em$set_body("Hello from R")
em$set_subject("Hello")
em$set_recipients(to="bob@example.com", cc="charlie@example.com")
# alternatively, use method chaining to achieve the same thing
em <- outl$
create_email()$
set_body("Hello from R")$
set_subject("Hello")$
set_recipients(to="bob@example.com", cc="charlie@example.com")
```
In the example above, the email has a plain text message body which is the default. To create an email in HTML format, set the `content_type` argument to "html".
```r
em <- outl$create_email("
Hello world!
", content_type="html")
```
However, Microsoft365R also supports using the blastula and emayili packages to write nicely-formatted HTML emails. In particular, blastula lets you compose your email in Markdown, which is often easier than writing raw HTML.
```r
bl_body <- "## Hello!
This is an email message that was generated by the blastula package.
We can use **Markdown** formatting with the `md()` function.
Cheers,
The blastula team"
library(blastula)
bl_em <- compose_email(
body=md(bl_body),
footer=md("sent via Microsoft365R")
)
em <- outl$create_email(bl_em, subject="Hello", to="bob@example.com")
```
Once the message is created, you send it with its `send()` method. Sending an email will move it to the Sent Items folder.
```r
em$send()
```
### Attachments
You can add file attachments to a draft email with the `add_attachment()` method. The attachment can be located on your local machine or in OneDrive/SharePoint. In the latter case, you should supply a drive item object, along with the details for how it should be shared: a OneDrive/Sharepoint file is actually attached as a shared link, and you can specify things like whether to make a viewable or editable link, the expiry time, whether a password is required, and so on.
```r
# attach a file on your local machine
em$add_attachment("mydocument.docx")
# attach a file in OneDrive/SharePoint: an editable link, valid for 1 month
item <- get_sharepoint_site("My site")$
get_drive()$
get_item("Documents/myproject.pptx")
em$att_attachment(item, type="edit", expiry="1 month")
```
The "OneDrive and SharePoint" vignette has more information on drive item objects, including the arguments for creating shared links.
You can also add an image file as an _inline_ attachment with the `add_image()` method. The image will be placed at the end of the message body, which should be in HTML format. Currently Microsoft365R does minimal formatting of the inline image; for more control over layout details, consider using the similar feature in the blastula package.
```r
# add an inline image: note the email message body must be HTML
em <- create_email("See picture below", content_type="html")
em$add_image("mypicture.jpg")
# or with blastula
library(blastula)
bl_body <- md(c(
"See picture below",
add_image("mypicture.jpg")
))
bl_em <- compose_email(bl_body)
em <- outl$create_email(bl_em)
```
### Other methods
In addition to the methods noted above, an email message object has the following methods for editing its contents:
- `add_recipients(to, cc, from)`: Adds recipients to the email. Unlike `set_recipients()` which was used before, this will retain any existing recipients rather than deleting them.
- `set_reply_to()`: Sets the reply-to email address for the email.
## Managing your emails
The Outlook client `list_emails()` method by default returns a list of the 50 most recent emails in your Inbox, sorted by date received. Each email is an object of class `ms_outlook_email`, the same as for messages that you send. You can customise the list to set the number of emails returned, and the criterion for retrieving them: by date, sender or subject.
```r
# a list of 50 email objects
outl$list_emails()
# 100 most recent emails
outl$list_emails(n=100)
# 50 emails, sorted by sender in ascending order
outl$list_emails(by="from")
# 200 emails, sorted by subject in descending order
outl$list_emails(by="subject desc", n=200)
```
A specific email object can be retrieved with `get_email()`. However, as this requires knowing its Outlook message ID, it will usually be easier to examine the result of `list_emails()` to get the email desired.
You can list the attachments for an email with `list_attachments()`, retrieve the metadata for an attachment with `get_attachment()`, and download the attachment with `download_attachment()`. Note that these methods work both for messages that you send, and those that you've received.
```r
# get the most recent email
em <- outl$list_emails()[[1]]
# a list of the attachments for the email
em$list_attachments()
# get a single attachment object
em$get_attachment("myfile.csv")
# download it
em$download_attachment("myfile.csv")
```
To delete an email, simply call its `delete()` method. By default, this will prompt you for confirmation first. The email will be moved to the Deleted Items folder.
```r
em$delete()
```
### Replying to an email
An email object has `create_reply()`, `create_reply_all()` and `create_forward()` methods for creating replies and forwarding. The first argument is the reply comment, which is inserted above the quoted message body of the original email. Each of these creates a new draft email, and the methods described in "Writing emails" above apply here as well.
```r
# get the most recent email in the Inbox
em <- outl$list_emails()[[1]]
# draft a reply to it, adding an attachment
repl <- em$create_reply("See attached report")$
add_attachment("report.md")
# reply-all, setting the reply-to address
repl_all <- em$create_reply_all("Please do not reply")$
set_reply_to("do_not_reply@example.com")
# or forward it
fwd <- em$create_forward("FYI", to="mallory@example.com")
```
As with drafting new emails, you send a reply by calling its `send()` method:
```r
repl$send()
repl_all$send()
fwd$send()
```
Also as with writing new emails, you can use blastula and emayili to create the reply comment:
```r
library(blastula)
bl_repl <- compose_email(
body=md("This is a **good idea!**"),
footer=md("sent via Microsoft365R")
)
em$create_reply(bl_repl)
```
### Working with folders
Microsoft365R provides a rich set of tools for managing your email folders. A folder is represented by an object of R6 class `ms_outlook_folder`, which has methods for listing emails, drafting replies, and copying and moving items.
```r
# list all the folders in your account
outl$list_folders()
# get a folder by name
folder <- outl$get_folder("myfolder")
# you can also get nested folders
folder2 <- outl$get_folder("top level")$get_folder("2nd level")
# create a new folder
outl$create_folder("test folder")
# delete it
outl$delete_folder("test folder")
```
In addition, the Outlook client object provides some convenience functions for retrieving well-known folders: `get_inbox()`, `get_drafts()`, `get_sent_items()`, and `get_deleted_items()`.
To list the emails in a folder, call its `list_emails()` method. This has the same arguments as the `list_emails()` method for the Outlook client object; in fact, the latter simply calls the folder method for the Inbox folder.
```r
# list all the emails in the Inbox -- the same as outl$list_emails()
outl$get_inbox()$list_emails()
# list all the emails in a specific folder
out$get_folder("myfolder")$list_emails()
```
Similarly, to create a new draft email in a folder, call its `create_email()` method. Again, this has the same arguments as the Outlook client object method, which calls the folder method for the Drafts folder.
```r
# create a new email in Drafts -- same as outl$create_email()
outl$get_drafts()$create_email("Hello from R")
# create a new email in a specific folder
outl$get_folder("myfolder")$create_email("Hello from R")
```
You can move and copy folder items by calling their `move()` and `copy()` methods. This works for both emails and (nested) folders. The destination should be another folder object.
```r
destfolder <- outl$get_folder("my archive")
# copying an email
em <- outl$list_emails()[[1]]
em$copy(destfolder)
# moving a folder
folder <- outl$get_folder("test folder")
folder$move(destfolder)
```