ews

package module
v0.0.3 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 12, 2023 License: MIT Imports: 18 Imported by: 0

README

EWS Exchange Web Service Extend

Exchange Web Service client for golang,Base on mhewedy/ews

Improvement:

  • fixed some bug about NTLM (update github.com/Azure/go-ntlmssp package version Change github.com/Azure/go-ntlmssp to github.com/vadimi/go-http-ntlm/v2,because go-ntlmssp has so many bugs....).
  • fixed some service not support HTTP1.1 ,but go will use HTTP2.0 if our service URL is HTTPS (After Go 1.6 ,See THIS).
  • Add support for email with Attachment.
  • Using strategy like ews-java-api deal with email with attachment.which is save the mail content and subject,than save mail attachment,finally send the mail we saved.(Because ews-java-api project comment said, see below)
        // Bug E14:80316 -- If the message has attachments, save as a
        // draft (and add attachments) before sending.

TODO:

  • Inline Attachment - like picture in email body.
  • Support html email body with inline attachment.
  • Support Mail CC and BCC.

usage:

package main

import (
	"fmt"
	"github.com/johnchenkzy/ews"
	"github.com/johnchenkzy/ews/ewsutil"
	"log"
)

func main() {

	c := ews.NewClient(
		"https://outlook.office365.com/EWS/Exchange.asmx",
		"email@exchangedomain",
		"password",
		&ews.Config{Dump: true, NTLM: false},
	)

	err := ewsutil.SendEmail(c,
		[]string{"mhewedy@gmail.com", "someone@else.com"},
		"An email subject",
		"The email body, as plain text",
	)

	if err != nil {
		log.Fatal("err>: ", err.Error())
	}

	fmt.Println("--- success ---")
}

Note: if you are using an on-premises Exchange server (or even if you manage your servers at the cloud), you need to pass the username as AD_DOMAINNAME\username instead, for examle MYCOMANY\mhewedy.

Supported Feature matrix:

Category Operation Supported*
eDiscovery operations
Exchange mailbox data operations
CreateItem operation ✔️ (Email & Calendar & Attachment)
GetUserPhoto ✔️
CreateAttachement operation ✔️
Availability operations
GetUserAvailability ✔️
GetRoomLists ✔️
Bulk transfer operations
Delegate management operations
Inbox rules operations
Mail app management operations
Mail tips operation
Message tracking operations
Notification operations
Persona operations
FindPeople ✔️
GetPersona ✔️
Retention policy operation
Service configuration operation
Sharing operations
Synchronization operations
Time zone operation
Unified Messaging operations
Unified Contact Store operations
User configuration operations
  • Not always 100% of fields are mapped.

Extras

Besides the operations supported above, few new operations under the namespace ewsutil has been introduced:

  • ewsutil.SendEmail
  • ewsutil.CreateEvent
  • ewsutil.ListUsersEvents
  • ewsutil.FindPeople
  • ewsutil.GetUserPhoto
  • ewsutil.GetUserPhotoBase64
  • ewsutil.GetUserPhotoURL
  • ewsutil.GetPersona

NTLM is supported as well as Basic authentication

Reference:

https://docs.microsoft.com/en-us/exchange/client-developer/web-service-reference/ews-operations-in-exchange

Documentation

Overview

Package wrapping Exchange Web Service (EWS)

https://docs.microsoft.com/en-us/exchange/client-developer/web-service-reference/ews-operations-in-exchange

Index

Constants

View Source
const (
	RequestedViewNone           = "None"
	RequestedViewMergedOnly     = "MergedOnly"
	RequestedViewFreeBusy       = "FreeBusy"
	RequestedViewFreeBusyMerged = "FreeBusyMerged"
	RequestedViewDetailed       = "Detailed"
	RequestedViewDetailedMerged = "DetailedMerged"
)
View Source
const (
	BusyTypeFree      = "Free"
	BusyTypeTentative = "Tentative"
	BusyTypeBusy      = "Busy"
	BusyTypeOOF       = "OOF"
	BusyTypeNoData    = "NoData"
)

Variables

This section is empty.

Functions

func NewError

func NewError(resp *http.Response) error

Types

type AdditionalProperties

type AdditionalProperties struct {
	FieldURI []FieldURI `xml:"t:FieldURI,omitempty"`
}

