Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 12 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,16 @@ mailtrap company-info create --domain-id 123 --name "Your Company" --address "12
--city "San Francisco" --country US --zip-code 94105 --website-url "https://yourdomain.com"
mailtrap company-info update --domain-id 123 --city "New York" --zip-code 10001

# Suppressions
mailtrap suppressions list --email "bounced@example.com"
mailtrap suppressions create --email "bounced@example.com" --domain-id 123 --sending-stream transactional
mailtrap suppressions delete --id "2fe148b8-b019-431f-ab3f-107663fdf868"

# Tracking opt-outs
mailtrap tracking-opt-outs list
mailtrap tracking-opt-outs create --email "no-tracking@example.com" --domain-id 123
mailtrap tracking-opt-outs delete --id "0198f1c4-0c0f-7a1c-8b0e-3f5d2a1b4c6d"

# Templates
mailtrap templates list
mailtrap templates create --name "Welcome" --subject "Hello {{name}}" --body-html '<h1>Hi!</h1>'
Expand Down Expand Up @@ -171,7 +181,8 @@ mailtrap domains list --output text
| **Domains** | `domains list`, `domains get`, `domains create`, `domains update`, `domains delete`, `domains send-setup-instructions` |
| **Company Info** | `company-info get`, `company-info create`, `company-info update` |
| **Templates** | `templates list`, `templates get`, `templates create`, `templates update`, `templates delete` |
| **Suppressions** | `suppressions list`, `suppressions delete` |
| **Suppressions** | `suppressions list`, `suppressions create`, `suppressions delete` |
| **Tracking Opt-outs** | `tracking-opt-outs list`, `tracking-opt-outs create`, `tracking-opt-outs delete` |
| **Webhooks** | `webhooks list`, `webhooks get`, `webhooks create`, `webhooks update`, `webhooks delete` |
| **Stats** | `stats get`, `stats by-domain`, `stats by-category`, `stats by-esp`, `stats by-date` |
| **Email Logs** | `email-logs list`, `email-logs get` |
Expand Down
2 changes: 2 additions & 0 deletions cmd/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import (
"github.com/mailtrap/mailtrap-cli/internal/commands/suppressions"
"github.com/mailtrap/mailtrap-cli/internal/commands/templates"
"github.com/mailtrap/mailtrap-cli/internal/commands/tokens"
"github.com/mailtrap/mailtrap-cli/internal/commands/trackingoptouts"
"github.com/mailtrap/mailtrap-cli/internal/commands/webhooks"
)

