首页 > 其他分享 >golang TLS方式发送邮件

golang TLS方式发送邮件

时间:2023-04-07 14:46:22浏览次数:40  
标签:TLS return err nil fmt golang error 邮件 string

package mail

import (
	"crypto/tls"
	"errors"
	"fmt"
	"net/smtp"
	"net/textproto"
)

type loginAuth struct {
	username, password string
}

// LoginAuth is
func LoginAuth(username string, password string) smtp.Auth {
	return &loginAuth{username, password}
}

func (a *loginAuth) Start(server *smtp.ServerInfo) (string, []byte, error) {
	return "LOGIN", []byte{}, nil
}

func (a *loginAuth) Next(fromServer []byte, more bool) ([]byte, error) {
	if more {
		switch string(fromServer) {
		case "Username:":
			return []byte(a.username), nil
		case "Password:":
			return []byte(a.password), nil
		default:
			return nil, errors.New("UNKNOWN SERVER")
		}
	}
	return nil, nil
}

func SendMail(fromEmail string, recepients string, subject, body, mailServer, mailPort, mailUser, mailPassword string) error {
	headers := make(map[string]string)
	headers["From"] = fromEmail
	headers["To"] = recepients
	headers["Subject"] = subject
	headers["Content-Type:text/html;charset=\"UTF-8\""] = ""
	message := ""
	for k, v := range headers {
		message += fmt.Sprintf("%s: %s\r\n", k, v)
	}
	message += body
	tlsconfig := &tls.Config{
		InsecureSkipVerify: false,
		ServerName:         mailServer,
	}

	conn, err := tls.Dial("tcp", mailServer+":"+mailPort, tlsconfig)
	if err != nil {
		err = fmt.Errorf("mail: tls.Dial error: %v", err)
		return err
	}
	c, err := smtp.NewClient(conn, mailServer)
	if err != nil {
		err = fmt.Errorf("mail: smtp.NewClient error. %v", err)
		return err
	}

	if err = c.Auth(LoginAuth(mailUser, mailPassword)); err != nil {
		err = fmt.Errorf("mail: c.Auth error. %v", err)
		return err
	}

	if err = c.Mail(fromEmail); err != nil {
		err = fmt.Errorf("mail: c.Mail error. %v", err)
		return err
	}
	if err = c.Rcpt(recepients); err != nil {
		err = fmt.Errorf("mail: c.Rcpt error. %v", err)
		return err

	}

	w, err := c.Data()
	if err != nil {
		err = fmt.Errorf("mail: c.Data error. %v", err)
		return err
	}

	_, err = w.Write([]byte(message))
	if err != nil {
		err = fmt.Errorf("mail: w.Write error. %v", err)
		return err
	}

	err = w.Close()
	if err != nil {
		err = fmt.Errorf("mail: w.Close error. %v", err)
		return err
	}
	c.Quit()
	return nil

}

标签:TLS,return,err,nil,fmt,golang,error,邮件,string
From: https://www.cnblogs.com/ls11736/p/17296065.html

相关文章

  • day7 golang GMP
    大名鼎鼎的GMP模型需要自行学习的知识:进程、线程、协程、多线程、线程池、io多路复用,内核态用户态,,同步阻塞异步非阻塞等等相关知识代码是在线程中运行的,协程也是,所以当协程阻塞的时候该线程也阻塞了,其他任务就无法调度了,该线程就死了。如何解决,那就需要让协程自由的在线程中移......
  • Golang之常用方法[总结]
    1.有一堆数字,如果除了一个数字以外,其他数字都出现了两次,那么如何找到出现一次的数字?nums:=[]int{1,5,1,6,5,3,6}i:=0for_,v:=rangenums{i^=v}fmt.Print(i)重点是异或的使用......
  • (转)使用 Golang 创建和读取 Excel 文件
    原文:https://juejin.cn/post/7117578016858849293摘要本文提出一种使用Golang进行Excel文件创建和读取的方案。首先对问题进行分析,引出方案的基本架构;然后分章节描述了Excelize基础库的基本用法,以及Excel数据在Golang中的表示和解析方式,并进一步提出了应对大规模数......
  • 运行 Golang 程序时让程序不会在运行结束后立即关闭命令行窗口
    在运行Golang程序时,为了让程序不会在运行结束后立即关闭命令行窗口,可以采用以下两种方法:使用fmt.Scanln()函数在程序的末尾添加一行fmt.Scanln()可以暂停程序运行,等待用户在命令行中输入任何字符,程序将等待用户输入,然后再继续执行直到程序结束。packagemainimport"fm......
  • golang pprof 监控系列(4) —— goroutine thread 统计原理
    golangpprof监控系列(4)——goroutinethread统计原理大家好,我是蓝胖子。在之前golangpprof监控系列文章里我分别介绍了gotrace以及gopprof工具对memory,block,mutex这些维度的统计原理,今天我们接着来介绍golangpprof工具对于goroutine和thread的统计原理。还记得在......
  • Golang 应用接入 Prometheus 监控
    前言Prometheus提供了官方版Golang库(https://github.com/prometheus/client_golang)用于采集并暴露监控数据,本文快速为你介绍如何使用官方版Golang库来暴露Golangruntime相关的数据,以及其它一些基本简单的示例,并使用Prometheus监控服务来采集指标展示数据。❝有关全面......
  • golang开发需要掌握的核心包以及中间件,涵盖项目的各个领域,值得收藏
    golang开发需要掌握的核心包以及中间件,涵盖项目的各个领域,值得收藏。常用包常用包 说明fmt 实现格式化的输入输出操作,其中的fmt.Printf()和fmt.Println()是开发者使用最为频繁的函数。io 实现了一系列非平台相关的IO相关接口和实现,比如提供了对os中系统相关的IO功能的封装。我们......
  • Golang基础-Select
    基本概念select是Go中的一个控制结构,类似于switch语句。select语句只能用于通道(channel)操作,每个case必须是一个通道操作,要么是发送要么是接收。select语句会监听所有指定的通道上的操作,一旦其中一个通道准备好就会执行相应的代码块。如果多个通道都准备好,那么sel......
  • Golang入门教程(一)GOPATH与工作空间(Windows)
    https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/01.2.md Windows环境:下面我就以mymath为例来讲述如何编写应用包:cd$GOPATH/srcmkdirmymath//我的环境:$GOPATH=c:\mygo新建文件sqrt.go,内容如下://$GOPATH/src/mymath/sqrt.go源码如......
  • 如何在ubuntu22下安装docker版的golang来编译go语言写的代码
    为了让我们的ubuntu22系统更干净清爽我们使用docker首先使用snapinstalldocker安装docker后即可使用docker了docker命令的使用方法1:将你的代码下载到用户目录(~)下面(例如~/github/xixi/...)2:使用cd命令进到你代码需要运行gobuild的文件夹3:然后使用下面命令即可给你的代码编译......