type ArrayOfAttendeeConflictData

type ArrayOfAttendeeConflictData struct {
	UnknownAttendeeConflictData     string                    `xml:"UnknownAttendeeConflictData"`
	IndividualAttendeeConflictData  string                    `xml:"IndividualAttendeeConflictData"`
	TooBigGroupAttendeeConflictData string                    `xml:"TooBigGroupAttendeeConflictData"`
	GroupAttendeeConflictData       GroupAttendeeConflictData `xml:"GroupAttendeeConflictData"`
}

type AttachmentId

type AttachmentId struct {
	Id                string `xml:"Id,attr"`
	RootItemId        string `xml:"RootItemId,attr"`
	RootItemChangeKey string `xml:"RootItemChangeKey,attr"`
}

type Attachments

type Attachments struct {
	FileAttachment []FileAttachment `xml:"t:FileAttachment"`
}

func CreateAttachmentsByPaths

func CreateAttachmentsByPaths(paths ...string) *Attachments

Create Attachments By Paths

type Attendee

type Attendee struct {
	Mailbox Mailbox `xml:"t:Mailbox"`
}

type AttendeeType

type AttendeeType string
const (
	AttendeeTypeOrganizer AttendeeType = "Organizer"
	AttendeeTypeRequired  AttendeeType = "Required"
	AttendeeTypeOptional  AttendeeType = "Optional"
	AttendeeTypeRoom      AttendeeType = "Room"
	AttendeeTypeResource  AttendeeType = "Resource"
)

type Attendees

type Attendees struct {
	Attendee []Attendee `xml:"t:Attendee"`
}

type BasePoint

type BasePoint string
const (
	BasePointBeginning BasePoint = "Beginning"
	BasePointEnd       BasePoint = "End"
)

type BaseShape

type BaseShape string
const (
	BaseShapeIdOnly        BaseShape = "IdOnly"
	BaseShapeDefault       BaseShape = "Default"
	BaseShapeAllProperties BaseShape = "AllProperties"
)

type Body

type Body struct {
	BodyType string `xml:"BodyType,attr"`
	Body     []byte `xml:",chardata"`
}

type BusinessPhoneNumbers

type BusinessPhoneNumbers struct {
	PhoneNumberAttributedValue PhoneNumberAttributedValue `xml:"PhoneNumberAttributedValue"`
}

type BusyType

type BusyType string

type CalendarEvent

type CalendarEvent struct {
	StartTime            Time                 `xml:"StartTime"`
	EndTime              Time                 `xml:"EndTime"`
	BusyType             BusyType             `xml:"BusyType"`
	CalendarEventDetails CalendarEventDetails `xml:"CalendarEventDetails"`
}

type CalendarEventArray

type CalendarEventArray struct {
	CalendarEvent []CalendarEvent `xml:"CalendarEvent"`
}

type CalendarEventDetails

type CalendarEventDetails struct {
	ID            string `xml:"ID"`
	Subject       string `xml:"Subject"`
	Location      string `xml:"Location"`
	IsMeeting     bool   `xml:"IsMeeting"`
	IsRecurring   bool   `xml:"IsRecurring"`
	IsException   bool   `xml:"IsException"`
	IsReminderSet bool   `xml:"IsReminderSet"`
	IsPrivate     bool   `xml:"IsPrivate"`
}

type CalendarItem

type CalendarItem struct {
	Subject                    string      `xml:"t:Subject"`
	Body                       Body        `xml:"t:Body"`
	ReminderIsSet              bool        `xml:"t:ReminderIsSet"`
	ReminderMinutesBeforeStart int         `xml:"t:ReminderMinutesBeforeStart"`
	Start                      time.Time   `xml:"t:Start"`
	End                        time.Time   `xml:"t:End"`
	IsAllDayEvent              bool        `xml:"t:IsAllDayEvent"`
	LegacyFreeBusyStatus       string      `xml:"t:LegacyFreeBusyStatus"`
	Location                   string      `xml:"t:Location"`
	RequiredAttendees          []Attendees `xml:"t:RequiredAttendees"`
	OptionalAttendees          []Attendees `xml:"t:OptionalAttendees"`
	Resources                  []Attendees `xml:"t:Resources"`
}

type Client

