- 增加收件箱功能(有BUG)
- 增加已发送|草稿箱|发送历史 本地记录
This commit is contained in:
2026-04-09 21:48:21 +08:00
parent 2ca198a81b
commit 7ab9f00c4f
15 changed files with 1899 additions and 33 deletions

201
onboarding.go Normal file
View File

@@ -0,0 +1,201 @@
package main
import (
"fmt"
"charm.land/huh/v2"
)
var encryptionOptions = []huh.Option[string]{
huh.NewOption("STARTTLS", "starttls"),
huh.NewOption("SSL/TLS", "ssl"),
huh.NewOption("None", "none"),
}
func getEncryptionFromOption(option string) string {
switch option {
case "ssl":
return "ssl"
case "none":
return "none"
default:
return "starttls"
}
}
func runOnboarding() error {
var accountName string
var email string
var provider string
var smtpHost string
var smtpPort string
var imapHost string
var imapPort string
var smtpUsername string
var smtpPassword string
var smtpEncryption string
var smtpInsecure bool
var unsafeHTML bool
form := huh.NewForm(
huh.NewGroup(
huh.NewNote().
Title("欢迎使用 Pop").
Description("让我们先配置一下邮件账户。"),
),
huh.NewGroup(
huh.NewInput().
Title("邮箱地址").
Value(&email),
huh.NewInput().
Title("账户名称 (可选)").
Value(&accountName),
),
)
err := form.Run()
if err != nil {
return err
}
provider = getProviderName(email)
hasDefaults := false
if defaults, ok := providerDefaults[provider]; ok {
hasDefaults = true
smtpHost = defaults.SMTPHost
smtpPort = fmt.Sprintf("%d", defaults.SMTPPort)
imapHost = defaults.IMAPHost
imapPort = fmt.Sprintf("%d", defaults.IMAPPort)
smtpEncryption = defaults.SMTPEncryption
}
if !hasDefaults {
provider = "custom"
}
var form2 *huh.Form
if hasDefaults {
form2 = huh.NewForm(
huh.NewGroup(
huh.NewNote().
Title("已识别: "+provider).
Description(fmt.Sprintf("SMTP: %s:%s | IMAP: %s:%s", smtpHost, smtpPort, imapHost, imapPort)),
),
huh.NewGroup(
huh.NewConfirm().
Title("使用默认配置?").
Affirmative("是").
Negative("否, 手动配置").
Value(&hasDefaults),
),
)
} else {
form2 = huh.NewForm(
huh.NewGroup(
huh.NewNote().
Title("未知邮箱服务商").
Description("请手动配置服务器地址。"),
),
huh.NewGroup(
huh.NewInput().
Title("IMAP 服务器").
Value(&imapHost),
huh.NewInput().
Title("IMAP 端口").
Value(&imapPort),
),
huh.NewGroup(
huh.NewInput().
Title("SMTP 服务器").
Value(&smtpHost),
huh.NewInput().
Title("SMTP 端口").
Value(&smtpPort),
huh.NewSelect[string]().
Title("加密方式").
Options(encryptionOptions...).
Value(&smtpEncryption),
),
)
}
err = form2.Run()
if err != nil {
return err
}
form3 := huh.NewForm(
huh.NewGroup(
huh.NewInput().
Title("用户名").
Value(&smtpUsername),
huh.NewInput().
Title("密码/授权码").
Password(true).
Value(&smtpPassword),
),
huh.NewGroup(
huh.NewConfirm().
Title("跳过 TLS 验证?").
Affirmative("是").
Negative("否").
Value(&smtpInsecure),
),
huh.NewGroup(
huh.NewConfirm().
Title("启用 unsafe HTML?").
Affirmative("是").
Negative("否").
Value(&unsafeHTML),
),
)
err = form3.Run()
if err != nil {
return err
}
cfg := Config{
From: email,
Signature: "",
UnsafeHTML: unsafeHTML,
Accounts: []Account{
{
Name: accountName,
Email: email,
Provider: provider,
Username: smtpUsername,
Password: smtpPassword,
SMTPEncryption: smtpEncryption,
IMAP: IMAPConfig{
Host: imapHost,
Password: smtpPassword,
},
SMTP: SMTPConfig{
Host: smtpHost,
Username: smtpUsername,
Password: smtpPassword,
InsecureSkipVerify: smtpInsecure,
},
},
},
}
if imapPort != "" {
fmt.Sscanf(imapPort, "%d", &cfg.Accounts[0].IMAP.Port)
}
if smtpPort != "" {
fmt.Sscanf(smtpPort, "%d", &cfg.Accounts[0].SMTP.Port)
}
if smtpEncryption == "" {
cfg.Accounts[0].SMTP.Encryption = "starttls"
} else {
cfg.Accounts[0].SMTP.Encryption = getEncryptionFromOption(smtpEncryption)
}
if cfg.Accounts[0].Name == "" {
cfg.Accounts[0].Name = provider
}
return saveConfig(cfg)
}