@@ -530,6 +530,46 @@ func (c *Client) Rcpt(to string, opts *RcptOptions) error {
530
530
return nil
531
531
}
532
532
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
+
533
573
type dataCloser struct {
534
574
c * Client
535
575
io.WriteCloser
@@ -583,12 +623,12 @@ func (d *dataCloser) Close() error {
583
623
// Data must be preceded by one or more calls to Rcpt.
584
624
//
585
625
// 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 ) {
587
627
_ , _ , err := c .cmd (354 , "DATA" )
588
628
if err != nil {
589
629
return nil , err
590
630
}
591
- return & dataCloser {c : c , WriteCloser : c .text .DotWriter ()}, nil
631
+ return & DataCommand {c : c , wc : c .text .DotWriter ()}, nil
592
632
}
593
633
594
634
// LMTPData is the LMTP-specific version of the Data method. It accepts a callback
0 commit comments