type Client interface {
	SendAndReceive(body []byte) ([]byte, error)
	GetEWSAddr() string
	GetUsername() string
}

func NewClient

func NewClient(ewsAddr, username, password string, config *Config) Client

type Config

type Config struct {
	Dump    bool
	NTLM    bool
	SkipTLS bool
	Http2   bool
}

func GetDefaultConfig

func GetDefaultConfig() Config

DefaultConfig sets the default configuration use http1.1 instead of http2

type CreateAttachment

type CreateAttachment struct {
	XMLName      struct{}    `xml:"m:CreateAttachment"`
	ParentItemId ItemId      `xml:"m:ParentItemId"`
	Attachments  Attachments `xml:"m:Attachments"`
}

type CreateAttachmentResponseBody

type CreateAttachmentResponseBody struct {
	CreateAttachmentResponse []createAttachmentResponseMessage `xml:"CreateAttachmentResponse>ResponseMessages>CreateAttachmentResponseMessage"`
}

type CreateAttachmentResponseBodyEnvelop

type CreateAttachmentResponseBodyEnvelop struct {
	XMLName struct{}                     `xml:"Envelope"`
	Body    CreateAttachmentResponseBody `xml:"Body"`
}

type CreateItem

type CreateItem struct {
	XMLName                struct{}           `xml:"m:CreateItem"`
	MessageDisposition     string             `xml:"MessageDisposition,attr"`
	SendMeetingInvitations string             `xml:"SendMeetingInvitations,attr,omitempty"`
	SavedItemFolderId      *SavedItemFolderId `xml:"m:SavedItemFolderId,omitempty"`
	Items                  Items              `xml:"m:Items"`
}

type CreateItemResponse

type CreateItemResponse struct {
	ResponseMessages ResponseMessages `xml:"ResponseMessages"`
}

type Departments

type Departments struct {
	StringAttributedValue StringAttributedValue `xml:"StringAttributedValue"`
}

type DistinguishedFolderId

type DistinguishedFolderId struct {
	// List of values:
	// https://docs.microsoft.com/en-us/exchange/client-developer/web-service-reference/distinguishedfolderid
	Id string `xml:"Id,attr"`
}

type Email

type Email struct {
	Name        string `xml:"t:Name"`
	Address     string `xml:"t:Address"`
	RoutingType string `xml:"t:RoutingType"`
}

type EmailAddress

type EmailAddress struct {
	Name         string `xml:"Name"`
	EmailAddress string `xml:"EmailAddress"`
	RoutingType  string `xml:"RoutingType"`
	MailboxType  string `xml:"MailboxType"`
	ItemId       ItemId `xml:"ItemId"`
}

type Fault

type Fault struct {
	Faultcode   string `xml:"faultcode"`
	Faultstring string `xml:"faultstring"`
	Detail      detail `xml:"detail"`
}

type FieldURI

type FieldURI struct {
	// List of possible values:
	// https://docs.microsoft.com/en-us/exchange/client-developer/web-service-reference/fielduri
	FieldURI string `xml:"FieldURI,attr,omitempty"`
}

type FileAttachment

type FileAttachment struct {
	Content        string `xml:"t:Content"`
	Name           string `xml:"t:Name"`
	ContentType    string `xml:"t:ContentType,omitempty"`
	IsInline       bool   `xml:"t:IsInline"`
	IsContactPhoto bool   `xml:"t:IsContactPhoto"`
}

func CreateFileAttachmentByNameAndPath

func CreateFileAttachmentByNameAndPath(name string, path string) FileAttachment

Create FileAttachment By Name and Path

func CreateFileAttachmentByPath

func CreateFileAttachmentByPath(path string) FileAttachment

type FindPeopleRequest

type FindPeopleRequest struct {
	XMLName             struct{}            `xml:"m:FindPeople"`
	PersonaShape        *PersonaShape       `xml:"m:PersonaShape,omitempty"`
	IndexedPageItemView IndexedPageItemView `xml:"m:IndexedPageItemView"`
	ParentFolderId      ParentFolderId      `xml:"m:ParentFolderId"`
	QueryString         string              `xml:"m:QueryString,omitempty"`
}

type FindPeopleResponse

