Compare commits

...

2 Commits

Author SHA1 Message Date
JustSong
46e77389a4 fix: support smtp server with port 465 2023-05-13 18:57:27 +08:00
JustSong
f5f4e6fbc6 feat: able to configure smtp from now (close #34) 2023-05-13 18:33:41 +08:00
4 changed files with 66 additions and 3 deletions

View File

@@ -36,6 +36,7 @@ var RegisterEnabled = true
var SMTPServer = "" var SMTPServer = ""
var SMTPPort = 587 var SMTPPort = 587
var SMTPAccount = "" var SMTPAccount = ""
var SMTPFrom = ""
var SMTPToken = "" var SMTPToken = ""
var GitHubClientId = "" var GitHubClientId = ""

View File

@@ -1,6 +1,7 @@
package common package common
import ( import (
"crypto/tls"
"fmt" "fmt"
"net/smtp" "net/smtp"
"strings" "strings"
@@ -11,10 +12,51 @@ func SendEmail(subject string, receiver string, content string) error {
"From: %s<%s>\r\n"+ "From: %s<%s>\r\n"+
"Subject: %s\r\n"+ "Subject: %s\r\n"+
"Content-Type: text/html; charset=UTF-8\r\n\r\n%s\r\n", "Content-Type: text/html; charset=UTF-8\r\n\r\n%s\r\n",
receiver, SystemName, SMTPAccount, subject, content)) receiver, SystemName, SMTPFrom, subject, content))
auth := smtp.PlainAuth("", SMTPAccount, SMTPToken, SMTPServer) auth := smtp.PlainAuth("", SMTPAccount, SMTPToken, SMTPServer)
addr := fmt.Sprintf("%s:%d", SMTPServer, SMTPPort) addr := fmt.Sprintf("%s:%d", SMTPServer, SMTPPort)
to := strings.Split(receiver, ";") to := strings.Split(receiver, ";")
err := smtp.SendMail(addr, auth, SMTPAccount, to, mail) var err error
if SMTPPort == 465 {
tlsConfig := &tls.Config{
InsecureSkipVerify: true,
ServerName: SMTPServer,
}
conn, err := tls.Dial("tcp", fmt.Sprintf("%s:%d", SMTPServer, SMTPPort), tlsConfig)
if err != nil {
return err
}
client, err := smtp.NewClient(conn, SMTPServer)
if err != nil {
return err
}
defer client.Close()
if err = client.Auth(auth); err != nil {
return err
}
if err = client.Mail(SMTPFrom); err != nil {
return err
}
receiverEmails := strings.Split(receiver, ";")
for _, receiver := range receiverEmails {
if err = client.Rcpt(receiver); err != nil {
return err
}
}
w, err := client.Data()
if err != nil {
return err
}
_, err = w.Write(mail)
if err != nil {
return err
}
err = w.Close()
if err != nil {
return err
}
} else {
err = smtp.SendMail(addr, auth, SMTPAccount, to, mail)
}
return err return err
} }

View File

@@ -33,6 +33,7 @@ func InitOptionMap() {
common.OptionMap["TurnstileCheckEnabled"] = strconv.FormatBool(common.TurnstileCheckEnabled) common.OptionMap["TurnstileCheckEnabled"] = strconv.FormatBool(common.TurnstileCheckEnabled)
common.OptionMap["RegisterEnabled"] = strconv.FormatBool(common.RegisterEnabled) common.OptionMap["RegisterEnabled"] = strconv.FormatBool(common.RegisterEnabled)
common.OptionMap["SMTPServer"] = "" common.OptionMap["SMTPServer"] = ""
common.OptionMap["SMTPFrom"] = ""
common.OptionMap["SMTPPort"] = strconv.Itoa(common.SMTPPort) common.OptionMap["SMTPPort"] = strconv.Itoa(common.SMTPPort)
common.OptionMap["SMTPAccount"] = "" common.OptionMap["SMTPAccount"] = ""
common.OptionMap["SMTPToken"] = "" common.OptionMap["SMTPToken"] = ""
@@ -58,6 +59,9 @@ func InitOptionMap() {
common.SysError("Failed to update option map: " + err.Error()) common.SysError("Failed to update option map: " + err.Error())
} }
} }
if common.SMTPFrom == "" { // for compatibility
common.SMTPFrom = common.SMTPAccount
}
} }
func UpdateOption(key string, value string) error { func UpdateOption(key string, value string) error {
@@ -120,6 +124,8 @@ func updateOptionMap(key string, value string) (err error) {
common.SMTPPort = intValue common.SMTPPort = intValue
case "SMTPAccount": case "SMTPAccount":
common.SMTPAccount = value common.SMTPAccount = value
case "SMTPFrom":
common.SMTPFrom = value
case "SMTPToken": case "SMTPToken":
common.SMTPToken = value common.SMTPToken = value
case "ServerAddress": case "ServerAddress":

View File

@@ -14,6 +14,7 @@ const SystemSetting = () => {
SMTPServer: '', SMTPServer: '',
SMTPPort: '', SMTPPort: '',
SMTPAccount: '', SMTPAccount: '',
SMTPFrom: '',
SMTPToken: '', SMTPToken: '',
ServerAddress: '', ServerAddress: '',
Footer: '', Footer: '',
@@ -129,6 +130,9 @@ const SystemSetting = () => {
if (originInputs['SMTPAccount'] !== inputs.SMTPAccount) { if (originInputs['SMTPAccount'] !== inputs.SMTPAccount) {
await updateOption('SMTPAccount', inputs.SMTPAccount); await updateOption('SMTPAccount', inputs.SMTPAccount);
} }
if (originInputs['SMTPFrom'] !== inputs.SMTPFrom) {
await updateOption('SMTPFrom', inputs.SMTPFrom);
}
if ( if (
originInputs['SMTPPort'] !== inputs.SMTPPort && originInputs['SMTPPort'] !== inputs.SMTPPort &&
inputs.SMTPPort !== '' inputs.SMTPPort !== ''
@@ -298,7 +302,7 @@ const SystemSetting = () => {
配置 SMTP 配置 SMTP
<Header.Subheader>用以支持系统的邮件发送</Header.Subheader> <Header.Subheader>用以支持系统的邮件发送</Header.Subheader>
</Header> </Header>
<Form.Group widths={4}> <Form.Group widths={3}>
<Form.Input <Form.Input
label='SMTP 服务器地址' label='SMTP 服务器地址'
name='SMTPServer' name='SMTPServer'
@@ -323,6 +327,16 @@ const SystemSetting = () => {
value={inputs.SMTPAccount} value={inputs.SMTPAccount}
placeholder='通常是邮箱地址' placeholder='通常是邮箱地址'
/> />
</Form.Group>
<Form.Group widths={3}>
<Form.Input
label='SMTP 发送者邮箱'
name='SMTPFrom'
onChange={handleInputChange}
autoComplete='new-password'
value={inputs.SMTPFrom}
placeholder='通常和邮箱地址保持一致'
/>
<Form.Input <Form.Input
label='SMTP 访问凭证' label='SMTP 访问凭证'
name='SMTPToken' name='SMTPToken'