implementing read emails
parent
4ca33e1c7b
commit
aac86fc8c1
73
email.go
73
email.go
|
|
@ -1,73 +0,0 @@
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"crypto/tls"
|
|
||||||
"fmt"
|
|
||||||
"net/smtp"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
type Emailer struct {
|
|
||||||
From string
|
|
||||||
SMTP string
|
|
||||||
POP3 string
|
|
||||||
Password string
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *Emailer) Send(to, subj, msg string) error {
|
|
||||||
headers := e.headers(to, e.From, subj)
|
|
||||||
body := e.body(headers, msg)
|
|
||||||
smtp, err := e.smtp()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer smtp.Quit()
|
|
||||||
if err := smtp.Mail(e.From); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := smtp.Rcpt(to); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
w, err := smtp.Data()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if _, err := w.Write([]byte(body)); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return w.Close()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *Emailer) headers(to, from, subj string) map[string]string {
|
|
||||||
return map[string]string{
|
|
||||||
"To": to,
|
|
||||||
"From": from,
|
|
||||||
"Subject": subj,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *Emailer) body(headers map[string]string, body string) string {
|
|
||||||
b := ""
|
|
||||||
for k, v := range headers {
|
|
||||||
b += fmt.Sprintf("%s: %s\r\n", k, v)
|
|
||||||
}
|
|
||||||
return b + "\r\n" + body
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *Emailer) smtp() (*smtp.Client, error) {
|
|
||||||
host := strings.Split(e.SMTP, ":")[0]
|
|
||||||
auth := smtp.PlainAuth("", e.From, e.Password, host)
|
|
||||||
tlsconfig := &tls.Config{ServerName: host}
|
|
||||||
conn, err := tls.Dial("tcp", e.SMTP, tlsconfig)
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("cannot dial %v: %v", e.SMTP, err)
|
|
||||||
}
|
|
||||||
smtp, err := smtp.NewClient(conn, host)
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("cannot new client %v: %v", host, err)
|
|
||||||
}
|
|
||||||
if err := smtp.Auth(auth); err != nil {
|
|
||||||
return nil, fmt.Errorf("cannot auth client: %v", err)
|
|
||||||
}
|
|
||||||
return smtp, nil
|
|
||||||
}
|
|
||||||
|
|
@ -2,6 +2,7 @@ package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"local/args"
|
"local/args"
|
||||||
|
"local/sandbox/contact/contact"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
|
@ -16,7 +17,7 @@ func main() {
|
||||||
if err := as.Parse(); err != nil {
|
if err := as.Parse(); err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
emailer := &Emailer{
|
emailer := &contact.Emailer{
|
||||||
From: as.Get("from").GetString(),
|
From: as.Get("from").GetString(),
|
||||||
SMTP: as.Get("smtp").GetString(),
|
SMTP: as.Get("smtp").GetString(),
|
||||||
POP3: as.Get("pop3").GetString(),
|
POP3: as.Get("pop3").GetString(),
|
||||||
|
|
|
||||||
0
vendor/golang.org/x/crypto/openpgp/armor/armor.go
generated
vendored
Normal file → Executable file
0
vendor/golang.org/x/crypto/openpgp/armor/armor.go
generated
vendored
Normal file → Executable file
0
vendor/golang.org/x/crypto/openpgp/armor/encode.go
generated
vendored
Normal file → Executable file
0
vendor/golang.org/x/crypto/openpgp/armor/encode.go
generated
vendored
Normal file → Executable file
0
vendor/golang.org/x/crypto/openpgp/canonical_text.go
generated
vendored
Normal file → Executable file
0
vendor/golang.org/x/crypto/openpgp/canonical_text.go
generated
vendored
Normal file → Executable file
0
vendor/golang.org/x/crypto/openpgp/elgamal/elgamal.go
generated
vendored
Normal file → Executable file
0
vendor/golang.org/x/crypto/openpgp/elgamal/elgamal.go
generated
vendored
Normal file → Executable file
0
vendor/golang.org/x/crypto/openpgp/errors/errors.go
generated
vendored
Normal file → Executable file
0
vendor/golang.org/x/crypto/openpgp/errors/errors.go
generated
vendored
Normal file → Executable file
0
vendor/golang.org/x/crypto/openpgp/packet/compressed.go
generated
vendored
Normal file → Executable file
0
vendor/golang.org/x/crypto/openpgp/packet/compressed.go
generated
vendored
Normal file → Executable file
0
vendor/golang.org/x/crypto/openpgp/packet/config.go
generated
vendored
Normal file → Executable file
0
vendor/golang.org/x/crypto/openpgp/packet/config.go
generated
vendored
Normal file → Executable file
0
vendor/golang.org/x/crypto/openpgp/packet/encrypted_key.go
generated
vendored
Normal file → Executable file
0
vendor/golang.org/x/crypto/openpgp/packet/encrypted_key.go
generated
vendored
Normal file → Executable file
0
vendor/golang.org/x/crypto/openpgp/packet/literal.go
generated
vendored
Normal file → Executable file
0
vendor/golang.org/x/crypto/openpgp/packet/literal.go
generated
vendored
Normal file → Executable file
0
vendor/golang.org/x/crypto/openpgp/packet/ocfb.go
generated
vendored
Normal file → Executable file
0
vendor/golang.org/x/crypto/openpgp/packet/ocfb.go
generated
vendored
Normal file → Executable file
0
vendor/golang.org/x/crypto/openpgp/packet/one_pass_signature.go
generated
vendored
Normal file → Executable file
0
vendor/golang.org/x/crypto/openpgp/packet/one_pass_signature.go
generated
vendored
Normal file → Executable file
0
vendor/golang.org/x/crypto/openpgp/packet/opaque.go
generated
vendored
Normal file → Executable file
0
vendor/golang.org/x/crypto/openpgp/packet/opaque.go
generated
vendored
Normal file → Executable file
0
vendor/golang.org/x/crypto/openpgp/packet/packet.go
generated
vendored
Normal file → Executable file
0
vendor/golang.org/x/crypto/openpgp/packet/packet.go
generated
vendored
Normal file → Executable file
0
vendor/golang.org/x/crypto/openpgp/packet/private_key.go
generated
vendored
Normal file → Executable file
0
vendor/golang.org/x/crypto/openpgp/packet/private_key.go
generated
vendored
Normal file → Executable file
0
vendor/golang.org/x/crypto/openpgp/packet/public_key.go
generated
vendored
Normal file → Executable file
0
vendor/golang.org/x/crypto/openpgp/packet/public_key.go
generated
vendored
Normal file → Executable file
0
vendor/golang.org/x/crypto/openpgp/packet/public_key_v3.go
generated
vendored
Normal file → Executable file
0
vendor/golang.org/x/crypto/openpgp/packet/public_key_v3.go
generated
vendored
Normal file → Executable file
0
vendor/golang.org/x/crypto/openpgp/packet/reader.go
generated
vendored
Normal file → Executable file
0
vendor/golang.org/x/crypto/openpgp/packet/reader.go
generated
vendored
Normal file → Executable file
0
vendor/golang.org/x/crypto/openpgp/packet/signature.go
generated
vendored
Normal file → Executable file
0
vendor/golang.org/x/crypto/openpgp/packet/signature.go
generated
vendored
Normal file → Executable file
0
vendor/golang.org/x/crypto/openpgp/packet/signature_v3.go
generated
vendored
Normal file → Executable file
0
vendor/golang.org/x/crypto/openpgp/packet/signature_v3.go
generated
vendored
Normal file → Executable file
0
vendor/golang.org/x/crypto/openpgp/packet/symmetric_key_encrypted.go
generated
vendored
Normal file → Executable file
0
vendor/golang.org/x/crypto/openpgp/packet/symmetric_key_encrypted.go
generated
vendored
Normal file → Executable file
0
vendor/golang.org/x/crypto/openpgp/packet/symmetrically_encrypted.go
generated
vendored
Normal file → Executable file
0
vendor/golang.org/x/crypto/openpgp/packet/symmetrically_encrypted.go
generated
vendored
Normal file → Executable file
0
vendor/golang.org/x/crypto/openpgp/packet/userattribute.go
generated
vendored
Normal file → Executable file
0
vendor/golang.org/x/crypto/openpgp/packet/userattribute.go
generated
vendored
Normal file → Executable file
0
vendor/golang.org/x/crypto/openpgp/packet/userid.go
generated
vendored
Normal file → Executable file
0
vendor/golang.org/x/crypto/openpgp/packet/userid.go
generated
vendored
Normal file → Executable file
0
vendor/golang.org/x/crypto/ripemd160/ripemd160.go
generated
vendored
Normal file → Executable file
0
vendor/golang.org/x/crypto/ripemd160/ripemd160.go
generated
vendored
Normal file → Executable file
0
vendor/golang.org/x/crypto/ripemd160/ripemd160block.go
generated
vendored
Normal file → Executable file
0
vendor/golang.org/x/crypto/ripemd160/ripemd160block.go
generated
vendored
Normal file → Executable file
Loading…
Reference in New Issue