@@ -430,9 +430,14 @@ type dataCloser struct {
430
430
c * Client
431
431
io.WriteCloser
432
432
statusCb func (rcpt string , status * SMTPError )
433
+ closed bool
433
434
}
434
435
435
436
func (d * dataCloser ) Close () error {
437
+ if d .closed {
438
+ return fmt .Errorf ("smtp: data writer closed twice" )
439
+ }
440
+
436
441
if err := d .WriteCloser .Close (); err != nil {
437
442
return err
438
443
}
@@ -457,7 +462,6 @@ func (d *dataCloser) Close() error {
457
462
}
458
463
expectedResponses --
459
464
}
460
- return nil
461
465
} else {
462
466
_ , _ , err := d .c .Text .ReadResponse (250 )
463
467
if err != nil {
@@ -466,8 +470,10 @@ func (d *dataCloser) Close() error {
466
470
}
467
471
return err
468
472
}
469
- return nil
470
473
}
474
+
475
+ d .closed = true
476
+ return nil
471
477
}
472
478
473
479
// Data issues a DATA command to the server and returns a writer that
@@ -481,7 +487,7 @@ func (c *Client) Data() (io.WriteCloser, error) {
481
487
if err != nil {
482
488
return nil , err
483
489
}
484
- return & dataCloser {c , c .Text .DotWriter (), nil }, nil
490
+ return & dataCloser {c : c , WriteCloser : c .Text .DotWriter ()}, nil
485
491
}
486
492
487
493
// LMTPData is the LMTP-specific version of the Data method. It accepts a callback
@@ -501,7 +507,7 @@ func (c *Client) LMTPData(statusCb func(rcpt string, status *SMTPError)) (io.Wri
501
507
if err != nil {
502
508
return nil , err
503
509
}
504
- return & dataCloser {c , c .Text .DotWriter (), statusCb }, nil
510
+ return & dataCloser {c : c , WriteCloser : c .Text .DotWriter (), statusCb : statusCb }, nil
505
511
}
506
512
507
513
// SendMail will use an existing connection to send an email from
0 commit comments