type FindPeopleResponse struct {
	Response
	People                    People `xml:"People"`
	TotalNumberOfPeopleInView int    `xml:"TotalNumberOfPeopleInView"`
	FirstMatchingRowIndex     int    `xml:"FirstMatchingRowIndex"`
	FirstLoadedRowIndex       int    `xml:"FirstLoadedRowIndex"`
}

type FreeBusyResponse

type FreeBusyResponse struct {
	ResponseMessage ResponseMessage `xml:"ResponseMessage"`
	FreeBusyView    FreeBusyView    `xml:"FreeBusyView"`
}

type FreeBusyResponseArray

type FreeBusyResponseArray struct {
	FreeBusyResponse []FreeBusyResponse `xml:"FreeBusyResponse"`
}

type FreeBusyView

type FreeBusyView struct {
	FreeBusyViewType   string             `xml:"FreeBusyViewType"`
	MergedFreeBusy     string             `xml:"MergedFreeBusy"`
	CalendarEventArray CalendarEventArray `xml:"CalendarEventArray"`
	WorkingHours       WorkingHours       `xml:"WorkingHours"`
}

type FreeBusyViewOptions

type FreeBusyViewOptions struct {
	TimeWindow                      TimeWindow `xml:"t:TimeWindow"`
	MergedFreeBusyIntervalInMinutes int        `xml:"t:MergedFreeBusyIntervalInMinutes,omitempty"`
	RequestedView                   string     `xml:"t:RequestedView"`
}

type GetPersonaRequest

type GetPersonaRequest struct {
	XMLName   struct{}  `xml:"m:GetPersona"`
	PersonaId PersonaId `xml:"m:PersonaId"`
}

type GetRoomListsRequest

type GetRoomListsRequest struct {
	XMLName struct{} `xml:"m:GetRoomLists"`
}

type GetRoomListsResponse

type GetRoomListsResponse struct {
	Response
	RoomLists RoomLists `xml:"RoomLists"`
}

func GetRoomLists

func GetRoomLists(c Client) (*GetRoomListsResponse, error)

type GetUserAvailabilityRequest

type GetUserAvailabilityRequest struct {
	XMLName             struct{}            `xml:"m:GetUserAvailabilityRequest"`
	TimeZone            TimeZone            `xml:"t:TimeZone"`
	MailboxDataArray    MailboxDataArray    `xml:"m:MailboxDataArray"`
	FreeBusyViewOptions FreeBusyViewOptions `xml:"t:FreeBusyViewOptions"`
}

type GetUserAvailabilityResponse

type GetUserAvailabilityResponse struct {
	FreeBusyResponseArray FreeBusyResponseArray `xml:"FreeBusyResponseArray"`
	SuggestionsResponse   SuggestionsResponse   `xml:"SuggestionsResponse"`
}

type GetUserPhotoRequest

type GetUserPhotoRequest struct {
	XMLName       struct{} `xml:"m:GetUserPhoto"`
	Email         string   `xml:"m:Email"`
	SizeRequested string   `xml:"m:SizeRequested"`
}

type GetUserPhotoResponse

type GetUserPhotoResponse struct {
	Response
	HasChanged  bool   `xml:"HasChanged"`
	PictureData string `xml:"PictureData"`
}

type GroupAttendeeConflictData

type GroupAttendeeConflictData struct {
	NumberOfMembers             int `xml:"NumberOfMembers"`
	NumberOfMembersAvailable    int `xml:"NumberOfMembersAvailable"`
	NumberOfMembersWithConflict int `xml:"NumberOfMembersWithConflict"`
	NumberOfMembersWithNoData   int `xml:"NumberOfMembersWithNoData"`
}

type HTTPError

type HTTPError struct {
	Status     string
	StatusCode int
}

func (HTTPError) Error

func (s HTTPError) Error() string

type IndexedPageItemView

type IndexedPageItemView struct {
	MaxEntriesReturned int       `xml:"MaxEntriesReturned,attr,omitempty"`
	Offset             int       `xml:"Offset,attr"`
	BasePoint          BasePoint `xml:"BasePoint,attr"`
}

type ItemId

type ItemId struct {
	Id        string `xml:"Id,attr"`
	ChangeKey string `xml:"ChangeKey,attr,omitempty"`
}

type ItemIds

type ItemIds struct {
	ItemId []ItemId `xml:"t:ItemId"`
}

