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"` }
таймауты приложения