From eeaa518fc307293400a2ed2f111a73e11dd595f1 Mon Sep 17 00:00:00 2001 From: Yun Date: Fri, 21 Nov 2025 15:54:49 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4SetOptions=E7=9A=84=E6=96=B9?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- aliyun/aliyun.go | 14 ++++++++------ aliyun/aliyun_test.go | 4 ++-- aws/aws.go | 24 +++++++++++++----------- aws/aws_old.go | 6 +++--- aws/aws_test.go | 4 ++-- cmd/main.go | 8 ++++---- enhanced_test.go | 8 ++++---- html_email_example.go | 10 +++++----- interfaces/interfaces.go | 14 +++++++------- mailgun/mailgun.go | 13 +++++++------ mailgun/mailgun_test.go | 4 ++-- performance_test.go | 26 +++++++++++++------------- smtp/example_usage.go | 6 +++--- smtp/html_email_test.go | 4 ++-- smtp/smtp.go | 18 ++++++++++-------- smtp/smtp_enhanced_test.go | 6 +++--- smtp/smtp_test.go | 7 ++----- 17 files changed, 90 insertions(+), 86 deletions(-) diff --git a/aliyun/aliyun.go b/aliyun/aliyun.go index 7f87794..a82f6fd 100644 --- a/aliyun/aliyun.go +++ b/aliyun/aliyun.go @@ -34,18 +34,18 @@ func NewAliyun() *Aliyun { return aliyun } -func (l *Aliyun) SetOption(ctx context.Context, opt ...interfaces.Option) (interfaces.EmailInterface, error) { +func (l *Aliyun) SetOption(ctx context.Context, opt ...interfaces.Option) error { for _, o := range opt { o(&l.Options) } if l.Options.Aliyun == nil { - return nil, fmt.Errorf("Aliyun configuration is required") + return fmt.Errorf("Aliyun configuration is required") } // 验证配置 if err := l.validateConfig(); err != nil { - return nil, fmt.Errorf("invalid Aliyun config: %w", err) + return fmt.Errorf("invalid Aliyun config: %w", err) } // 安全日志输出 @@ -64,15 +64,17 @@ func (l *Aliyun) SetOption(ctx context.Context, opt ...interfaces.Option) (inter client, err := dm20151123.NewClient(config) if err != nil { - return nil, fmt.Errorf("failed to create Aliyun client: %w", err) + return fmt.Errorf("failed to create Aliyun client: %w", err) } + l.IsSet = true + l.client = client - return l, nil + return nil } func (l *Aliyun) Send(ctx context.Context, params interfaces.Message) error { - if l.client == nil { + if !l.IsSet { return fmt.Errorf("Aliyun client not initialized") } diff --git a/aliyun/aliyun_test.go b/aliyun/aliyun_test.go index 2949eb4..0a075ec 100644 --- a/aliyun/aliyun_test.go +++ b/aliyun/aliyun_test.go @@ -10,10 +10,10 @@ import ( ) func TestSend(t *testing.T) { - aliyun := aliyun.NewAliyun() + ali := aliyun.NewAliyun() ctx := context.Background() - ali, err := aliyun.SetOption(ctx, interfaces.SetAliyun(&interfaces.EmialConfigDataAliyun{ + err := ali.SetOption(ctx, interfaces.SetAliyun(&interfaces.EmialConfigDataAliyun{ AccessId: "LTAI5tEQ8L8fmDir8udD3CFr", AccessKey: "llg9M1U56s2SW5PuerlKPvTB1xYhn0", Endpoint: "dm.aliyuncs.com", diff --git a/aws/aws.go b/aws/aws.go index dea1b9f..332546b 100644 --- a/aws/aws.go +++ b/aws/aws.go @@ -14,9 +14,9 @@ import ( ) const ( - MaxRetries = 3 - DefaultRegion = "us-east-1" - MaxRecipients = 50 // AWS SES limit + MaxRetries = 3 + DefaultRegion = "us-east-1" + MaxRecipients = 50 // AWS SES limit ) type Aws struct { @@ -31,18 +31,18 @@ func NewAws() *Aws { return aws } -func (l *Aws) SetOption(ctx context.Context, opt ...interfaces.Option) (interfaces.EmailInterface, error) { +func (l *Aws) SetOption(ctx context.Context, opt ...interfaces.Option) error { for _, o := range opt { o(&l.Options) } if l.Options.Aws == nil { - return nil, fmt.Errorf("AWS configuration is required") + return fmt.Errorf("AWS configuration is required") } // 验证配置 if err := l.validateConfig(); err != nil { - return nil, fmt.Errorf("invalid AWS config: %w", err) + return fmt.Errorf("invalid AWS config: %w", err) } if l.Options.Aws.Region == "" { @@ -51,18 +51,20 @@ func (l *Aws) SetOption(ctx context.Context, opt ...interfaces.Option) (interfac // 初始化SES客户端 if err := l.initSESClient(); err != nil { - return nil, fmt.Errorf("failed to initialize SES client: %w", err) + return fmt.Errorf("failed to initialize SES client: %w", err) } // 安全日志输出 - l.Options.Logger.Infof(ctx, "AWS SES configured - Region:%s Sender:%s", + l.Options.Logger.Infof(ctx, "AWS SES configured - Region:%s Sender:%s", l.Options.Aws.Region, l.Options.Aws.Sender) - return l, nil + l.IsSet = true + + return nil } func (l *Aws) Send(ctx context.Context, params interfaces.Message) error { - if l.sesClient == nil { + if !l.IsSet { return fmt.Errorf("AWS SES client not initialized") } @@ -204,4 +206,4 @@ func (l *Aws) sendEmail(ctx context.Context, params interfaces.Message) error { } return nil -} \ No newline at end of file +} diff --git a/aws/aws_old.go b/aws/aws_old.go index 70debad..de583f0 100644 --- a/aws/aws_old.go +++ b/aws/aws_old.go @@ -25,7 +25,7 @@ func NewAwsOld() *AwsOld { return aws } -func (l *AwsOld) SetOption(ctx context.Context, opt ...interfaces.Option) (interfaces.EmailInterface, error) { +func (l *AwsOld) SetOption(ctx context.Context, opt ...interfaces.Option) error { for _, o := range opt { o(&l.Options) @@ -33,14 +33,14 @@ func (l *AwsOld) SetOption(ctx context.Context, opt ...interfaces.Option) (inter l.Options.Logger.Infof(ctx, "Aws:%+v", l.Options.Aws) if l.Options.Aws == nil { - return nil, errors.New("not aws") + return errors.New("not aws") } if l.Options.Aws.Region == "" { l.Options.Aws.Region = "ap-northeast-1" } - return l, nil + return nil } func (l *AwsOld) Send(ctx context.Context, params interfaces.Message) error { diff --git a/aws/aws_test.go b/aws/aws_test.go index d6300ee..2951eb5 100644 --- a/aws/aws_test.go +++ b/aws/aws_test.go @@ -21,11 +21,11 @@ func TestSend(t *testing.T) { // #发件人 // Source: "chenlihan@dreaminglife.cn" - a := aws.NewAws() + ini := aws.NewAws() ctx := context.Background() - ini, err := a.SetOption(ctx, interfaces.SetAws(&interfaces.EmailConfigDataAws{ + err := ini.SetOption(ctx, interfaces.SetAws(&interfaces.EmailConfigDataAws{ AccessId: "AKIAU6GD3MNRHKR4RZG5", AccessSecret: "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", Region: "ap-northeast-1", diff --git a/cmd/main.go b/cmd/main.go index 4983197..9b79bc8 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -18,7 +18,7 @@ func main() { panic(err) } // 使用em进行后续操作 - em,err = em.SetOption(ctx, interfaces.SetSmtp(&interfaces.EmailConfigDataSmtp{ + err = em.SetOption(ctx, interfaces.SetSmtp(&interfaces.EmailConfigDataSmtp{ Username: "support@email.blueoceanpay.com", Password: "SupporT2017", ReplyTo: "", @@ -30,10 +30,10 @@ func main() { } err = em.Send(ctx, interfaces.Message{ - Form: "yun@blueoceanpay.com", - To: []string{"995116474@qq.com"}, + Form: "yun@blueoceanpay.com", + To: []string{"995116474@qq.com"}, Subject: "Test Email", - Body: "Hello, this is a test email.", + Body: "Hello, this is a test email.", }) if err != nil { panic(err) diff --git a/enhanced_test.go b/enhanced_test.go index d3b6a68..4ab860c 100644 --- a/enhanced_test.go +++ b/enhanced_test.go @@ -19,7 +19,7 @@ func TestSMTPEnhanced(t *testing.T) { ctx := context.Background() // 测试配置验证 - _, err := smtpClient.SetOption(ctx, func(opt *interfaces.Options) { + err := smtpClient.SetOption(ctx, func(opt *interfaces.Options) { opt.Smtp = &interfaces.EmailConfigDataSmtp{ Host: "smtp.example.com", Port: "587", @@ -53,7 +53,7 @@ func TestAliyunEnhanced(t *testing.T) { ctx := context.Background() // 测试配置验证 - _, err := aliyunClient.SetOption(ctx, func(opt *interfaces.Options) { + err := aliyunClient.SetOption(ctx, func(opt *interfaces.Options) { opt.Aliyun = &interfaces.EmialConfigDataAliyun{ AccessId: "test-access-id", AccessKey: "test-access-key", @@ -74,7 +74,7 @@ func TestAWSEnhanced(t *testing.T) { ctx := context.Background() // 测试配置验证 - _, err := awsClient.SetOption(ctx, func(opt *interfaces.Options) { + err := awsClient.SetOption(ctx, func(opt *interfaces.Options) { opt.Aws = &interfaces.EmailConfigDataAws{ AccessId: "test-access-id", AccessSecret: "test-access-secret", @@ -95,7 +95,7 @@ func TestMailgunEnhanced(t *testing.T) { ctx := context.Background() // 测试配置验证 - _, err := mailgunClient.SetOption(ctx, func(opt *interfaces.Options) { + err := mailgunClient.SetOption(ctx, func(opt *interfaces.Options) { opt.Mailgun = &interfaces.EmialConfigDataMailgun{ ApiKey: "test-api-key", Domain: "example.com", diff --git a/html_email_example.go b/html_email_example.go index ae144ef..fa45d42 100644 --- a/html_email_example.go +++ b/html_email_example.go @@ -15,7 +15,7 @@ func ExampleHTMLEmail() { smtpClient := smtp.NewSmtp() // 配置SMTP - _, err := smtpClient.SetOption(ctx, func(opt *interfaces.Options) { + err := smtpClient.SetOption(ctx, func(opt *interfaces.Options) { opt.Smtp = &interfaces.EmailConfigDataSmtp{ Host: "smtp.gmail.com", Port: "587", @@ -110,7 +110,7 @@ func ExampleTextEmail() { ctx := context.Background() smtpClient := smtp.NewSmtp() - _, err := smtpClient.SetOption(ctx, func(opt *interfaces.Options) { + err := smtpClient.SetOption(ctx, func(opt *interfaces.Options) { opt.Smtp = &interfaces.EmailConfigDataSmtp{ Host: "smtp.gmail.com", Port: "587", @@ -159,7 +159,7 @@ func ExampleAutoDetectContentType() { ctx := context.Background() smtpClient := smtp.NewSmtp() - _, err := smtpClient.SetOption(ctx, func(opt *interfaces.Options) { + err := smtpClient.SetOption(ctx, func(opt *interfaces.Options) { opt.Smtp = &interfaces.EmailConfigDataSmtp{ Host: "smtp.gmail.com", Port: "587", @@ -205,7 +205,7 @@ func ExampleByteDataAttachment() { ctx := context.Background() smtpClient := smtp.NewSmtp() - _, err := smtpClient.SetOption(ctx, func(opt *interfaces.Options) { + err := smtpClient.SetOption(ctx, func(opt *interfaces.Options) { opt.Smtp = &interfaces.EmailConfigDataSmtp{ Host: "smtp.gmail.com", Port: "587", @@ -250,7 +250,7 @@ func ExampleComplexHTMLEmail() { ctx := context.Background() smtpClient := smtp.NewSmtp() - _, err := smtpClient.SetOption(ctx, func(opt *interfaces.Options) { + err := smtpClient.SetOption(ctx, func(opt *interfaces.Options) { opt.Smtp = &interfaces.EmailConfigDataSmtp{ Host: "smtp.gmail.com", Port: "587", diff --git a/interfaces/interfaces.go b/interfaces/interfaces.go index 86e69fc..f949b10 100644 --- a/interfaces/interfaces.go +++ b/interfaces/interfaces.go @@ -5,10 +5,8 @@ import ( "errors" ) - - type EmailInterface interface { - SetOption(ctx context.Context, opt ...Option) (EmailInterface, error) // 初始化 + SetOption(ctx context.Context, opt ...Option) error // 初始化 GetEmailType() EmailType // Send 发送邮件 Send(ctx context.Context, params Message) error @@ -24,6 +22,7 @@ type EmailFactoryInterface interface { type DefaultEmail struct { Options Options // 配置信息 EmailType EmailType + IsSet bool } func NewDefaultEmail() *DefaultEmail { @@ -33,15 +32,16 @@ func NewDefaultEmail() *DefaultEmail { } } -func (l *DefaultEmail) SetOption(ctx context.Context, opt ...Option) (EmailInterface, error) { +func (l *DefaultEmail) SetOption(ctx context.Context, opt ...Option) error { // 深复制l并且返回新的 - newL := *l for _, o := range opt { - o(&newL.Options) + o(&l.Options) } - return &newL, nil + l.IsSet = true + + return nil } func (l *DefaultEmail) GetEmailType() EmailType { diff --git a/mailgun/mailgun.go b/mailgun/mailgun.go index 7322641..3acb5cb 100644 --- a/mailgun/mailgun.go +++ b/mailgun/mailgun.go @@ -29,31 +29,32 @@ func NewMailGun() *MailGun { return mailgun } -func (l *MailGun) SetOption(ctx context.Context, opt ...interfaces.Option) (interfaces.EmailInterface, error) { +func (l *MailGun) SetOption(ctx context.Context, opt ...interfaces.Option) error { for _, o := range opt { o(&l.Options) } if l.Options.Mailgun == nil { - return nil, fmt.Errorf("Mailgun configuration is required") + return fmt.Errorf("Mailgun configuration is required") } // 验证配置 if err := l.validateConfig(); err != nil { - return nil, fmt.Errorf("invalid Mailgun config: %w", err) + return fmt.Errorf("invalid Mailgun config: %w", err) } // 安全日志输出 - l.Options.Logger.Infof(ctx, "Mailgun configured - Domain:%s Sender:%s", + l.Options.Logger.Infof(ctx, "Mailgun configured - Domain:%s Sender:%s", l.Options.Mailgun.Domain, l.Options.Mailgun.Sender) l.mg = mailgun.NewMailgun(l.Options.Mailgun.Domain, l.Options.Mailgun.ApiKey) - return l, nil + l.IsSet = true + return nil } func (l *MailGun) Send(ctx context.Context, params interfaces.Message) error { - if l.mg == nil { + if !l.IsSet { return fmt.Errorf("Mailgun client not initialized") } diff --git a/mailgun/mailgun_test.go b/mailgun/mailgun_test.go index 98d9400..d58d5d5 100644 --- a/mailgun/mailgun_test.go +++ b/mailgun/mailgun_test.go @@ -15,10 +15,10 @@ var ( ) func TestSendEmail(t *testing.T) { - gun := mailgun.NewMailGun() + ini := mailgun.NewMailGun() ctx := context.Background() - ini, err := gun.SetOption(ctx, interfaces.SetMailgun(&interfaces.EmialConfigDataMailgun{ + err := ini.SetOption(ctx, interfaces.SetMailgun(&interfaces.EmialConfigDataMailgun{ ApiKey: apikey, Domain: domain, Sender: sender, diff --git a/performance_test.go b/performance_test.go index e22a926..c31bde7 100644 --- a/performance_test.go +++ b/performance_test.go @@ -17,7 +17,7 @@ func TestConcurrentSend(t *testing.T) { ctx := context.Background() // 配置SMTP客户端 - _, err := smtpClient.SetOption(ctx, func(opt *interfaces.Options) { + err := smtpClient.SetOption(ctx, func(opt *interfaces.Options) { opt.Smtp = &interfaces.EmailConfigDataSmtp{ Host: "smtp.example.com", Port: "587", @@ -42,7 +42,7 @@ func TestConcurrentSend(t *testing.T) { wg.Add(1) go func(goroutineID int) { defer wg.Done() - + for j := 0; j < emailsPerGoroutine; j++ { message := interfaces.Message{ To: []string{fmt.Sprintf("test%d_%d@example.com", goroutineID, j)}, @@ -55,7 +55,7 @@ func TestConcurrentSend(t *testing.T) { if err != nil { errors <- fmt.Errorf("goroutine %d, email %d: %w", goroutineID, j, err) } - + // 模拟发送时间 time.Sleep(10 * time.Millisecond) } @@ -88,7 +88,7 @@ func TestMemoryUsage(t *testing.T) { smtpClient := smtp.NewSmtp() ctx := context.Background() - _, err := smtpClient.SetOption(ctx, func(opt *interfaces.Options) { + err := smtpClient.SetOption(ctx, func(opt *interfaces.Options) { opt.Smtp = &interfaces.EmailConfigDataSmtp{ Host: "smtp.example.com", Port: "587", @@ -128,7 +128,7 @@ func TestConnectionReuse(t *testing.T) { smtpClient := smtp.NewSmtp() ctx := context.Background() - _, err := smtpClient.SetOption(ctx, func(opt *interfaces.Options) { + err := smtpClient.SetOption(ctx, func(opt *interfaces.Options) { opt.Smtp = &interfaces.EmailConfigDataSmtp{ Host: "smtp.example.com", Port: "587", @@ -168,7 +168,7 @@ func TestErrorRecovery(t *testing.T) { smtpClient := smtp.NewSmtp() ctx := context.Background() - _, err := smtpClient.SetOption(ctx, func(opt *interfaces.Options) { + err := smtpClient.SetOption(ctx, func(opt *interfaces.Options) { opt.Smtp = &interfaces.EmailConfigDataSmtp{ Host: "invalid-smtp-server.com", // 故意使用无效服务器 Port: "587", @@ -187,7 +187,7 @@ func TestErrorRecovery(t *testing.T) { } start := time.Now() - + // 这应该失败并触发重试机制 err = smtpClient.Send(ctx, message) @@ -228,7 +228,7 @@ func TestLargeAttachment(t *testing.T) { smtpClient := smtp.NewSmtp() ctx := context.Background() - _, err := smtpClient.SetOption(ctx, func(opt *interfaces.Options) { + err := smtpClient.SetOption(ctx, func(opt *interfaces.Options) { opt.Smtp = &interfaces.EmailConfigDataSmtp{ Host: "smtp.example.com", Port: "587", @@ -282,11 +282,11 @@ func BenchmarkConcurrentEmailCreation(b *testing.B) { // 配置创建基准测试 func BenchmarkSMTPConfiguration(b *testing.B) { ctx := context.Background() - + b.ResetTimer() for i := 0; i < b.N; i++ { smtpClient := smtp.NewSmtp() - _, err := smtpClient.SetOption(ctx, func(opt *interfaces.Options) { + err := smtpClient.SetOption(ctx, func(opt *interfaces.Options) { opt.Smtp = &interfaces.EmailConfigDataSmtp{ Host: "smtp.example.com", Port: "587", @@ -318,7 +318,7 @@ func TestLoadTesting(t *testing.T) { smtpClient := smtp.NewSmtp() ctx := context.Background() - _, err := smtpClient.SetOption(ctx, func(opt *interfaces.Options) { + err := smtpClient.SetOption(ctx, func(opt *interfaces.Options) { opt.Smtp = &interfaces.EmailConfigDataSmtp{ Host: "smtp.example.com", Port: "587", @@ -342,7 +342,7 @@ func TestLoadTesting(t *testing.T) { wg.Add(1) go func(emailID int) { defer wg.Done() - + // 获取信号量 semaphore <- struct{}{} defer func() { <-semaphore }() @@ -367,4 +367,4 @@ func TestLoadTesting(t *testing.T) { t.Logf("- Concurrency: %d", concurrency) t.Logf("- Duration: %v", duration) t.Logf("- Throughput: %.2f emails/second", float64(totalEmails)/duration.Seconds()) -} \ No newline at end of file +} diff --git a/smtp/example_usage.go b/smtp/example_usage.go index c0b3ef8..4f094bd 100644 --- a/smtp/example_usage.go +++ b/smtp/example_usage.go @@ -15,7 +15,7 @@ func ExampleUsage() { smtpClient := NewSmtp() // 配置SMTP设置 - _, err := smtpClient.SetOption(ctx, func(opt *interfaces.Options) { + err := smtpClient.SetOption(ctx, func(opt *interfaces.Options) { opt.Smtp = &interfaces.EmailConfigDataSmtp{ Host: "smtp.gmail.com", Port: "587", // STARTTLS @@ -56,7 +56,7 @@ func ExampleSSLUsage() { smtpClient := NewSmtp() - _, err := smtpClient.SetOption(ctx, func(opt *interfaces.Options) { + err := smtpClient.SetOption(ctx, func(opt *interfaces.Options) { opt.Smtp = &interfaces.EmailConfigDataSmtp{ Host: "smtp.gmail.com", Port: "465", // SSL @@ -87,7 +87,7 @@ func ExampleEnterpriseEmail() { smtpClient := NewSmtp() // 企业邮箱通常使用587端口和STARTTLS - _, err := smtpClient.SetOption(ctx, func(opt *interfaces.Options) { + err := smtpClient.SetOption(ctx, func(opt *interfaces.Options) { opt.Smtp = &interfaces.EmailConfigDataSmtp{ Host: "smtp.exmail.qq.com", // 腾讯企业邮箱 Port: "587", diff --git a/smtp/html_email_test.go b/smtp/html_email_test.go index bd8479f..899c7d5 100644 --- a/smtp/html_email_test.go +++ b/smtp/html_email_test.go @@ -148,7 +148,7 @@ func TestMessageValidation2(t *testing.T) { ctx := context.Background() // 配置SMTP客户端 - _, err := smtpClient.SetOption(ctx, func(opt *interfaces.Options) { + err := smtpClient.SetOption(ctx, func(opt *interfaces.Options) { opt.Smtp = &interfaces.EmailConfigDataSmtp{ Host: "smtp.example.com", Port: "587", @@ -226,7 +226,7 @@ func TestMultipartEmailConstruction2(t *testing.T) { smtpClient := NewSmtp() ctx := context.Background() - _, err := smtpClient.SetOption(ctx, func(opt *interfaces.Options) { + err := smtpClient.SetOption(ctx, func(opt *interfaces.Options) { opt.Smtp = &interfaces.EmailConfigDataSmtp{ Host: "smtp.example.com", Port: "587", diff --git a/smtp/smtp.go b/smtp/smtp.go index 0b37c69..d4d03d7 100644 --- a/smtp/smtp.go +++ b/smtp/smtp.go @@ -44,18 +44,18 @@ func NewSmtp() *Smtp { return smtp } -func (l *Smtp) SetOption(ctx context.Context, opt ...interfaces.Option) (interfaces.EmailInterface, error) { +func (l *Smtp) SetOption(ctx context.Context, opt ...interfaces.Option) error { for _, o := range opt { o(&l.Options) } if l.Options.Smtp == nil { - return nil, fmt.Errorf("SMTP configuration is required") + return fmt.Errorf("SMTP configuration is required") } // 验证配置 if err := l.validateConfig(); err != nil { - return nil, fmt.Errorf("invalid SMTP config: %w", err) + return fmt.Errorf("invalid SMTP config: %w", err) } // 初始化认证 @@ -65,11 +65,13 @@ func (l *Smtp) SetOption(ctx context.Context, opt ...interfaces.Option) (interfa l.Options.Logger.Infof(ctx, "SMTP configured - Host:%s Port:%s Username:%s", l.Options.Smtp.Host, l.Options.Smtp.Port, l.Options.Smtp.Username) - return l, nil + l.IsSet = true + + return nil } func (l *Smtp) Send(ctx context.Context, message interfaces.Message) error { - if l.Options.Smtp == nil { + if !l.IsSet { return fmt.Errorf("SMTP not initialized") } @@ -441,19 +443,19 @@ func (l *Smtp) writeBody(buffer *bytes.Buffer, boundary string, message interfac altBoundary := "alt-" + boundary buffer.WriteString(fmt.Sprintf("--%s\r\n", boundary)) buffer.WriteString(fmt.Sprintf("Content-Type: multipart/alternative; boundary=%s\r\n\r\n", altBoundary)) - + // 纯文本版本 buffer.WriteString(fmt.Sprintf("--%s\r\n", altBoundary)) buffer.WriteString("Content-Type: text/plain; charset=utf-8\r\n") buffer.WriteString("Content-Transfer-Encoding: quoted-printable\r\n\r\n") buffer.WriteString(message.TextBody + "\r\n") - + // HTML版本 buffer.WriteString(fmt.Sprintf("--%s\r\n", altBoundary)) buffer.WriteString("Content-Type: text/html; charset=utf-8\r\n") buffer.WriteString("Content-Transfer-Encoding: quoted-printable\r\n\r\n") buffer.WriteString(message.Body + "\r\n") - + buffer.WriteString(fmt.Sprintf("--%s--\r\n", altBoundary)) } else { // 单一内容类型 diff --git a/smtp/smtp_enhanced_test.go b/smtp/smtp_enhanced_test.go index eb43a38..70cd022 100644 --- a/smtp/smtp_enhanced_test.go +++ b/smtp/smtp_enhanced_test.go @@ -15,13 +15,13 @@ func TestSmtpEnhanced(t *testing.T) { ctx := context.Background() // 测试空配置 - _, err := smtp.SetOption(ctx) + err := smtp.SetOption(ctx) if err == nil { t.Error("Expected error for empty config") } // 测试不完整配置 - _, err = smtp.SetOption(ctx, func(opt *interfaces.Options) { + err = smtp.SetOption(ctx, func(opt *interfaces.Options) { opt.Smtp = &interfaces.EmailConfigDataSmtp{ Host: "smtp.example.com", // 缺少用户名和密码 @@ -32,7 +32,7 @@ func TestSmtpEnhanced(t *testing.T) { } // 测试完整配置 - _, err = smtp.SetOption(ctx, func(opt *interfaces.Options) { + err = smtp.SetOption(ctx, func(opt *interfaces.Options) { opt.Smtp = &interfaces.EmailConfigDataSmtp{ Host: "smtp.example.com", Port: "587", diff --git a/smtp/smtp_test.go b/smtp/smtp_test.go index 0b572ea..aca484e 100644 --- a/smtp/smtp_test.go +++ b/smtp/smtp_test.go @@ -10,7 +10,7 @@ import ( ) func TestMail(t *testing.T) { - sm := smtp.NewSmtp() + ini := smtp.NewSmtp() ctx := context.Background() // ini, err := sm.SetOption(ctx, interfaces.SetSmtp(&interfaces.EmailConfigDataSmtp{ @@ -24,8 +24,7 @@ func TestMail(t *testing.T) { // t.Fatal(err) // } - - ini, err := sm.SetOption(ctx, interfaces.SetSmtp(&interfaces.EmailConfigDataSmtp{ + err := ini.SetOption(ctx, interfaces.SetSmtp(&interfaces.EmailConfigDataSmtp{ IsSSL: true, Username: "demo@yunink.net", Password: "aAhVPzHydLoc9Fj8", @@ -37,8 +36,6 @@ func TestMail(t *testing.T) { t.Fatal(err) } - - // req, err := http.Get("https://baidu.com") // if err != nil { // t.Fatal(err)