Documentation
¶
Index ¶
- Constants
- type AdminNotifCallback
- type Attachment
- type Base
- type Bounce
- type Campaign
- type CampaignAnalyticsCount
- type CampaignAnalyticsLink
- type CampaignMeta
- type CampaignStats
- type Campaigns
- type Headers
- type JSON
- type List
- type Message
- type PageResults
- type Queries
- type Settings
- type StringIntMap
- type Subscriber
- type SubscriberExport
- type SubscriberExportProfile
- type Subscribers
- type Subscription
- type Template
- type TxMessage
- type TxcMessage
- type TxcRenderData
- type TxcRenderDataCampaign
- type User
Constants ¶
const ( // Subscriber. SubscriberStatusEnabled = "enabled" SubscriberStatusDisabled = "disabled" SubscriberStatusBlockListed = "blocklisted" // Subscription. SubscriptionStatusUnconfirmed = "unconfirmed" SubscriptionStatusConfirmed = "confirmed" SubscriptionStatusUnsubscribed = "unsubscribed" // Campaign. CampaignStatusDraft = "draft" CampaignStatusScheduled = "scheduled" CampaignStatusRunning = "running" CampaignStatusPaused = "paused" CampaignStatusFinished = "finished" CampaignStatusCancelled = "cancelled" CampaignTypeRegular = "regular" CampaignTypeOptin = "optin" CampaignContentTypeRichtext = "richtext" CampaignContentTypeHTML = "html" CampaignContentTypeMarkdown = "markdown" CampaignContentTypePlain = "plain" // List. ListTypePrivate = "private" ListTypePublic = "public" ListOptinSingle = "single" ListOptinDouble = "double" // User. UserTypeSuperadmin = "superadmin" UserTypeUser = "user" UserStatusEnabled = "enabled" UserStatusDisabled = "disabled" // BaseTpl is the name of the base template. BaseTpl = "base" // ContentTpl is the name of the compiled message. ContentTpl = "content" // Headers attached to e-mails for bounce tracking. EmailHeaderSubscriberUUID = "X-Listmonk-Subscriber" EmailHeaderCampaignUUID = "X-Listmonk-Campaign" // Standard e-mail headers. EmailHeaderDate = "Date" EmailHeaderFrom = "From" EmailHeaderSubject = "Subject" EmailHeaderMessageId = "Message-Id" EmailHeaderDeliveredTo = "Delivered-To" EmailHeaderReceived = "Received" BounceTypeHard = "hard" BounceTypeSoft = "soft" BounceTypeComplaint = "complaint" // Templates. TemplateTypeCampaign = "campaign" TemplateTypeTx = "tx" )
Enum values for various statuses.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type AdminNotifCallback ¶
AdminNotifCallback is a callback function that's called when a campaign's status changes.
type Attachment ¶
type Attachment struct { Name string Header textproto.MIMEHeader Content []byte }
Attachment represents a file or blob attachment that can be sent along with a message by a Messenger.
type Base ¶
type Base struct { ID int `db:"id" json:"id"` CreatedAt null.Time `db:"created_at" json:"created_at"` UpdatedAt null.Time `db:"updated_at" json:"updated_at"` }
Base holds common fields shared across models.
type Bounce ¶
type Bounce struct { ID int `db:"id" json:"id"` Type string `db:"type" json:"type"` Source string `db:"source" json:"source"` Meta json.RawMessage `db:"meta" json:"meta"` CreatedAt time.Time `db:"created_at" json:"created_at"` // One of these should be provided. Email string `db:"email" json:"email,omitempty"` SubscriberUUID string `db:"subscriber_uuid" json:"subscriber_uuid,omitempty"` SubscriberID int `db:"subscriber_id" json:"subscriber_id,omitempty"` CampaignUUID string `db:"campaign_uuid" json:"campaign_uuid,omitempty"` Campaign *json.RawMessage `db:"campaign" json:"campaign"` // Pseudofield for getting the total number of bounces // in searches and queries. Total int `db:"total" json:"-"` }
Bounce represents a single bounce event.
type Campaign ¶
type Campaign struct { Base CampaignMeta UUID string `db:"uuid" json:"uuid"` Type string `db:"type" json:"type"` Name string `db:"name" json:"name"` Subject string `db:"subject" json:"subject"` FromEmail string `db:"from_email" json:"from_email"` Body string `db:"body" json:"body"` AltBody null.String `db:"altbody" json:"altbody"` SendAt null.Time `db:"send_at" json:"send_at"` Status string `db:"status" json:"status"` ContentType string `db:"content_type" json:"content_type"` Tags pq.StringArray `db:"tags" json:"tags"` Headers Headers `db:"headers" json:"headers"` TemplateID int `db:"template_id" json:"template_id"` Messenger string `db:"messenger" json:"messenger"` Archive bool `db:"archive" json:"archive"` ArchiveSlug null.String `db:"archive_slug" json:"archive_slug"` ArchiveTemplateID int `db:"archive_template_id" json:"archive_template_id"` ArchiveMeta json.RawMessage `db:"archive_meta" json:"archive_meta"` // TemplateBody is joined in from templates by the next-campaigns query. TemplateBody string `db:"template_body" json:"-"` ArchiveTemplateBody string `db:"archive_template_body" json:"-"` Tpl *template.Template `json:"-"` SubjectTpl *txttpl.Template `json:"-"` AltBodyTpl *template.Template `json:"-"` // List of media (attachment) IDs obtained from the next-campaign query // while sending a campaign. MediaIDs pq.Int64Array `json:"-" db:"media_id"` // Fetched bodies of the attachments. Attachments []Attachment `json:"-" db:"-"` // Pseudofield for getting the total number of subscribers // in searches and queries. Total int `db:"total" json:"-"` }
Campaign represents an e-mail campaign.
func (*Campaign) CompileTemplate ¶
CompileTemplate compiles a campaign body template into its base template and sets the resultant template to Campaign.Tpl.
type CampaignAnalyticsCount ¶
type CampaignAnalyticsLink ¶
type CampaignMeta ¶
type CampaignMeta struct { CampaignID int `db:"campaign_id" json:"-"` Views int `db:"views" json:"views"` Clicks int `db:"clicks" json:"clicks"` Bounces int `db:"bounces" json:"bounces"` // This is a list of {list_id, name} pairs unlike Subscriber.Lists[] // because lists can be deleted after a campaign is finished, resulting // in null lists data to be returned. For that reason, campaign_lists maintains // campaign-list associations with a historical record of id + name that persist // even after a list is deleted. Lists types.JSONText `db:"lists" json:"lists"` Media types.JSONText `db:"media" json:"media"` StartedAt null.Time `db:"started_at" json:"started_at"` ToSend int `db:"to_send" json:"to_send"` Sent int `db:"sent" json:"sent"` }
CampaignMeta contains fields tracking a campaign's progress.
type CampaignStats ¶
type CampaignStats struct { ID int `db:"id" json:"id"` Status string `db:"status" json:"status"` ToSend int `db:"to_send" json:"to_send"` Sent int `db:"sent" json:"sent"` Started null.Time `db:"started_at" json:"started_at"` UpdatedAt null.Time `db:"updated_at" json:"updated_at"` Rate int `json:"rate"` NetRate int `json:"net_rate"` }
type Campaigns ¶
type Campaigns []Campaign
Campaigns represents a slice of Campaigns.
type Headers ¶
Headers represents an array of string maps used to represent SMTP, HTTP headers etc. similar to url.Values{}
type JSON ¶
type JSON map[string]interface{}
JSON is the wrapper for reading and writing arbitrary JSONB fields from the DB.
type List ¶
type List struct { Base UUID string `db:"uuid" json:"uuid"` Name string `db:"name" json:"name"` Type string `db:"type" json:"type"` Optin string `db:"optin" json:"optin"` Tags pq.StringArray `db:"tags" json:"tags"` Description string `db:"description" json:"description"` SubscriberCount int `db:"-" json:"subscriber_count"` SubscriberCounts StringIntMap `db:"subscriber_statuses" json:"subscriber_statuses"` SubscriberID int `db:"subscriber_id" json:"-"` // This is only relevant when querying the lists of a subscriber. SubscriptionStatus string `db:"subscription_status" json:"subscription_status,omitempty"` SubscriptionCreatedAt null.Time `db:"subscription_created_at" json:"subscription_created_at,omitempty"` SubscriptionUpdatedAt null.Time `db:"subscription_updated_at" json:"subscription_updated_at,omitempty"` // Pseudofield for getting the total number of subscribers // in searches and queries. Total int `db:"total" json:"-"` }
List represents a mailing list.
type Message ¶
type Message struct { From string To []string Subject string ContentType string Body []byte AltBody []byte Headers textproto.MIMEHeader Attachments []Attachment Subscriber Subscriber // Campaign is generally the same instance for a large number of subscribers. Campaign *Campaign // Messenger is the messenger backend to use: email|postback. Messenger string }
Message is the message pushed to a Messenger.
type PageResults ¶
type PageResults struct { Results interface{} `json:"results"` Query string `json:"query"` Total int `json:"total"` PerPage int `json:"per_page"` Page int `json:"page"` }
PageResults is a generic HTTP response container for paginated results of list of items.
type Queries ¶
type Queries struct { GetDashboardCharts *sqlx.Stmt `query:"get-dashboard-charts"` GetDashboardCounts *sqlx.Stmt `query:"get-dashboard-counts"` InsertSubscriber *sqlx.Stmt `query:"insert-subscriber"` UpsertSubscriber *sqlx.Stmt `query:"upsert-subscriber"` UpsertBlocklistSubscriber *sqlx.Stmt `query:"upsert-blocklist-subscriber"` GetSubscriber *sqlx.Stmt `query:"get-subscriber"` GetSubscribersByEmails *sqlx.Stmt `query:"get-subscribers-by-emails"` GetSubscriberLists *sqlx.Stmt `query:"get-subscriber-lists"` GetSubscriptions *sqlx.Stmt `query:"get-subscriptions"` GetSubscriberListsLazy *sqlx.Stmt `query:"get-subscriber-lists-lazy"` UpdateSubscriber *sqlx.Stmt `query:"update-subscriber"` UpdateSubscriberWithLists *sqlx.Stmt `query:"update-subscriber-with-lists"` BlocklistSubscribers *sqlx.Stmt `query:"blocklist-subscribers"` AddSubscribersToLists *sqlx.Stmt `query:"add-subscribers-to-lists"` DeleteSubscriptions *sqlx.Stmt `query:"delete-subscriptions"` DeleteUnconfirmedSubscriptions *sqlx.Stmt `query:"delete-unconfirmed-subscriptions"` ConfirmSubscriptionOptin *sqlx.Stmt `query:"confirm-subscription-optin"` UnsubscribeSubscribersFromLists *sqlx.Stmt `query:"unsubscribe-subscribers-from-lists"` DeleteSubscribers *sqlx.Stmt `query:"delete-subscribers"` DeleteBlocklistedSubscribers *sqlx.Stmt `query:"delete-blocklisted-subscribers"` DeleteOrphanSubscribers *sqlx.Stmt `query:"delete-orphan-subscribers"` UnsubscribeByCampaign *sqlx.Stmt `query:"unsubscribe-by-campaign"` ExportSubscriberData *sqlx.Stmt `query:"export-subscriber-data"` // Non-prepared arbitrary subscriber queries. QuerySubscribers string `query:"query-subscribers"` QuerySubscribersCount string `query:"query-subscribers-count"` QuerySubscribersCountAll *sqlx.Stmt `query:"query-subscribers-count-all"` QuerySubscribersForExport string `query:"query-subscribers-for-export"` QuerySubscribersTpl string `query:"query-subscribers-template"` DeleteSubscribersByQuery string `query:"delete-subscribers-by-query"` AddSubscribersToListsByQuery string `query:"add-subscribers-to-lists-by-query"` BlocklistSubscribersByQuery string `query:"blocklist-subscribers-by-query"` DeleteSubscriptionsByQuery string `query:"delete-subscriptions-by-query"` UnsubscribeSubscribersFromListsByQuery string `query:"unsubscribe-subscribers-from-lists-by-query"` CreateList *sqlx.Stmt `query:"create-list"` QueryLists string `query:"query-lists"` GetLists *sqlx.Stmt `query:"get-lists"` GetListsByOptin *sqlx.Stmt `query:"get-lists-by-optin"` UpdateList *sqlx.Stmt `query:"update-list"` UpdateListsDate *sqlx.Stmt `query:"update-lists-date"` DeleteLists *sqlx.Stmt `query:"delete-lists"` CreateCampaign *sqlx.Stmt `query:"create-campaign"` QueryCampaigns string `query:"query-campaigns"` GetCampaign *sqlx.Stmt `query:"get-campaign"` GetCampaignForPreview *sqlx.Stmt `query:"get-campaign-for-preview"` GetCampaignStats *sqlx.Stmt `query:"get-campaign-stats"` GetCampaignStatus *sqlx.Stmt `query:"get-campaign-status"` GetArchivedCampaigns *sqlx.Stmt `query:"get-archived-campaigns"` // These two queries are read as strings and based on settings.individual_tracking=on/off, // are interpolated and copied to view and click counts. Same query, different tables. GetCampaignAnalyticsCounts string `query:"get-campaign-analytics-counts"` GetCampaignViewCounts *sqlx.Stmt `query:"get-campaign-view-counts"` GetCampaignClickCounts *sqlx.Stmt `query:"get-campaign-click-counts"` GetCampaignLinkCounts *sqlx.Stmt `query:"get-campaign-link-counts"` GetCampaignBounceCounts *sqlx.Stmt `query:"get-campaign-bounce-counts"` DeleteCampaignViews *sqlx.Stmt `query:"delete-campaign-views"` DeleteCampaignLinkClicks *sqlx.Stmt `query:"delete-campaign-link-clicks"` NextCampaigns *sqlx.Stmt `query:"next-campaigns"` NextCampaignSubscribers *sqlx.Stmt `query:"next-campaign-subscribers"` GetOneCampaignSubscriber *sqlx.Stmt `query:"get-one-campaign-subscriber"` UpdateCampaign *sqlx.Stmt `query:"update-campaign"` UpdateCampaignStatus *sqlx.Stmt `query:"update-campaign-status"` UpdateCampaignCounts *sqlx.Stmt `query:"update-campaign-counts"` UpdateCampaignArchive *sqlx.Stmt `query:"update-campaign-archive"` RegisterCampaignView *sqlx.Stmt `query:"register-campaign-view"` DeleteCampaign *sqlx.Stmt `query:"delete-campaign"` InsertMedia *sqlx.Stmt `query:"insert-media"` GetMedia *sqlx.Stmt `query:"get-media"` QueryMedia *sqlx.Stmt `query:"query-media"` DeleteMedia *sqlx.Stmt `query:"delete-media"` CreateTemplate *sqlx.Stmt `query:"create-template"` GetTemplates *sqlx.Stmt `query:"get-templates"` UpdateTemplate *sqlx.Stmt `query:"update-template"` SetDefaultTemplate *sqlx.Stmt `query:"set-default-template"` DeleteTemplate *sqlx.Stmt `query:"delete-template"` CreateLink *sqlx.Stmt `query:"create-link"` RegisterLinkClick *sqlx.Stmt `query:"register-link-click"` GetSettings *sqlx.Stmt `query:"get-settings"` UpdateSettings *sqlx.Stmt `query:"update-settings"` // GetStats *sqlx.Stmt `query:"get-stats"` RecordBounce *sqlx.Stmt `query:"record-bounce"` QueryBounces string `query:"query-bounces"` DeleteBounces *sqlx.Stmt `query:"delete-bounces"` DeleteBouncesBySubscriber *sqlx.Stmt `query:"delete-bounces-by-subscriber"` GetDBInfo string `query:"get-db-info"` }
Queries contains all prepared SQL queries.
func (*Queries) CompileSubscriberQueryTpl ¶
CompileSubscriberQueryTpl takes an arbitrary WHERE expressions to filter subscribers from the subscribers table and prepares a query out of it using the raw `query-subscribers-template` query template. While doing this, a readonly transaction is created and the query is dry run on it to ensure that it is indeed readonly.
func (*Queries) ExecSubQueryTpl ¶
func (q *Queries) ExecSubQueryTpl(exp, tpl string, listIDs []int, db *sqlx.DB, args ...interface{}) error
compileSubscriberQueryTpl takes an arbitrary WHERE expressions and a subscriber query template that depends on the filter (eg: delete by query, blocklist by query etc.) combines and executes them.
type Settings ¶
type Settings struct { AppSiteName string `json:"app.site_name"` AppRootURL string `json:"app.root_url"` AppLogoURL string `json:"app.logo_url"` AppFaviconURL string `json:"app.favicon_url"` AppFromEmail string `json:"app.from_email"` AppNotifyEmails []string `json:"app.notify_emails"` EnablePublicSubPage bool `json:"app.enable_public_subscription_page"` EnablePublicArchive bool `json:"app.enable_public_archive"` EnablePublicArchiveRSSContent bool `json:"app.enable_public_archive_rss_content"` SendOptinConfirmation bool `json:"app.send_optin_confirmation"` CheckUpdates bool `json:"app.check_updates"` AppLang string `json:"app.lang"` AppBatchSize int `json:"app.batch_size"` AppConcurrency int `json:"app.concurrency"` AppMaxSendErrors int `json:"app.max_send_errors"` AppMessageRate int `json:"app.message_rate"` CacheSlowQueries bool `json:"app.cache_slow_queries"` CacheSlowQueriesInterval string `json:"app.cache_slow_queries_interval"` AppMessageSlidingWindow bool `json:"app.message_sliding_window"` AppMessageSlidingWindowDuration string `json:"app.message_sliding_window_duration"` AppMessageSlidingWindowRate int `json:"app.message_sliding_window_rate"` PrivacyIndividualTracking bool `json:"privacy.individual_tracking"` PrivacyUnsubHeader bool `json:"privacy.unsubscribe_header"` PrivacyAllowBlocklist bool `json:"privacy.allow_blocklist"` PrivacyAllowPreferences bool `json:"privacy.allow_preferences"` PrivacyAllowExport bool `json:"privacy.allow_export"` PrivacyAllowWipe bool `json:"privacy.allow_wipe"` PrivacyExportable []string `json:"privacy.exportable"` PrivacyRecordOptinIP bool `json:"privacy.record_optin_ip"` DomainBlocklist []string `json:"privacy.domain_blocklist"` SecurityEnableCaptcha bool `json:"security.enable_captcha"` SecurityCaptchaKey string `json:"security.captcha_key"` SecurityCaptchaSecret string `json:"security.captcha_secret"` UploadProvider string `json:"upload.provider"` UploadExtensions []string `json:"upload.extensions"` UploadFilesystemUploadPath string `json:"upload.filesystem.upload_path"` UploadFilesystemUploadURI string `json:"upload.filesystem.upload_uri"` UploadS3URL string `json:"upload.s3.url"` UploadS3PublicURL string `json:"upload.s3.public_url"` UploadS3AwsAccessKeyID string `json:"upload.s3.aws_access_key_id"` UploadS3AwsDefaultRegion string `json:"upload.s3.aws_default_region"` UploadS3AwsSecretAccessKey string `json:"upload.s3.aws_secret_access_key,omitempty"` UploadS3Bucket string `json:"upload.s3.bucket"` UploadS3BucketDomain string `json:"upload.s3.bucket_domain"` UploadS3BucketPath string `json:"upload.s3.bucket_path"` UploadS3BucketType string `json:"upload.s3.bucket_type"` UploadS3Expiry string `json:"upload.s3.expiry"` SMTP []struct { UUID string `json:"uuid"` Enabled bool `json:"enabled"` Host string `json:"host"` HelloHostname string `json:"hello_hostname"` Port int `json:"port"` AuthProtocol string `json:"auth_protocol"` Username string `json:"username"` Password string `json:"password,omitempty"` EmailHeaders []map[string]string `json:"email_headers"` MaxConns int `json:"max_conns"` MaxMsgRetries int `json:"max_msg_retries"` IdleTimeout string `json:"idle_timeout"` WaitTimeout string `json:"wait_timeout"` TLSType string `json:"tls_type"` TLSSkipVerify bool `json:"tls_skip_verify"` } `json:"smtp"` Messengers []struct { UUID string `json:"uuid"` Enabled bool `json:"enabled"` Name string `json:"name"` RootURL string `json:"root_url"` Username string `json:"username"` Password string `json:"password,omitempty"` MaxConns int `json:"max_conns"` Timeout string `json:"timeout"` MaxMsgRetries int `json:"max_msg_retries"` } `json:"messengers"` BounceEnabled bool `json:"bounce.enabled"` BounceEnableWebhooks bool `json:"bounce.webhooks_enabled"` BounceActions map[string]struct { Count int `json:"count"` Action string `json:"action"` } `json:"bounce.actions"` SESEnabled bool `json:"bounce.ses_enabled"` SendgridEnabled bool `json:"bounce.sendgrid_enabled"` SendgridKey string `json:"bounce.sendgrid_key"` BouncePostmark struct { Enabled bool `json:"enabled"` Username string `json:"username"` Password string `json:"password"` } `json:"bounce.postmark"` BounceBoxes []struct { UUID string `json:"uuid"` Enabled bool `json:"enabled"` Type string `json:"type"` Host string `json:"host"` Port int `json:"port"` AuthProtocol string `json:"auth_protocol"` ReturnPath string `json:"return_path"` Username string `json:"username"` Password string `json:"password,omitempty"` TLSEnabled bool `json:"tls_enabled"` TLSSkipVerify bool `json:"tls_skip_verify"` ScanInterval string `json:"scan_interval"` } `json:"bounce.mailboxes"` AdminCustomCSS string `json:"appearance.admin.custom_css"` AdminCustomJS string `json:"appearance.admin.custom_js"` PublicCustomCSS string `json:"appearance.public.custom_css"` PublicCustomJS string `json:"appearance.public.custom_js"` }
Settings represents the app settings stored in the DB.
type StringIntMap ¶
StringIntMap is used to define DB Scan()s.
func (StringIntMap) Scan ¶
func (s StringIntMap) Scan(src interface{}) error
Scan unmarshals JSONB from the DB.
type Subscriber ¶
type Subscriber struct { Base UUID string `db:"uuid" json:"uuid"` Email string `db:"email" json:"email" form:"email"` Name string `db:"name" json:"name" form:"name"` Attribs JSON `db:"attribs" json:"attribs"` Status string `db:"status" json:"status"` Lists types.JSONText `db:"lists" json:"lists"` }
Subscriber represents an e-mail subscriber.
func (Subscriber) FirstName ¶
func (s Subscriber) FirstName() string
FirstName splits the name by spaces and returns the first chunk of the name that's greater than 2 characters in length, assuming that it is the subscriber's first name.
func (Subscriber) LastName ¶
func (s Subscriber) LastName() string
LastName splits the name by spaces and returns the last chunk of the name that's greater than 2 characters in length, assuming that it is the subscriber's last name.
type SubscriberExport ¶
type SubscriberExport struct { Base UUID string `db:"uuid" json:"uuid"` Email string `db:"email" json:"email"` Name string `db:"name" json:"name"` Attribs string `db:"attribs" json:"attribs"` Status string `db:"status" json:"status"` }
SubscriberExport represents a subscriber record that is exported to raw data.
type SubscriberExportProfile ¶
type SubscriberExportProfile struct { Email string `db:"email" json:"-"` Profile json.RawMessage `db:"profile" json:"profile,omitempty"` Subscriptions json.RawMessage `db:"subscriptions" json:"subscriptions,omitempty"` CampaignViews json.RawMessage `db:"campaign_views" json:"campaign_views,omitempty"` LinkClicks json.RawMessage `db:"link_clicks" json:"link_clicks,omitempty"` }
SubscriberExportProfile represents a subscriber's collated data in JSON for export.
type Subscribers ¶
type Subscribers []Subscriber
Subscribers represents a slice of Subscriber.
func (Subscribers) GetIDs ¶
func (subs Subscribers) GetIDs() []int
GetIDs returns the list of subscriber IDs.
type Subscription ¶
type Subscription struct { List SubscriptionStatus null.String `db:"subscription_status" json:"subscription_status"` SubscriptionCreatedAt null.String `db:"subscription_created_at" json:"subscription_created_at"` Meta json.RawMessage `db:"meta" json:"meta"` }
Subscription represents a list attached to a subscriber.
type Template ¶
type Template struct { Base Name string `db:"name" json:"name"` // Subject is only for type=tx. Subject string `db:"subject" json:"subject"` Type string `db:"type" json:"type"` Body string `db:"body" json:"body,omitempty"` IsDefault bool `db:"is_default" json:"is_default"` // Only relevant to tx (transactional) templates. SubjectTpl *txttpl.Template `json:"-"` Tpl *template.Template `json:"-"` }
Template represents a reusable e-mail template.
type TxMessage ¶
type TxMessage struct { SubscriberEmails []string `json:"subscriber_emails"` SubscriberIDs []int `json:"subscriber_ids"` // Deprecated. SubscriberEmail string `json:"subscriber_email"` SubscriberID int `json:"subscriber_id"` TemplateID int `json:"template_id"` Data map[string]interface{} `json:"data"` FromEmail string `json:"from_email"` Headers Headers `json:"headers"` ContentType string `json:"content_type"` Messenger string `json:"messenger"` // File attachments added from multi-part form data. Attachments []Attachment `json:"-"` Subject string `json:"-"` Body []byte `json:"-"` Tpl *template.Template `json:"-"` SubjectTpl *txttpl.Template `json:"-"` }
TxMessage represents an e-mail campaign.
type TxcMessage ¶
type TxcMessage struct { SubscriberID int `json:"subscriber_id"` TemplateID int `json:"template_id"` ListID int `json:"list_id"` Subject string `json:"-"` Body []byte `json:"-"` }
func (*TxcMessage) Render ¶
func (m *TxcMessage) Render(campTpl *Template, msgTpl *Template, funcMap template.FuncMap, data TxcRenderData) error
type TxcRenderData ¶
type TxcRenderData struct { UnsubscribeURL string Campaign TxcRenderDataCampaign Subscriber Subscriber }