Expand Down Expand Up @@ -59,6 +60,7 @@ func NewRootCmd(f *cmdutil.Factory) *cobra.Command {
cmd.AddCommand(domains.NewCmdDomains(f))
cmd.AddCommand(companyinfo.NewCmdCompanyInfo(f))
cmd.AddCommand(suppressions.NewCmdSuppressions(f))
cmd.AddCommand(trackingoptouts.NewCmdTrackingOptOuts(f))
cmd.AddCommand(stats.NewCmdStats(f))
cmd.AddCommand(templates.NewCmdTemplates(f))
cmd.AddCommand(email_logs.NewCmdEmailLogs(f))
Expand Down
78 changes: 78 additions & 0 deletions internal/commands/suppressions/create.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package suppressions

import (
"context"
"fmt"

"github.com/mailtrap/mailtrap-cli/internal/client"
"github.com/mailtrap/mailtrap-cli/internal/cmdutil"
"github.com/mailtrap/mailtrap-cli/internal/config"
"github.com/mailtrap/mailtrap-cli/internal/output"
"github.com/spf13/cobra"
)

type suppressionResponse struct {
Data Suppression `json:"data"`
}

func NewCmdCreate(f *cmdutil.Factory) *cobra.Command {
var (
email string
domainID int64
sendingStream string
suppressType string
)

cmd := &cobra.Command{
Use: "create",
Short: "Add an email address to the suppression list",
RunE: func(cmd *cobra.Command, args []string) error {
if err := cmdutil.RequireFlag("email", email); err != nil {
return err
}
if !cmd.Flags().Changed("domain-id") {
return fmt.Errorf("--domain-id is required")
}
Comment thread
mklocek marked this conversation as resolved.
if domainID <= 0 {
return fmt.Errorf("--domain-id must be greater than 0")
}
if err := cmdutil.RequireFlag("sending-stream", sendingStream); err != nil {
return err
}

c, err := f.NewClient()
if err != nil {
return err
}

_, err = config.RequireAccountID()
if err != nil {
return err
}

body := map[string]interface{}{
"email": email,
"domain_id": domainID,
"sending_stream": sendingStream,
}
if cmd.Flags().Changed("type") {
body["type"] = suppressType
}

var resp suppressionResponse
if err := c.Post(context.Background(), client.BaseGeneral, cmdutil.AccountPath("suppressions"), body, &resp); err != nil {
return err
}

format := cmdutil.GetOutputFormat()
return output.Print(f.IOStreams.Out, format, resp.Data, suppressionColumns)
},
}

cmd.Flags().StringVar(&email, "email", "", "Email address to suppress (required)")
cmd.Flags().Int64Var(&domainID, "domain-id", 0, "ID of the sending domain the suppression applies to (required)")
cmd.Flags().StringVar(&sendingStream, "sending-stream", "", "Sending stream to suppress for: transactional, bulk (required)")
cmd.Flags().StringVar(&suppressType, "type", "", "Suppression reason: hard bounce, spam complaint, unsubscription, manual import")

return cmd
}
19 changes: 14 additions & 5 deletions internal/commands/suppressions/list.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,23 +12,28 @@ import (
)

type Suppression struct {
ID string `json:"id"`
Email string `json:"email"`
Reason string `json:"reason"`
CreatedAt string `json:"created_at"`
ID string `json:"id"`
Email string `json:"email"`
Type string `json:"type"`
SendingStream string `json:"sending_stream,omitempty"`
DomainName string `json:"domain_name,omitempty"`
CreatedAt string `json:"created_at"`
}

var suppressionColumns = []output.Column{
{Header: "ID", Field: "id"},
{Header: "EMAIL", Field: "email"},
{Header: "REASON", Field: "reason"},
{Header: "TYPE", Field: "type"},
{Header: "SENDING_STREAM", Field: "sending_stream"},
{Header: "DOMAIN_NAME", Field: "domain_name"},
{Header: "CREATED_AT", Field: "created_at"},
}

func NewCmdList(f *cmdutil.Factory) *cobra.Command {
var email string
var startTime string
var endTime string
var lastID string

cmd := &cobra.Command{
Use: "list",
Expand Down Expand Up @@ -56,6 +61,9 @@ func NewCmdList(f *cmdutil.Factory) *cobra.Command {
if endTime != "" {
query.Set("end_time", endTime)
}
if lastID != "" {
query.Set("last_id", lastID)
}

var suppressions []Suppression
if err := c.Get(context.Background(), client.BaseGeneral, path, query, &suppressions); err != nil {
Expand All @@ -70,6 +78,7 @@ func NewCmdList(f *cmdutil.Factory) *cobra.Command {
cmd.Flags().StringVar(&email, "email", "", "Filter by email address")
cmd.Flags().StringVar(&startTime, "start-time", "", "Filter by start time")
cmd.Flags().StringVar(&endTime, "end-time", "", "Filter by end time")
cmd.Flags().StringVar(&lastID, "last-id", "", "Pagination cursor (id of the last record from the previous response)")

return cmd
}
1 change: 1 addition & 0 deletions internal/commands/suppressions/suppressions.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ func NewCmdSuppressions(f *cmdutil.Factory) *cobra.Command {
}

cmd.AddCommand(NewCmdList(f))
cmd.AddCommand(NewCmdCreate(f))
cmd.AddCommand(NewCmdDelete(f))

return cmd
Expand Down
Loading
Loading