go smtp

最近看了几个 用 go 写的实现 gmail 发送邮件的程序,发现代码甚是简单。

然后仔细研究了一下 smtp 协议,已经相关技术。

1.go code

调研go 的 "net/smtp"包的两个函数就可以了。

func SendMail(addr string, a Auth, from string, to []string, msg []byte) error

SendMail connects to the server at addr, switches to TLS if possible,
authenticates with the optional mechanism a if possible, and then sends an email
from address from, to addresses to, with message msg.

func PlainAuth(identity, username, password, host string) Auth

PlainAuth returns an Auth that implements the PLAIN authentication mechanism
as defined in RFC 4616. The returned Auth uses the given username and password
to authenticate on TLS connections to host and act as identity. Usually identity
will be left blank to act as username.


auth := smtp.PlainAuth(
  "",
  from@gmail.com,
  mypassword,
  "smtp.gmail.com",
)

err := smtp.SendMail(

  "smtp.example.com:25",
  auth,
  "[email protected]",
  mailList,
  []byte(sub+content))

当然 也有 更好的实现,有点类似socket,建立连接之后 客户端 持有 connection,  然后在 connection
上面操作。

可以查看:https://github.com/scorredoira/email

2.相关点

我花了一点是件简单看了一下 smtp协议,着重理解了一下 smtp 的auth 和 TLS.

(1) smtp 协议 类似 http
协议:http://www.rfc-editor.org/rfc/pdfrfc/rfc5321.txt.pdf

(2) TLS  it‘s a protocal to encrypt you trasmitted data .

refer to http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html

(3) for auth

refer to : https://qmail.jms1.net/test-auth.shtml  <--- good
artical

Once you are authenticated, you may
continue with a normal SMTP conversation and the server should accept any
message from you, whether you are relaying to an outside domain or not. Even if
you don‘t authenticate, the server will still accept messages from you- it just
won‘t relay (it will act the same as if you had never entered an AUTH command at
all.)

How to auth using TLS in code:


auth := smtp.PlainAuth(
"",
from,
password,
"smtp.gmail.com",
)

conn, err := smtp.Dial("smtp.gmail.com:587")
err = conn.StartTLS(&tls.Config{})
err = conn.Auth(auth)
err = conn.Mail([email protected])
err = conn.Rcpt([email protected]) //can add multiple receivers
wc, err := conn.Data()
  defer wc.Close()
_, err = wc.Write(e.Bytes()) //write data

}

this code similar to <----  may
be wrong,  I will confirm it by wireshark tomorrow.

(1) dial

S: 220 mail.example.com ESMTP Postfix (1.1.7)
C: EHLO example.com
S: 250-mail.example.com
S: 250-PIPELINING
S: 250-SIZE 10240000
S: 250-VRFY
S: 250-ETRN
S: 250-AUTH DIGEST-MD5 CRAM-MD5 GSSAPI PLAIN LOGIN
S: 250-AUTH=DIGEST-MD5 CRAM-MD5 GSSAPI PLAIN LOGIN
S: 250-XVERP
S: 250 8BITMIME
S: 250 STARTTLS

(2) startTLS
C: STARTTLS
S: 220 Go ahead
C: <starts TLS negotiation>
S: 220 Ready to start TLS ... TLS negotiation proceeds. Further commands protected by TLS layer
...

(3) auto
C: AUTH PLAIN dGVzdAB0ZXN0AHRlc3RwYXNz 
S: 235 Authentication successful

(4) send data
...
(5) close
C: QUIT
S: 221 Bye

(3) ,(4) and (5) are encrypted by TLS.

时间: 2024-10-25 12:58:10

go smtp的相关文章

How to change SMTP Banner, HELO,EHLO Greetings for Zimbra

1- Take Zimbra backup or VM snapshot before doing any changes 2- Enter the following command to change SMTP Banner: # su - zimbra $ zmlocalconfig -e postfix_smtpd_banner="yourmailserver.yourdomain.com" 3- Then if you want to change HELO/EHLO nam

Linux学习笔记:使用外部SMTP发送邮件

