net/textproto

textproto实现了对基于文本的请求/回复协议的一般性支持,包括HTTP、NNTP和SMTP

主要功能如下

  • 1.格式化MIME头的键
  • 2.去掉ascii编码字符切片的空白
  • 3.MIMEHeader 功能介绍
  • 4.创建网络连接
  • 5.写入数据
  • 6.读取数据

1.格式化MIME头的键

标准化 MIME 头: Accept-Encoding 字符连接的单词首字母大写 ,其余小写

func CanonicalMIMEHeaderKey(s string) string

textproto.CanonicalMIMEHeaderKey("content-type") // Content-Type

2.去掉ascii编码字符切片的空白

下面我们把一个文件的内容读取到data中

    var data  = []byte("  ddd  ")
    fmt.Println(len(textproto.TrimBytes(data))) // 3

下面这个方法剔除字符串空白

func TrimString(s string) string

3.MIMEHeader 功能介绍

  mimeHeader :=   make(textproto.MIMEHeader)
  mimeHeader.Set("Content-Type","text/plain")// 系统会自动转换为mime key标准格式
  fmt.Println(mimeHeader)
  mimeHeader.Del("content-type")
  mimeHeader.Add("Content-Type","text/html")
  fmt.Println(mimeHeader)
  fmt.Println(mimeHeader.Get("content-type")) // 系统会自动转换为mime key标准格式

map[Content-Type:[text/plain]] map[Content-Type:[text/html]] text/html


4.创建网络连接

func Dial(network, addr string) (*Conn, error)

package main

import (
    "net/textproto"
    "fmt"
)

func main() {

    conn,error := textproto.Dial("tcp","smtp.qq.com:25")
    if error != nil {
        fmt.Println(error)
    }
    fmt.Println(conn)
    fmt.Println(conn.Reader)
    fmt.Println(conn.Writer)
    data,error := conn.Reader.ReadLine()
    if error != nil {
        fmt.Println(error)
    }
    fmt.Println(data)
}

我们与 smtp.qq.com:25 建立了连接,并且读取到了邮件服务器返回给我们的数据 220 smtp.qq.com Esmtp QQ Mail Server

5.写入数据

package main

import (
    "net/textproto"
    "fmt"
)

func main() {

    conn,error := textproto.Dial("tcp","smtp.qq.com:25")
    if error != nil {
        fmt.Println(error)
    }
    data,error := conn.Reader.ReadLine()
    if error != nil {
        fmt.Println(error)
    }
    fmt.Println(data)
    // 向服务器写入了一个HELO命令
    conn.Writer.PrintfLine("HELO %s","xujie")
    data,error = conn.Reader.ReadLine()
    if error != nil {
        fmt.Println(error)
    }
    //
    fmt.Println(data)
}

220 smtp.qq.com Esmtp QQ Mail Server 250 smtp.qq.com

func (w *Writer) DotWriter() io.WriteCloser

DotWriter方法返回一个io.WriteCloser,用于将点编码文本写入w。返回的接口会在必要时添加转义点,将行尾的\n替换为\r\n,并在关闭时添加最后的.\r\n行。调用者必须在下一次调用w的方法前关闭该接口

返回的 io.WriteCloser 有一个close方法,调用close可以关闭数据传输

6.读取数据

//ReadDotLines方法读取一个点编码文本块并返回一个包含解码后各行的切片,各行最后的\r\n或\n去掉
func (r *Reader) ReadDotLines() ([]string, error) 
//ReadLine方法从r读取单行,去掉最后的\r\n或\n。
func (r *Reader) ReadLine() (string, error)
//ReadLineBytes类似ReadLine但返回[]byte切片。
func (r *Reader) ReadLineBytes() ([]byte, error)
//方法读取回复的状态码行,格式如下:
func (r *Reader) ReadCodeLine(expectCode int) (code int, message string, err error)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • defer 的妙用

    defer 语句的用途是:含有 defer 语句的函数,会在该函数将要返回之前,调用另一个函数。这个定义可能看起来很复杂,我们通过一个示例就很容易明白了。

    酷走天涯
  • 接口

    在面向对象的领域里,接口一般这样定义:接口定义一个对象的行为。接口只指定了对象应该做什么,至于如何实现这个行为(即实现细节),则由对象本身去确定。

    酷走天涯
  • net

    net 包提供了可移植的网络i/o接口,包括TCP/IP、UDP、域名解析和Unix域socket

    酷走天涯
  • tomcat启动分析(2)Bootstrap

    startup.bat会最终运行Bootstrap的main方法,而main会先调用init方法。

    平凡的学生族
  • 浅析ReDoS的原理与实践

    *本文原创作者:MyKings,本文属FreeBuf原创奖励计划,未经许可禁止转载 ReDoS(Regular expression Denial of Ser...

    FB客服
  • 巧用fastjson自定义序列化类实现字段的转换

    项目中突然需要增加另一个字段的查找,而这个查找需要查另一张表的记录。 但现在产品很多地方都要增加该字段,如何最快的实现该功能呢。 办法如下: 通过fast...

    星痕
  • 虚拟机字节码执行引擎

    所谓的「虚拟机字节码执行引擎」其实就是 JVM 根据 Class 文件中给出的字节码指令,基于栈解释器的一种执行机制。通俗点来说,也就是 JVM 解析字节码指令...

    Single
  • 虚拟机字节码执行引擎

    所谓的「虚拟机字节码执行引擎」其实就是 JVM 根据 Class 文件中给出的字节码指令,基于栈解释器的一种执行机制。通俗点来说,也就是 JVM 解析字节码指令...

    Single
  • 面向程序员的数据挖掘指南(一)

    ? 作者:Ron Zacharski 第一章:简介 内容: 寻找事物 本书结构 阅读完本书后你可以做些什么? 为什么数据挖掘很重要?哪些内容可以为我所用? ...

    小莹莹
  • SSH连*nux常用命令二

    通过SSH连接*nux服务器,需要记住很多命令,今天用到了一些,记下来,以免忘记。

    the5fire

扫码关注云+社区

领取腾讯云代金券