type Items

type Items struct {
	Message      []Message      `xml:"t:Message"`
	CalendarItem []CalendarItem `xml:"t:CalendarItem"`
}

type Mailbox

type Mailbox struct {
	EmailAddress string `xml:"t:EmailAddress"`
}

type MailboxData

type MailboxData struct {
	Email            Email        `xml:"t:Email"`
	AttendeeType     AttendeeType `xml:"t:AttendeeType"`
	ExcludeConflicts bool         `xml:"t:ExcludeConflicts"`
}

type MailboxDataArray

type MailboxDataArray struct {
	MailboxData []MailboxData `xml:"t:MailboxData"`
}

type Message

type Message struct {
	ItemClass     string       `xml:"t:ItemClass,omitempty"`
	ItemId        *ItemId      `xml:"t:ItemId,omitempty"`
	Subject       string       `xml:"t:Subject"`
	Body          Body         `xml:"t:Body"`
	Attachments   *Attachments `xml:"t:Attachments,omitempty"`
	Sender        *OneMailbox  `xml:"t:Sender,omitempty"`
	ToRecipients  *XMailbox    `xml:"t:ToRecipients"`
	CcRecipients  *XMailbox    `xml:"t:CcRecipients,omitempty"`
	BccRecipients *XMailbox    `xml:"t:BccRecipients,omitempty"`
}

type MessageXml

type MessageXml struct {
	ExceptionType       string `xml:"ExceptionType"`
	ExceptionCode       string `xml:"ExceptionCode"`
	ExceptionServerName string `xml:"ExceptionServerName"`
	ExceptionMessage    string `xml:"ExceptionMessage"`
}

type MobilePhones

type MobilePhones struct {
	PhoneNumberAttributedValue PhoneNumberAttributedValue `xml:"PhoneNumberAttributedValue"`
}

type OfficeLocations

type OfficeLocations struct {
	StringAttributedValue StringAttributedValue `xml:"StringAttributedValue"`
}

type OneMailbox

type OneMailbox struct {
	Mailbox Mailbox `xml:"t:Mailbox"`
}

type ParentFolderId

type ParentFolderId struct {
	DistinguishedFolderId DistinguishedFolderId `xml:"t:DistinguishedFolderId"`
}

type People

type People struct {
	Persona []Persona `xml:"Persona"`
}

type Persona

type Persona struct {
	PersonaId            PersonaId            `xml:"PersonaId"`
	DisplayName          string               `xml:"DisplayName"`
	Title                string               `xml:"Title"`
	Department           string               `xml:"Department"`
	Departments          Departments          `xml:"Departments"`
	EmailAddress         EmailAddress         `xml:"EmailAddress"`
	RelevanceScore       int                  `xml:"RelevanceScore"`
	BusinessPhoneNumbers BusinessPhoneNumbers `xml:"BusinessPhoneNumbers"`
	MobilePhones         MobilePhones         `xml:"MobilePhones"`
	OfficeLocations      OfficeLocations      `xml:"OfficeLocations"`
}

type PersonaId

type PersonaId struct {
	Id string `xml:"Id,attr"`
}

type PersonaShape

type PersonaShape struct {
	BaseShape            BaseShape            `xml:"t:BaseShape,omitempty"`
	AdditionalProperties AdditionalProperties `xml:"t:AdditionalProperties,omitempty"`
}

type PhoneNumberAttributedValue

type PhoneNumberAttributedValue struct {
	Value Value `json:"Value"`
}

type RespItems

type RespItems struct {
	Message *[]RespMessage `xml:"Message"`
}

type RespMessage

type RespMessage struct {
	XMLName xml.Name `xml:"Message"`
	ItemId  *ItemId  `xml:"ItemId"`
}

type Response

type Response struct {
	ResponseClass ResponseClass `xml:"ResponseClass,attr"`
	MessageText   string        `xml:"MessageText"`
	ResponseCode  string        `xml:"ResponseCode"`
	MessageXml    MessageXml    `xml:"MessageXml"`
	Items         RespItems     `xml:"Items"`
}

type ResponseClass

type ResponseClass string
const (
	ResponseClassSuccess ResponseClass = "Success"
	ResponseClassWarning ResponseClass = "Warning"
	ResponseClassError   ResponseClass = "Error"
)

