잠시만 기다려 주세요

     '싸우지 않는 이재명을 규탄한다. 민생충, 협치충, 역풍충.. 국민들은 치가 떨린다.'
전체검색 :  
이번주 로또 및 연금번호 발생!!   |  HOME   |  여기는?   |  바다물때표   |  알림 (16)  |  여러가지 팁 (1056)  |  추천 및 재미 (152)  |  자료실 (22)  |  
시사, 이슈, 칼럼, 평론, 비평 (602)  |  끄적거림 (129)  |  문예 창작 (705)  |  바람 따라 (69)  |  시나리오 (760)  |  드라마 대본 (248)  |  
살인!


    golang

golang - Golang : Send email with attachment, 파일 첨부, ssl, tls
이 름 : 바다아이   |   조회수 : 13803         짧은 주소 : https://www.bada-ie.com/su/?391591779907
여기저기 소스 가져다 짜깁기 했더니 좀 많이 지저분하네요.... 원리만 알면 되니까..
흐름 보시고 고쳐 쓰세요.... 요즘 smtp 거의 ssl 465 씁니다. 25번 포트 이용하는 메일은 더 쉽습니다.
golang 의 기본 smtp 패키지 이용하시면 됩니다.

https://golang.org/pkg/net/smtp/#example_SendMail


package main

import (
	"crypto/tls"
	"encoding/base64"
	"fmt"
	"io/ioutil"
	"log"
	"mime"
	"net"
	"net/mail"
	"net/smtp"
	"path/filepath"
)

const (
	MIME = "MIME-version: 1.0;\nContent-Type: text/html; charset=\"UTF-8\";\n\n"
)

// Attachment represents an email attachment.
type Attachment struct {
	Filename string
	Data     []byte
}

type Message struct {
	Attachments map[string]*Attachment
}

func (m *Message) attach(file string) error {
	data, err := ioutil.ReadFile(file)
	if err != nil {
		return err
	}

	_, filename := filepath.Split(file)

	m.Attachments[filename] = &Attachment{
		Filename: filename,
		Data:     data,
	}

	return nil
}

// SSL/TLS Email Example
func main() {

	m := &Message{}

	m.Attachments = make(map[string]*Attachment)

	// 이거 smtp 서버랑 주소 안 맞으면 거부됩니다. 네이버면 아이디@naver.com 그리고 mail.Address 첫번째 공백은 이름인데 없어도 됨
	from := mail.Address{"", "보내는 메일 주소"}
	to := mail.Address{"", "받는 메일 주소"}
	subj := "This is the email subject 나여나"
	body := "This is an example body.<br> With two lines. <br>내용이여.."

	// Setup headers
	headers := make(map[string]string)
	headers["From"] = from.String()
	headers["To"] = to.String()
	headers["Subject"] = subj

	// Setup message
	message := ""
	for k, v := range headers {
		message += fmt.Sprintf("%s: %s\r\n", k, v)
	}

	fileman := []string{"1.png", "2.png", "3.pdf"}

	// add attachments
	for k := 0; k < len(fileman); k++ {
		if err := m.attach(fileman[k]); err != nil {
			log.Fatal(err)
		}
	}

	boundary := "f46d043c813270fc6b04c2d223da"

	if len(m.Attachments) > 0 {
		message += "Content-Type: multipart/mixed; boundary=" + boundary + "\r\n"
		message += "\r\n--" + boundary + "\r\n"
	}

	message += MIME + "\r\n" + body

	if len(m.Attachments) > 0 {

		for _, attachment := range m.Attachments {
			message += "\r\n\r\n--" + boundary + "\r\n"

			ext := filepath.Ext(attachment.Filename)
			mimetype := mime.TypeByExtension(ext)
			if mimetype != "" {
				mime := fmt.Sprintf("Content-Type: %s\r\n", mimetype)
				message += mime
			} else {
				message += "Content-Type: application/octet-stream\r\n"
			}
			message += "Content-Transfer-Encoding: base64\r\n"

			message += "Content-Disposition: attachment; filename=\"=?UTF-8?B?"
			message += base64.StdEncoding.EncodeToString([]byte(attachment.Filename))
			message += "?=\"\r\n\r\n"

			b := make([]byte, base64.StdEncoding.EncodedLen(len(attachment.Data)))
			base64.StdEncoding.Encode(b, attachment.Data)

			message += string(b)

			message += "\r\n--" + boundary
		}

		message += "--"
	}

	// Connect to the SMTP Server
	servername := "smtp 주소:465"

	host, _, _ := net.SplitHostPort(servername)

	auth := smtp.PlainAuth("", "아이디", "패스워드", host)

	// TLS config
	tlsconfig := &tls.Config{
		InsecureSkipVerify: true,
		ServerName:         host,
	}

	// Here is the key, you need to call tls.Dial instead of smtp.Dial
	// for smtp servers running on 465 that require an ssl connection
	// from the very beginning (no starttls)
	conn, err := tls.Dial("tcp", servername, tlsconfig)
	if err != nil {
		log.Panic(err)
	}

	c, err := smtp.NewClient(conn, host)
	if err != nil {
		log.Panic(err)
	}

	// Auth
	if err = c.Auth(auth); err != nil {
		log.Panic(err)
	}

	// To && From
	if err = c.Mail(from.Address); err != nil {
		log.Panic(err)
	}

	if err = c.Rcpt(to.Address); err != nil {
		log.Panic(err)
	}

	// Data
	w, err := c.Data()
	if err != nil {
		log.Panic(err)
	}

	_, err = w.Write([]byte(message))
	if err != nil {
		log.Panic(err)
	}

	err = w.Close()
	if err != nil {
		log.Panic(err)
	}

	c.Quit()

}
| |





      1 page / 6 page
