Documentation
¶
Index ¶
- Constants
- Variables
- func ReturnMail(event *SendEvent, err error)
- type Application
- type ApplicationEvent
- type ApplicationEventKind
- type DelayedBindingType
- type EventService
- type GrepService
- type Iterator
- type LimitedQueue
- type MailError
- type MailMessage
- type PublishService
- type Queue
- type ReportService
- type SendEvent
- type SendEventResult
- type SendingService
- type Service
- type SmtpClient
- type SmtpClientStatus
- type Timeout
Constants ¶
const ( // используется в примерах использования ExampleConfigYaml = "/path/to/config/file.yaml" // невалидная строка, введенная пользователем InvalidInputString = "" // невалидное число, введенное пользователем InvalidInputInt = 0 )
const ( // Максимальное количество попыток подключения к почтовику за отправку письма MaxTryConnectionCount int = 30 AllDomains string = "*" EmptyStr string = "" )
Variables ¶
var ( // объект текущего приложения, иногда необходим сервисам, для отправки событий приложению App Application // сервисы, используются для создания итератора Services []interface{} // количество goroutine, может измениться для инициализации приложения DefaultWorkersCount = runtime.NumCPU() // используется в нескольких пакетах, поэтому вынес сюда FilenameRegex = regexp.MustCompile(`[^\\/]+\.[^\\/]+`) // печает аргументы, используемые приложением PrintUsage = func(f *flag.Flag) { format := " -%s %s\n" fmt.Printf(format, f.Name, f.Usage) } )
var ( // Регулярка для проверки адреса почты, сразу компилируем, чтобы при отправке не терять на этом время EmailRegexp = regexp.MustCompile(`^[\w\d\.\_\%\+\-]+@([\w\d\.\-]+\.\w{2,5})$`) HostnameRegex = regexp.MustCompile(`^[\w\d\.\-]+\.\w{2,5}$`) EmptyStrSlice = []string{} )
Functions ¶
func ReturnMail ¶
возвращает письмо обратно в очередь после ошибки во время отправки
Types ¶
type Application ¶
type Application interface {
GetConfigFilename() string
// устанавливает путь к файлу с настройками
SetConfigFilename(string)
// проверяет валидность пути к файлу с настройками
IsValidConfigFilename(string) bool
// устанавливает канал событий приложения
SetEvents(chan *ApplicationEvent)
// возвращает канал событий приложения
Events() chan *ApplicationEvent
// устанавливает канал завершения приложения
SetDone(chan bool)
// возвращает канал завершения приложения
Done() chan bool
// возвращает сервисы, используемые приложением
Services() []interface{}
// инициализирует сервисы
FireInit(*ApplicationEvent, interface{})
// запускает сервисы приложения
FireRun(*ApplicationEvent, interface{})
// останавливает сервисы приложения
FireFinish(*ApplicationEvent, interface{})
// инициализирует приложение
Init(*ApplicationEvent)
// запускает приложение
Run()
// запускает приложение с аргументами
RunWithArgs(...interface{})
// возвращает таймауты приложения
Timeout() Timeout
}
проект содержит несколько приложений: pmq-grep, pmq-publish, pmq-report, postmanq и т.д. чтобы упростить и стандартизировать приложения, разработан этот интерфейс
type ApplicationEvent ¶
type ApplicationEvent struct {
// тип события
Kind ApplicationEventKind
// данные из файла настроек
Data []byte
// аргументы командной строки
Args map[string]interface{}
}
событие приложения
func NewApplicationEvent ¶
func NewApplicationEvent(kind ApplicationEventKind) *ApplicationEvent
создает событие с указанным типом
func (*ApplicationEvent) GetBoolArg ¶
func (e *ApplicationEvent) GetBoolArg(key string) bool
возвращает аргумент, как булевый тип
func (*ApplicationEvent) GetIntArg ¶
func (e *ApplicationEvent) GetIntArg(key string) int
возвращает аргумент, как число
func (*ApplicationEvent) GetStringArg ¶
func (e *ApplicationEvent) GetStringArg(key string) string
возвращает аргумент, как строку
type ApplicationEventKind ¶
type ApplicationEventKind int
тип события приложения
const ( // инициализации сервисов InitApplicationEventKind ApplicationEventKind = iota // запуск сервисов RunApplicationEventKind // завершение сервисов FinishApplicationEventKind )
type DelayedBindingType ¶
type DelayedBindingType int
тип отложенной очереди
const ( UnknownDelayedBinding DelayedBindingType = iota SecondDelayedBinding ThirtySecondDelayedBinding MinuteDelayedBinding FiveMinutesDelayedBinding TenMinutesDelayedBinding TwentyMinutesDelayedBinding ThirtyMinutesDelayedBinding FortyMinutesDelayedBinding FiftyMinutesDelayedBinding HourDelayedBinding SixHoursDelayedBinding DayDelayedBinding NotSendDelayedBinding )
type EventService ¶
type EventService interface {
Events() chan *SendEvent
}
сервис получающий событие отправки письма используется сервисами для передачи события друг другу
type GrepService ¶
type GrepService interface {
Service
OnGrep(*ApplicationEvent)
}
сервис ищущий записи в логе по письму
type Iterator ¶
type Iterator struct {
// contains filtered or unexported fields
}
итератор, используется для слабой связи между сервисами приложения
type LimitedQueue ¶
type LimitedQueue struct {
*Queue
// contains filtered or unexported fields
}
лимитированная очередь, в ней будут храниться клиенты к почтовым сервисам
func (*LimitedQueue) AddMaxLen ¶
func (l *LimitedQueue) AddMaxLen()
увеличивает максимальную длину очереди
func (*LimitedQueue) HasLimit ¶
func (l *LimitedQueue) HasLimit() bool
сигнализирует, что очередь имеет лимит
func (*LimitedQueue) MaxLen ¶
func (l *LimitedQueue) MaxLen() int
максимальная длина очереди до того момента, как был установлен лимит
type MailError ¶
type MailError struct {
// сообщение
Message string `json:"message"`
// код ошибки
Code int `json:"code"`
}
ошибка во время отпрвки письма
type MailMessage ¶
type MailMessage struct {
// идентификатор для логов
Id int64 `json:"-"`
// отправитель
Envelope string `json:"envelope"`
// получатель
Recipient string `json:"recipient"`
// тело письма
Body string `json:"body"`
// домен отправителя, удобно сразу получить и использовать далее
HostnameFrom string `json:"-"`
// Домен получателя, удобно сразу получить и использовать далее
HostnameTo string `json:"-"`
// дата создания, используется в основном сервисом ограничений
CreatedDate time.Time `json:"-"`
// тип очереди, в которою письмо уже было отправлено после неудачной отправки, ипользуется для цепочки очередей
BindingType DelayedBindingType `json:"bindingType"`
// ошибка отправки
Error *MailError `json:"error"`
}
письмо
type PublishService ¶
type PublishService interface {
Service
OnPublish(*ApplicationEvent)
}
сервис перекладывающий письма из очереди в очередь
type Queue ¶
type Queue struct {
// contains filtered or unexported fields
}
потоко-безопасная очередь
type ReportService ¶
type ReportService interface {
Service
EventService
OnShowReport()
}
сервис принимающий участие в агрегации и выводе в консоль писем с ошибками
type SendEvent ¶
type SendEvent struct {
// елиент для отправки писем
Client *SmtpClient
// письмо, полученное из очереди
Message *MailMessage
// дата создания необходима при получении подключения к почтовому сервису
CreateDate time.Time
// результат
Result chan SendEventResult
// количество попыток отправок письма
TryCount int
// итератор сервисов, участвующих в отправке письма
Iterator *Iterator
// очередь, в которую необходимо будет положить клиента после отправки письма
Queue *LimitedQueue
}
событие отправки письма
func NewSendEvent ¶
func NewSendEvent(message *MailMessage) *SendEvent
создает событие отправки сообщения
type SendEventResult ¶
type SendEventResult int
результат отправки письма
const ( // успех SuccessSendEventResult SendEventResult = iota // превышение лимита OverlimitSendEventResult // ошибка ErrorSendEventResult // повторная отправка через некоторое время DelaySendEventResult // отмена отправки RevokeSendEventResult )
type SendingService ¶
type SendingService interface {
Service
EventService
OnRun()
OnFinish()
}
сервис принимающий участие в отправке письма
type Service ¶
type Service interface {
OnInit(*ApplicationEvent)
}
сервис требующий инициализиции данные для инициализиции берутся из файла настроек
type SmtpClient ¶
type SmtpClient struct {
// идертификатор клиента для удобства в логах
Id int
// соединение к почтовому серверу
Conn net.Conn
// реальный smtp клиент
Worker *smtp.Client
// дата создания или изменения статуса клиента
ModifyDate time.Time
// статус
Status SmtpClientStatus
// contains filtered or unexported fields
}
клиент почтового сервера
func (*SmtpClient) SetTimeout ¶
func (s *SmtpClient) SetTimeout(timeout time.Duration)
сстанавливайт таймаут на чтение и запись соединения
func (*SmtpClient) Wait ¶
func (s *SmtpClient) Wait()
переводит клиента в ожидание после окончания ожидания соединение разрывается, а статус меняется на отсоединенный
func (*SmtpClient) Wakeup ¶
func (s *SmtpClient) Wakeup()
переводит клиента в рабочее состояние если клиент был в ожидании, ожидание прерывается
type SmtpClientStatus ¶
type SmtpClientStatus int
статус клиента почтового сервера
const ( // отсылает письмо WorkingSmtpClientStatus SmtpClientStatus = iota // ожидает письма WaitingSmtpClientStatus // отсоединен DisconnectedSmtpClientStatus )
type Timeout ¶
type Timeout struct {
Sleep time.Duration `yaml:"sleep"`
Waiting time.Duration `yaml:"waiting"`
Connection time.Duration `yaml:"connection"`
Hello time.Duration `yaml:"hello"`
Mail time.Duration `yaml:"mail"`
Rcpt time.Duration `yaml:"rcpt"`
Data time.Duration `yaml:"data"`
}
таймауты приложения