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 SMTPClient
- type SMTPClientStatus
- type SendEvent
- type SendEventResult
- type SendingService
- type Service
- type Timeout
Constants ¶
const ( // ExampleConfigYaml используется в примерах использования ExampleConfigYaml = "/path/to/config/file.yaml" // InvalidInputString невалидная строка, введенная пользователем InvalidInputString = "" // InvalidInputInt невалидное число, введенное пользователем InvalidInputInt = 0 )
const ( // MaxTryConnectionCount Максимальное количество попыток подключения к почтовику за отправку письма MaxTryConnectionCount int = 30 // MaxSendingCount Максимальное количество попыток отправки письма MaxSendingCount int = 96 )
Variables ¶
var ( // App объект текущего приложения, иногда необходим сервисам, для отправки событий приложению App Application // Services сервисы, используются для создания итератора Services []interface{} // DefaultWorkersCount количество goroutine, может измениться для инициализации приложения DefaultWorkersCount = runtime.NumCPU() // FilenameRegex используется в нескольких пакетах, поэтому вынес сюда FilenameRegex = regexp.MustCompile(`[^\\/]+\.[^\\/]+`) // PrintUsage печает аргументы, используемые приложением PrintUsage = func(f *flag.Flag) { format := " -%s %s\n" fmt.Printf(format, f.Name, f.Usage) } )
var ( // EmailRegexp Регулярка для проверки адреса почты, сразу компилируем, чтобы при отправке не терять на этом время EmailRegexp = regexp.MustCompile(`^[\w\d\.\_\%\+\-]+@([\w\d\.\-]+\.\w{2,4})$`) )
Functions ¶
func ReturnMail ¶
ReturnMail возвращает письмо обратно в очередь после ошибки во время отправки
Types ¶
type Application ¶
type Application interface { // устанавливает путь к файлу с настройками 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 }
Application проект содержит несколько приложений: pmq-grep, pmq-publish, pmq-report, postmanq и т.д. чтобы упростить и стандартизировать приложения, разработан этот интерфейс
type ApplicationEvent ¶
type ApplicationEvent struct { // тип события Kind ApplicationEventKind // данные из файла настроек Data []byte // аргументы командной строки Args map[string]interface{} }
ApplicationEvent событие приложения
func NewApplicationEvent ¶
func NewApplicationEvent(kind ApplicationEventKind) *ApplicationEvent
NewApplicationEvent создает событие с указанным типом
func (*ApplicationEvent) GetBoolArg ¶
func (e *ApplicationEvent) GetBoolArg(key string) bool
GetBoolArg возвращает аргумент, как булевый тип
func (*ApplicationEvent) GetIntArg ¶
func (e *ApplicationEvent) GetIntArg(key string) int
GetIntArg возвращает аргумент, как число
func (*ApplicationEvent) GetStringArg ¶
func (e *ApplicationEvent) GetStringArg(key string) string
GetStringArg возвращает аргумент, как строку
type ApplicationEventKind ¶
type ApplicationEventKind int
ApplicationEventKind тип события приложения
const ( // InitApplicationEventKind инициализации сервисов InitApplicationEventKind ApplicationEventKind = iota // RunApplicationEventKind запуск сервисов RunApplicationEventKind // FinishApplicationEventKind завершение сервисов FinishApplicationEventKind )
type DelayedBindingType ¶
type DelayedBindingType int
DelayedBindingType тип отложенной очереди
const ( // UnknownDelayedBinding хз пока что это UnknownDelayedBinding DelayedBindingType = iota // SecondDelayedBinding биндинг откладывания на секунду SecondDelayedBinding // ThirtySecondDelayedBinding отложить на 30 сек ThirtySecondDelayedBinding // MinuteDelayedBinding отложить на минуту MinuteDelayedBinding // FiveMinutesDelayedBinding отложить на 5 минут FiveMinutesDelayedBinding // TenMinutesDelayedBinding отложить на 10 минут TenMinutesDelayedBinding // TwentyMinutesDelayedBinding отложить на 20 минут TwentyMinutesDelayedBinding // ThirtyMinutesDelayedBinding отложить на 30 минут ThirtyMinutesDelayedBinding // FortyMinutesDelayedBinding отложить на 40 минут FortyMinutesDelayedBinding // FiftyMinutesDelayedBinding отложить на 50 минут FiftyMinutesDelayedBinding // HourDelayedBinding отложить на час HourDelayedBinding // SixHoursDelayedBinding отложить на 6 часов SixHoursDelayedBinding // DayDelayedBinding отложить на 1 день DayDelayedBinding // NotSendDelayedBinding отложить в неотправленные NotSendDelayedBinding )
type EventService ¶
type EventService interface {
Events() chan *SendEvent
}
EventService сервис получающий событие отправки письма используется сервисами для передачи события друг другу
type GrepService ¶
type GrepService interface { Service OnGrep(*ApplicationEvent) }
GrepService сервис ищущий записи в логе по письму
type Iterator ¶
type Iterator struct {
// contains filtered or unexported fields
}
Iterator итератор, используется для слабой связи между сервисами приложения
type LimitedQueue ¶
type LimitedQueue struct { *Queue // contains filtered or unexported fields }
LimitedQueue лимитированная очередь, в ней будут храниться клиенты к почтовым сервисам
func NewLimitQueue ¶
func NewLimitQueue() *LimitedQueue
NewLimitQueue создает новую лимитированную очередь
func (*LimitedQueue) AddMaxLen ¶
func (l *LimitedQueue) AddMaxLen()
AddMaxLen увеличивает максимальную длину очереди
func (*LimitedQueue) HasLimit ¶
func (l *LimitedQueue) HasLimit() bool
HasLimit сигнализирует, что очередь имеет лимит
func (*LimitedQueue) HasLimitOff ¶
func (l *LimitedQueue) HasLimitOff()
HasLimitOff снимает лимит очереди
func (*LimitedQueue) HasLimitOn ¶
func (l *LimitedQueue) HasLimitOn()
HasLimitOn устанавливает лимит очереди
func (*LimitedQueue) MaxLen ¶
func (l *LimitedQueue) MaxLen() int
MaxLen максимальная длина очереди до того момента, как был установлен лимит
type MailError ¶
type MailError struct { // сообщение об ошибке Message string `json:"message"` // код ошибки Code int `json:"code"` }
MailError ошибка во время отпрвки письма
type MailMessage ¶
type MailMessage struct { // идентификатор для логов ID int64 `json:"-"` // отправитель из "envelope" из очереди Envelope string `json:"envelope"` // получатель "recipient" из очереди Recipient string `json:"recipient"` // тело письма "body" из очереди Body string `json:"body"` // домен отправителя, удобно сразу получить и использовать далее HostnameFrom string `json:"-"` // Домен получателя, удобно сразу получить и использовать далее HostnameTo string `json:"-"` // дата создания, используется в основном сервисом ограничений CreatedDate time.Time `json:"-"` // тип очереди, в которою письмо уже было отправлено после неудачной отправки, ипользуется для цепочки очередей BindingType DelayedBindingType `json:"bindingType"` // ошибка отправки "error" из очереди Error *MailError `json:"error"` // количество попыток отправки "trySendingCount" из очереди TrySendingCount int `json:"trySendingCount"` }
MailMessage письмо
type PublishService ¶
type PublishService interface { Service OnPublish(*ApplicationEvent) }
PublishService сервис перекладывающий письма из очереди в очередь
type Queue ¶
type Queue struct {
// contains filtered or unexported fields
}
Queue потоко-безопасная очередь
type ReportService ¶
type ReportService interface { Service EventService OnShowReport() }
ReportService сервис принимающий участие в агрегации и выводе в консоль писем с ошибками
type SMTPClient ¶
type SMTPClient struct { // идертификатор клиента для удобства в логах ID int // соединение к почтовому серверу Conn net.Conn // реальный smtp клиент Worker *smtp.Client // дата создания или изменения статуса клиента ModifyDate time.Time // статус SMTPClient Status SMTPClientStatus // contains filtered or unexported fields }
SMTPClient клиент почтового сервера
func (*SMTPClient) Close ¶
func (s *SMTPClient) Close()
Close принудительно закрывает соединение mail.ru обрывает соединение со своей стороны, получаем broken pipe
func (*SMTPClient) SetTimeout ¶
func (s *SMTPClient) SetTimeout(timeout time.Duration)
SetTimeout устанавливайт таймаут на чтение и запись соединения
func (*SMTPClient) Wait ¶
func (s *SMTPClient) Wait()
Wait переводит клиента в ожидание после окончания ожидания соединение разрывается, а статус меняется на отсоединенный
func (*SMTPClient) Wakeup ¶
func (s *SMTPClient) Wakeup()
Wakeup переводит клиента в рабочее состояние если клиент был в ожидании, ожидание прерывается
type SMTPClientStatus ¶
type SMTPClientStatus int
SMTPClientStatus статус клиента почтового сервера
const ( // WorkingSMTPClientStatus отсылает письмо WorkingSMTPClientStatus SMTPClientStatus = iota // WaitingSMTPClientStatus ожидает письма WaitingSMTPClientStatus // DisconnectedSMTPClientStatus отсоединен DisconnectedSMTPClientStatus )
type SendEvent ¶
type SendEvent struct { // клиент для отправки писем Client *SMTPClient // письмо, полученное из очереди Message *MailMessage // дата создания необходима при получении подключения к почтовому сервису CreateDate time.Time // результат Result chan SendEventResult // количество попыток отправок письма TryCount int // итератор сервисов, участвующих в отправке письма Iterator *Iterator // очередь, в которую необходимо будет положить клиента после отправки письма Queue *LimitedQueue }
SendEvent событие отправки письма
func NewSendEvent ¶
func NewSendEvent(message *MailMessage) *SendEvent
NewSendEvent создает событие отправки сообщения
type SendEventResult ¶
type SendEventResult int
SendEventResult результат отправки письма
const ( // SuccessSendEventResult успех SuccessSendEventResult SendEventResult = iota // OverlimitSendEventResult превышение лимита OverlimitSendEventResult // ErrorSendEventResult ошибка отправки ErrorSendEventResult // DelaySendEventResult повторная отправка через некоторое время DelaySendEventResult // RevokeSendEventResult отмена отправки RevokeSendEventResult )
type SendingService ¶
type SendingService interface { Service EventService OnRun() OnFinish() }
SendingService сервис принимающий участие в отправке письма
type Service ¶
type Service interface {
OnInit(*ApplicationEvent)
}
Service сервис требующий инициализиции данные для инициализиции берутся из файла настроек
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"` }
Timeout таймауты приложения