type ResponseMessage

type ResponseMessage struct {
	Response
	DescriptiveLinkKey int `xml:"DescriptiveLinkKey"`
}

type ResponseMessages

type ResponseMessages struct {
	CreateItemResponseMessage Response `xml:"CreateItemResponseMessage"`
}

type RoomLists

type RoomLists struct {
	Address []EmailAddress `xml:"Address"`
}

type SavedItemFolderId

type SavedItemFolderId struct {
	DistinguishedFolderId DistinguishedFolderId `xml:"t:DistinguishedFolderId"`
}

type SendItem

type SendItem struct {
	XMLName          struct{} `xml:"m:SendItem"`
	SaveItemToFolder string   `xml:"m:SaveItemToFolder,attr"`
	ItemIds          ItemIds  `xml:"m:ItemIds"`
}

type SoapError

type SoapError struct {
	Fault *Fault
}

func (SoapError) Error

func (s SoapError) Error() string

type StringAttributedValue

type StringAttributedValue struct {
	Value string `json:"Value"`
}

type Suggestion

type Suggestion struct {
	MeetingTime                 time.Time                   `xml:"MeetingTime"`
	IsWorkTime                  bool                        `xml:"IsWorkTime"`
	SuggestionQuality           string                      `xml:"SuggestionQuality"`
	ArrayOfAttendeeConflictData ArrayOfAttendeeConflictData `xml:"ArrayOfAttendeeConflictData"`
}

type SuggestionArray

type SuggestionArray struct {
	Suggestion []Suggestion `xml:"Suggestion"`
}

type SuggestionDayResult

type SuggestionDayResult struct {
	Date            time.Time       `xml:"Date"`
	DayQuality      string          `xml:"DayQuality"`
	SuggestionArray SuggestionArray `xml:"SuggestionArray"`
}

type SuggestionDayResultArray

type SuggestionDayResultArray struct {
	SuggestionDayResult []SuggestionDayResult `xml:"SuggestionDayResult"`
}

type SuggestionsResponse

type SuggestionsResponse struct {
	ResponseMessage          ResponseMessage          `xml:"ResponseMessage"`
	SuggestionDayResultArray SuggestionDayResultArray `xml:"SuggestionDayResultArray"`
}

type Time

type Time string

func (Time) ToTime

func (t Time) ToTime() (time.Time, error)

type TimeWindow

type TimeWindow struct {
	StartTime time.Time `xml:"t:StartTime"`
	EndTime   time.Time `xml:"t:EndTime"`
}

type TimeZone

type TimeZone struct {
	Bias         int          `xml:"t:Bias"`
	StandardTime TimeZoneTime `xml:"t:StandardTime"`
	DaylightTime TimeZoneTime `xml:"t:DaylightTime"`
}

type TimeZoneTime

type TimeZoneTime struct {
	Bias      int    `xml:"t:Bias"`
	Time      string `xml:"t:Time"`
	DayOrder  int16  `xml:"t:DayOrder"`
	Month     int16  `xml:"t:Month"`
	DayOfWeek string `xml:"t:DayOfWeek"`
	Year      string `xml:"Year,omitempty"`
}

type Value

type Value struct {
	Number string `json:"Number"`
	Type   string `json:"Type"`
}

type WorkingHours

type WorkingHours struct {
	TimeZone           TimeZone           `xml:"TimeZone"`
	WorkingPeriodArray WorkingPeriodArray `xml:"WorkingPeriodArray"`
}

type WorkingPeriod

type WorkingPeriod struct {
	DayOfWeek          string `xml:"DayOfWeek"`
	StartTimeInMinutes int    `xml:"StartTimeInMinutes"`
	EndTimeInMinutes   int    `xml:"EndTimeInMinutes"`
}

type WorkingPeriodArray

type WorkingPeriodArray struct {
	WorkingPeriod []WorkingPeriod `xml:"WorkingPeriod"`
}

type XMailbox

type XMailbox struct {
	Mailbox []Mailbox `xml:"t:Mailbox"`
}

Directories

Path Synopsis
Utility package to contain functions like sendMail, create Calendar appointment and get user availability
Utility package to contain functions like sendMail, create Calendar appointment and get user availability

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL