A customer asked me if it was possible to have a room mailbox automatically accept meeting requests from external parties. They would also like to publish the calendar of that specific room publicly.

Accept meetings from external parties

Let’s start with the first question. By default, resource mailboxes only accept requests from internal senders. As you might guess, you can’t change this behavior through the GUI, Powershell to the rescue!

Since I didn’t know the cmdlet that would let me change this behavior, the first thing I did was look for all “Calendar cmdlets”. After connecting to the Office 365 PowerShell, I ran this command

  get-command *calendar*

  CommandType     Name                                               Version    Source
  -----------     ----                                               -------    ------
  Function        Get-CalendarDiagnosticAnalysis                     1.0        tmp_xse1ew1u.eif
  Function        Get-CalendarDiagnosticLog                          1.0        tmp_xse1ew1u.eif
  Function        Get-CalendarDiagnosticObjects                      1.0        tmp_xse1ew1u.eif
  Function        Get-CalendarNotification                           1.0        tmp_xse1ew1u.eif
  Function        Get-CalendarProcessing                             1.0        tmp_xse1ew1u.eif
  Function        Get-MailboxCalendarConfiguration                   1.0        tmp_xse1ew1u.eif
  Function        Get-MailboxCalendarFolder                          1.0        tmp_xse1ew1u.eif
  Function        Set-CalendarNotification                           1.0        tmp_xse1ew1u.eif
  Function        Set-CalendarProcessing                             1.0        tmp_xse1ew1u.eif
  Function        Set-MailboxCalendarConfiguration                   1.0        tmp_xse1ew1u.eif
  Function        Set-MailboxCalendarFolder                          1.0        tmp_xse1ew1u.eif

Seems like there are a few cmdlets concerning calendars, good info for the second question! The Get-CalendarProcessing cmdlet looks promising, let’s try it out!

  get-mailbox "test room" | Get-CalendarProcessing | fl

  RunspaceId                          : 9f1b6e5d-09a6-40d9-9b83-8006a50d4284
  AutomateProcessing                  : AutoUpdate
  AllowConflicts                      : False
  BookingWindowInDays                 : 180
  MaximumDurationInMinutes            : 1440
  AllowRecurringMeetings              : True
  EnforceSchedulingHorizon            : True
  ScheduleOnlyDuringWorkHours         : False
  ConflictPercentageAllowed           : 0
  MaximumConflictInstances            : 0
  ForwardRequestsToDelegates          : True
  DeleteAttachments                   : True
  DeleteComments                      : True
  RemovePrivateProperty               : True
  DeleteSubject                       : True
  AddOrganizerToSubject               : True
  DeleteNonCalendarItems              : True
  TentativePendingApproval            : True
  EnableResponseDetails               : True
  OrganizerInfo                       : True
  ResourceDelegates                   : {}
  RequestOutOfPolicy                  : {}
  AllRequestOutOfPolicy               : False
  BookInPolicy                        : {}
  AllBookInPolicy                     : True
  RequestInPolicy                     : {}
  AllRequestInPolicy                  : False
  AddAdditionalResponse               : False
  AdditionalResponse                  :
  RemoveOldMeetingMessages            : True
  AddNewRequestsTentatively           : True
  ProcessExternalMeetingMessages      : False
  RemoveForwardedMeetingNotifications : False
  MailboxOwnerId                      : test room
  Identity                            : test room
  IsValid                             : True
  ObjectState                         : Changed

As you can see on the highlighted line, this is exactly the property we were looking for. Let’s change it so we get the desired behavior. In the get-command output, I saw a cmdlet Set-CalendarProcessing, this seems like the right one.

Get-Mailbox "test room" | Set-CalendarProcessing -ProcessExternalMeetingMessages $true

This change will only affect new meeting requests, requests that have already been refused won’t be automatically accepted.

Publish calendar publicly

In the cmdlets we got earlier, there wasn’t really one that stood out as a “possible match” so let’s look at the attributes of the calendar itself. In essence, the calendar is just a folder inside of a mailbox object. Let’s query that folder directly.

  Get-MailboxCalendarFolder testroom@domain.com:\calendar | fl


  RunspaceId                      : 
  Identity                        : test room:\calendar
  PublishEnabled                  : False
  PublishDateRangeFrom            : ThreeMonths
  PublishDateRangeTo              : ThreeMonths
  DetailLevel                     : AvailabilityOnly
  SearchableUrlEnabled            : False
  PublishedCalendarUrl            :
  PublishedICalUrl                :
  CalendarSharingOwnerSmtpAddress :
  CalendarSharingPermissionLevel  : Null
  SharingLevelOfDetails           : None
  SharingPermissionFlags          : None
  SharingOwnerRemoteFolderId      : AAA=
  IsValid                         : True
  ObjectState                     : Changed

That’s everything we need and more! As you can see, we can set the PublishEnabled attribute to true but we can do so much more. You can choose the detail level and even set how far back and forth the published calendar needs to go.

Let’s publish the calendar and run the Get-MailboxCalendarFolder cmdlet again to get the URL.

  Set-MailboxCalendarFolder testroom@domain.com:\calendar -PublishEnabled $true

  Get-MailboxCalendarFolder testroom@domain.com:\calendar | fl


  RunspaceId                      : 
  Identity                        : test room:\calendar
  PublishEnabled                  : True
  PublishDateRangeFrom            : ThreeMonths
  PublishDateRangeTo              : ThreeMonths
  DetailLevel                     : FullDetails
  SearchableUrlEnabled            : False
  PublishedCalendarUrl            : http://outlook.office365.com/owa/calendar/abc@domain.com/xyz/calendar.html
  PublishedICalUrl                : http://outlook.office365.com/owa/calendar/abc@domain.com/xyz/calendar.ics
  ExtendedFolderFlags             : ExchangePublishedCalendar
  CalendarSharingOwnerSmtpAddress :
  CalendarSharingPermissionLevel  : Null
  SharingLevelOfDetails           : None
  SharingPermissionFlags          : None
  SharingOwnerRemoteFolderId      : AAA=
  IsValid                         : True
  ObjectState                     : Changed

All done! Now you can browse to the URL and verify everything is being displayed as you’d expect.

published-calendar