Skip to content

Commit b7f245f

Browse files
committed
client: introduce DataCommand
Closes: #189
1 parent 170fe35 commit b7f245f

File tree

1 file changed

+42
-2
lines changed

1 file changed

+42
-2
lines changed

client.go

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -530,6 +530,46 @@ func (c *Client) Rcpt(to string, opts *RcptOptions) error {
530530
return nil
531531
}
532532

533+
type DataCommand struct {
534+
c *Client
535+
wc io.WriteCloser
536+
537+
closeErr error
538+
statusText string
539+
}
540+
541+
func (cmd *DataCommand) Write(b []byte) (int, error) {
542+
return cmd.wc.Write(b)
543+
}
544+
545+
func (cmd *DataCommand) Close() error {
546+
if cmd.closeErr != nil {
547+
return cmd.closeErr
548+
}
549+
550+
if err := cmd.wc.Close(); err != nil {
551+
cmd.closeErr = err
552+
return err
553+
}
554+
555+
cmd.c.conn.SetDeadline(time.Now().Add(cmd.c.SubmissionTimeout))
556+
defer cmd.c.conn.SetDeadline(time.Time{})
557+
558+
_, msg, err := cmd.c.readResponse(250)
559+
if err != nil {
560+
cmd.closeErr = err
561+
return err
562+
}
563+
564+
cmd.statusText = msg
565+
cmd.closeErr = errors.New("smtp: data writer closed twice")
566+
return nil
567+
}
568+
569+
func (cmd *DataCommand) StatusText() string {
570+
return cmd.statusText
571+
}
572+
533573
type dataCloser struct {
534574
c *Client
535575
io.WriteCloser
@@ -583,12 +623,12 @@ func (d *dataCloser) Close() error {
583623
// Data must be preceded by one or more calls to Rcpt.
584624
//
585625
// If server returns an error, it will be of type *SMTPError.
586-
func (c *Client) Data() (io.WriteCloser, error) {
626+
func (c *Client) Data() (*DataCommand, error) {
587627
_, _, err := c.cmd(354, "DATA")
588628
if err != nil {
589629
return nil, err
590630
}
591-
return &dataCloser{c: c, WriteCloser: c.text.DotWriter()}, nil
631+
return &DataCommand{c: c, wc: c.text.DotWriter()}, nil
592632
}
593633

594634
// LMTPData is the LMTP-specific version of the Data method. It accepts a callback

0 commit comments

Comments
 (0)