번 호 카테고리 제 목 이름 조회수
179 golang golang , ... 바다아이 1725
178 golang golang , map . 바다아이 1327
177 golang Golang (, , data ) , ... 바다아이 1337
176 golang golang sort ... 바다아이 1569
175 golang golang html.EscapeString html.UnescapeString input value ... 바다아이 1695
174 golang golang go.mod go.sum . GOPATH SRC not module, 1.16 . 바다아이 4969
173 golang go 1.16 ... is not in GOROOT.. GOPATH .... . 바다아이 5867
172 golang , String Formatting 바다아이 7504
171 golang rand.Intn , random, , . 바다아이 6967
170 golang golang ... 바다아이 10058
169 golang golang gopath, goroot .. golang 바다아이 7636
168 golang golang ... Force download file example 바다아이 9428
167 golang golang , , cpu, memory, disk 바다아이 10723
166 golang golang , ... GOOS, GOARCH 바다아이 8497
165 golang golang checkbox ... 바다아이 8249
164 golang golang , , http .... 바다아이 8022
163 golang golang nil , nil , nil ... 바다아이 8369
162 golang 2 golang, go , .... golang .... 바다아이 11238
161 golang golang postgresql, mysql, mariadb ... ` Grave () .. .. 바다아이 8561
160 golang golang postgresql mysql, mariadb scan , null .. 바다아이 8703
159 golang golang , iconv 바다아이 11493
158 golang golang quote escape, unquote 바다아이 8899
157 golang golang , http errorLog , , ... 바다아이 9002
156 golang golang interface , 바다아이 8476
155 golang golang struct .... 바다아이 9146
154 golang golang map map , 바다아이 8672
153 golang golang map .... .... 바다아이 8191
152 golang golang slice copy 바다아이 8289
151 golang golang goto 바다아이 9150
150 golang golang slice sort , int, string, float64 바다아이 8628
| |









Copyright ⓒ 2001.12. bada-ie.com. All rights reserved.
이 사이트는 리눅스에서 firefox 기준으로 작성되었습니다. 기타 브라우저에서는 다르게 보일 수 있습니다.
[ Ubuntu + GoLang + PostgreSQL + Mariadb ]
서버위치 : 오라클 클라우드 춘천  실행시간 : 0.05984
to webmaster... gogo sea. gogo sea.