Send email: Difference between revisions
Content added Content deleted
({{omit from|ZX Spectrum Basic}}) |
(Add Go.) |
||
Line 134: | Line 134: | ||
} |
} |
||
</lang> |
</lang> |
||
=={{header|Go}}== |
|||
A full little command-line program that can be used to send simple e-mails. Uses the built in smtp package. Supports TLS connections. |
|||
<lang go>package main |
|||
import( |
|||
"os" |
|||
"fmt" |
|||
"flag" |
|||
"smtp" |
|||
"bufio" |
|||
"bytes" |
|||
"strings" |
|||
"io/ioutil" |
|||
) |
|||
type Message struct { |
|||
From string |
|||
To []string |
|||
Cc []string |
|||
Subject string |
|||
Content string |
|||
} |
|||
func (m Message)Bytes() (r []byte) { |
|||
to := strings.Join(m.To, ",") |
|||
cc := strings.Join(m.Cc, ",") |
|||
r = append(r, []byte("From: " + m.From + "\n")...) |
|||
r = append(r, []byte("To: " + to + "\n")...) |
|||
r = append(r, []byte("Cc: " + cc + "\n")...) |
|||
r = append(r, []byte("Subject: " + m.Subject + "\n\n")...) |
|||
r = append(r, []byte(m.Content)...) |
|||
return |
|||
} |
|||
func (m Message)Send(host string, port int, user, pass string) (err os.Error) { |
|||
err = check(host, user, pass) |
|||
if err != nil { |
|||
return |
|||
} |
|||
err = smtp.SendMail(fmt.Sprintf("%v:%v", host, port), |
|||
smtp.PlainAuth("", user, pass, host), |
|||
m.From, |
|||
m.To, |
|||
m.Bytes(), |
|||
) |
|||
return |
|||
} |
|||
func check(host, user, pass string) (os.Error) { |
|||
if host == "" { |
|||
return os.NewError("Bad host") |
|||
} |
|||
if user == "" { |
|||
return os.NewError("Bad username") |
|||
} |
|||
if pass == "" { |
|||
return os.NewError("Bad password") |
|||
} |
|||
return nil |
|||
} |
|||
func main() { |
|||
var flags struct { |
|||
host string |
|||
port int |
|||
user string |
|||
pass string |
|||
} |
|||
flag.StringVar(&flags.host, "host", "", "SMTP server to connect to") |
|||
flag.IntVar(&flags.port, "port", 587, "Port to connect to SMTP server on") |
|||
flag.StringVar(&flags.user, "user", "", "Username to authenticate with") |
|||
flag.StringVar(&flags.pass, "pass", "", "Password to authenticate with") |
|||
flag.Parse() |
|||
err := check(flags.host, flags.user, flags.pass) |
|||
if err != nil { |
|||
flag.Usage() |
|||
os.Exit(1) |
|||
} |
|||
bufin := bufio.NewReader(os.Stdin) |
|||
fmt.Printf("From: ") |
|||
from, err := bufin.ReadString('\n') |
|||
if err != nil { |
|||
fmt.Printf("Error: %v\n", err) |
|||
os.Exit(1) |
|||
} |
|||
from = strings.Trim(from, " \t\n\r") |
|||
var to []string |
|||
for { |
|||
fmt.Printf("To (Blank to finish): ") |
|||
tmp, err := bufin.ReadString('\n') |
|||
if err != nil { |
|||
fmt.Printf("Error: %v\n", err) |
|||
os.Exit(1) |
|||
} |
|||
tmp = strings.Trim(tmp, " \t\n\r") |
|||
if tmp == "" { |
|||
break |
|||
} |
|||
to = append(to, tmp) |
|||
} |
|||
var cc []string |
|||
for { |
|||
fmt.Printf("Cc (Blank to finish): ") |
|||
tmp, err := bufin.ReadString('\n') |
|||
if err != nil { |
|||
fmt.Printf("Error: %v\n", err) |
|||
os.Exit(1) |
|||
} |
|||
tmp = strings.Trim(tmp, " \t\n\r") |
|||
if tmp == "" { |
|||
break |
|||
} |
|||
cc = append(cc, tmp) |
|||
} |
|||
fmt.Printf("Subject: ") |
|||
subject, err := bufin.ReadString('\n') |
|||
if err != nil { |
|||
fmt.Printf("Error: %v\n", err) |
|||
os.Exit(1) |
|||
} |
|||
subject = strings.Trim(subject, " \t\n\r") |
|||
fmt.Printf("Content (Until EOF):\n") |
|||
content, err := ioutil.ReadAll(os.Stdin) |
|||
if err != nil { |
|||
fmt.Printf("Error: %v\n", err) |
|||
os.Exit(1) |
|||
} |
|||
content = bytes.Trim(content, " \t\n\r") |
|||
m := Message{ |
|||
From: from, |
|||
To: to, |
|||
Cc: cc, |
|||
Subject: subject, |
|||
Content: string(content), |
|||
} |
|||
fmt.Printf("\nSending message...\n") |
|||
err = m.Send(flags.host, flags.port, flags.user, flags.pass) |
|||
if err != nil { |
|||
fmt.Printf("Error: %v\n", err) |
|||
os.Exit(1) |
|||
} |
|||
fmt.Printf("Message sent.\n") |
|||
}</lang> |
|||
=={{header|Java}}== |
=={{header|Java}}== |