Towards first version.
This commit is contained in:
parent
687862218f
commit
955de981d3
@ -63,6 +63,13 @@ func setAutoresponseViaEmail(recipient, sender, saslUser, clientIp string) error
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Forward email using supplied arguments and stdin (email body)
|
||||||
|
func forwardEmailAndAutoresponse(recipient, sender, saslUser, clientIp string, responseRate uint) error {
|
||||||
|
//!!!
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
// Connect to syslog
|
// Connect to syslog
|
||||||
syslg, err := syslog.New(syslog.LOG_MAIL, "autoresponder")
|
syslg, err := syslog.New(syslog.LOG_MAIL, "autoresponder")
|
||||||
@ -80,10 +87,11 @@ func main() {
|
|||||||
disableAutoResponsePtr := flag.String("d", "", "Disable autoresponse")
|
disableAutoResponsePtr := flag.String("d", "", "Disable autoresponse")
|
||||||
enableExAutoResponsePtr := flag.String("E", "", "Enable existing autoresponse")
|
enableExAutoResponsePtr := flag.String("E", "", "Enable existing autoresponse")
|
||||||
deleteAutoResponsePtr := flag.String("D", "", "Delete autoresponse")
|
deleteAutoResponsePtr := flag.String("D", "", "Delete autoresponse")
|
||||||
instructions := flag.Bool("i", false, "Setup instructions")
|
instructionsPtr := flag.Bool("i", false, "Setup instructions")
|
||||||
|
responseRatePtr := flag.Uint("t", 86400, "Response rate in seconds (0 - send each time)")
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
|
||||||
DebugSyslogFmt(syslg, "Flags: Recipient: %v, Sender: %v, SASL authenticated username: %v, Client IP: %v, Enable autoresponse: %v, Disable autoresponse: %v, Enable existing autoresponse: %v, Delete autoresponse: %v, Setup instructions: %v",
|
DebugSyslogFmt(syslg, "Flags: Recipient: %v, Sender: %v, SASL authenticated username: %v, Client IP: %v, Enable autoresponse: %v, Disable autoresponse: %v, Enable existing autoresponse: %v, Delete autoresponse: %v, Setup instructions: %v, Response rate: %v",
|
||||||
*recipientPtr,
|
*recipientPtr,
|
||||||
*senderPtr,
|
*senderPtr,
|
||||||
*saslUserPtr,
|
*saslUserPtr,
|
||||||
@ -92,10 +100,11 @@ func main() {
|
|||||||
*disableAutoResponsePtr,
|
*disableAutoResponsePtr,
|
||||||
*enableExAutoResponsePtr,
|
*enableExAutoResponsePtr,
|
||||||
*deleteAutoResponsePtr,
|
*deleteAutoResponsePtr,
|
||||||
*instructions)
|
*instructionsPtr,
|
||||||
|
*responseRatePtr)
|
||||||
|
|
||||||
// If setup instructions are requested, just print them to stdout and exit
|
// If setup instructions are requested, just print them to stdout and exit
|
||||||
if *instructions {
|
if *instructionsPtr {
|
||||||
fmt.Print(`
|
fmt.Print(`
|
||||||
How to make it work on a server with postfix installed:
|
How to make it work on a server with postfix installed:
|
||||||
=======================================================
|
=======================================================
|
||||||
@ -142,9 +151,12 @@ func main() {
|
|||||||
}
|
}
|
||||||
DebugSyslogFmt(syslg, "mode=%v, sendResponse=%v, authenticated=%v\n", mode, sendResponse, authenticated)
|
DebugSyslogFmt(syslg, "mode=%v, sendResponse=%v, authenticated=%v\n", mode, sendResponse, authenticated)
|
||||||
|
|
||||||
|
// Little more validation of recipient and sender
|
||||||
|
// Remove path ('/') from both recipient and sender
|
||||||
|
*recipientPtr = strings.Replace(*recipientPtr, "/", "", -1)
|
||||||
|
*senderPtr = strings.Replace(*senderPtr, "/", "", -1)
|
||||||
recipientParts := strings.Split(*recipientPtr, "@")
|
recipientParts := strings.Split(*recipientPtr, "@")
|
||||||
senderParts := strings.Split(*senderPtr, "@")
|
senderParts := strings.Split(*senderPtr, "@")
|
||||||
// Little more validation of recipient and sender
|
|
||||||
if len(recipientParts) < 2 {
|
if len(recipientParts) < 2 {
|
||||||
syslg.Err(fmt.Sprintf("Invalid recipient %v", *recipientPtr))
|
syslg.Err(fmt.Sprintf("Invalid recipient %v", *recipientPtr))
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
@ -156,13 +168,52 @@ func main() {
|
|||||||
|
|
||||||
// And now descision making
|
// And now descision making
|
||||||
DebugSyslogFmt(syslg, "recipientUser=%v =? senderUser=%v\n", recipientParts[0], senderParts[0] + "+autoresponse")
|
DebugSyslogFmt(syslg, "recipientUser=%v =? senderUser=%v\n", recipientParts[0], senderParts[0] + "+autoresponse")
|
||||||
if mode == 0 && authenticated && recipientParts[0] == senderParts[0] + "+autoresponse" {
|
switch true {
|
||||||
|
// - (un)set autoresponse via email
|
||||||
|
case mode == 0 && recipientParts[0] == senderParts[0] + "+autoresponse":
|
||||||
syslg.Info(fmt.Sprintf("Requested autoresponse (un)set via email for email %v", *senderPtr))
|
syslg.Info(fmt.Sprintf("Requested autoresponse (un)set via email for email %v", *senderPtr))
|
||||||
|
|
||||||
|
// Do not allow unauthenticated changes
|
||||||
|
if ! authenticated {
|
||||||
|
syslg.Warning(fmt.Sprintf("Unauthenticated attempt to set autoresponse message for %v from %v !",
|
||||||
|
*senderPtr, *clientIpPtr))
|
||||||
|
os.Exit(0)
|
||||||
|
}
|
||||||
|
|
||||||
err := setAutoresponseViaEmail(*recipientPtr, *senderPtr, *saslUserPtr, *clientIpPtr)
|
err := setAutoresponseViaEmail(*recipientPtr, *senderPtr, *saslUserPtr, *clientIpPtr)
|
||||||
|
//!!!
|
||||||
if err != nil {
|
if err != nil {
|
||||||
syslg.Err(err.Error())
|
syslg.Err(err.Error())
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// - forward mail and either send response if set and enough time has passed
|
||||||
|
case mode == 0 && strings.Index(*recipientPtr, "+autoresponse") == -1:
|
||||||
|
syslg.Info(fmt.Sprintf("Requested email forward from %v, to %v", *senderPtr, *recipientPtr))
|
||||||
|
|
||||||
|
err := forwardEmailAndAutoresponse(*recipientPtr, *senderPtr, *saslUserPtr, *clientIpPtr, *responseRatePtr)
|
||||||
|
//!!!
|
||||||
|
if err != nil {
|
||||||
|
syslg.Err(err.Error())
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
//!!!
|
||||||
|
|
||||||
|
// - set autoresponse via cli
|
||||||
|
case mode == 1 && *enableAutoResponsePtr != "":
|
||||||
|
//!!!
|
||||||
|
|
||||||
|
// - disable autoresponse via cli
|
||||||
|
case mode == 1 && *disableAutoResponsePtr != "":
|
||||||
|
//!!!
|
||||||
|
|
||||||
|
// - enable existing autoresponse via cli
|
||||||
|
case mode == 1 && *enableExAutoResponsePtr != "":
|
||||||
|
//!!!
|
||||||
|
|
||||||
|
// - delete existing autoresponse via cli
|
||||||
|
case mode == 1 && *deleteAutoResponsePtr != "":
|
||||||
|
//!!!
|
||||||
}
|
}
|
||||||
//!!!
|
//!!!
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user