在CENTOS 6.3上,安装mailx,即可使用外部smtp服务器来发送邮件, yum install mailx -y 安装好后,编辑配置文件 mailx -V 12.4 7/29/08  <<mailx的版本号 rpm -qc mailx /etc/mail.rc   <<网上很多教程写了配置文件名是nail.rc,难道是旧版的缘故? vi /etc/mail.rc 在文件最后加入以下内容.(关于这个配置文件,man是没有资料的,我也是参考网上别的教程,如果要具体研究,估计要

Python+Nginx实现邮件POP、IMAP、SMTP代理配置介绍

说到Python,大家都知道,是在运维方面的管理人员需要掌握的一门技术,为什么这么说呢,在运维方面Python开发语言应用比较广,以致可以帮助管理员提高工作效率,具体我就不多少了,接着我们说说邮件代理,因为公司的邮箱系统是使用是IBM的Domino Lotus服务,如果对Lotus了解的都知道,Lotus是文件数据库类型的服务器类型,用户的所有邮箱数据库都是独立的xxx.nsf,而通过数据库模板xxx.ntf进行创建或者定时刷新数据,来保证数据库的额稳定性.而当用户数量多的话,就需要创建多台邮件

zabbix使用系统自带mailx(mail)SMTP发送邮件

0x01,环境介绍: 我们用的是微软的邮箱打算用SMTP方式发送邮件.先登录账户看官方给出SMTP信息. 0x02,系统mailx(mail)设置. 通过命令可以看到,mail实际上是mailx的快捷方式.然后在/etc/mail.rc里加入账号等信息. SMTP加密方式是:STARTTLS set from=Zabbix使用的发送邮件地址 set smtp=smtp.office365.com set smtp-auth-user=Zabbix使用的发送邮件地址 set smtp-auth-p

com.sun.mail.smtp.SMTPSendFailedException: 553 Mail from must equal authorized user

1.错误描写叙述 553 Mail from must equal authorized user com.sun.mail.smtp.SMTPSendFailedException: 553 Mail from must equal authorized user at com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:1333) at com.sun.mail.smtp.SMTPTransport.mail

python smtp 通过MIMEText类 发送HTML格式的邮件

由于纯文本的邮件内容已经不能满足多样化的需求,主要介绍通过引入mail.mime的MIMEText 类来实现支持HTML格式的邮件,支持所有HTML格式的元素,包括表格,图片,动画,css样式,表单等.(参考刘老师文献) 案例中收集的是最简单的服务器硬件信息,通过smtp将信息发到收件人邮箱,大家可以根据自己的需求收集所需要的信息(比如CPU百分比,硬盘剩余百分比,内存使用百分比,并设定阈值,当硬盘剩余空间不足10%,发送邮件通知管理员及时处理) #!/usr/bin/env python #c

西部开源学习笔记BOOK3《unit 4.SMTP》

################################ ########## unit4.SMTP ########## ################################ ###########1.实验环境搭建############ desktop:172.25.254.119 hostname:maillinux.linux.com dns-server:172.25.254.219 server:172.25.254.219 hostname:mailwestos

C# 网络编程之基于SMTP发送电子邮件

        本文主要讲述基于C#网络编程的发送邮件的编程,邮件发送功能是基于邮件协议的,常见的电子邮件协议有SMTP(简单邮件传输协议).POP3(邮局协议).IMAP(Internet邮件訪问协议),文章主要參考周存杰的<C#网络编程实例教程>.这也是最后一篇參照该书的网络编程文章,之后的该系列文章都是基于网络实际应用的,不会再大量讲述原理知识. 一.SMTP协议         SMTP协议是TCP/IP协议家族定义的机器间交换邮件的标准,它主要负责底层邮件系统怎样将一个报文从一台机器

linux使用mail命令发邮件—第三方smtp

yum install mail 修改 /etc/mail.rc 清空文件加入 set [email protected] smtp=smtp.163.com  #smtpserverset smtp-auth-user=ysy399268824 smtp-auth-password=密码smtp-auth=login #smtp account 因为mail命令默认会使用sendmail或者postfix发送邮件 sendmail# service sendmail stop# chkconf

【转】Prestashop SMTP模式发送邮件客户邮件(联系我们页面)收到不的解决办法

Prestashop 一般默认使用 mail 函数发送邮件,邮件发送的IP地址就是服务器或者共享空间的IP地址.共享空间上面的网站很多,可能存在发送垃圾邮件的网站,导致共享空间的IP地址被其 他邮件服务商(gmail.hotmail等等)加入黑名单,使用mail发送的邮件全部不能够发送成功. 更换使用第三方邮件来发送邮件,Prestashop 后台设置的发送邮件模式更换成SMTP. 经过测试发现:使用SMTP发送邮件,当发件人为非SMTP账户邮箱时,发送邮件成功,但是收件人收不到邮件. 联系我们