首页 > 其他分享 >golang编写代码发邮件

golang编写代码发邮件

时间:2024-10-31 10:48:24浏览次数:4  
标签:发邮件 return nil err fmt golang failed Errorf 编写

AI提示词
用go语言直接向mx记录的25端口发邮件,要采用STARTTLS连接方式,要包含Message-ID

package main

import (
    "crypto/tls"
    "fmt"
    "log"
    "math/rand"
    "net"
    "net/mail"
    "net/smtp"
    "strings"
    "time"
)

func main() {
    from := "[email protected]"
    to := "[email protected]"
    subject := "Test Email via STARTTLS"
    body := "This is a test email sent using STARTTLS."

    err := SendMail(from, to, subject, body)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println("Email sent successfully")
}

func generateMessageID(from string) string {
    timestamp := time.Now().UnixNano()
    randomPart := rand.Int()
    domain := strings.Split(from, "@")[1]
    return fmt.Sprintf("<%d.%d@%s>", timestamp, randomPart, domain)
}

func SendMail(from, to, subject, body string) error {
    // 1. 解析收件人域名的MX记录
    domain := strings.Split(to, "@")[1]
    mxRecords, err := net.LookupMX(domain)
    if err != nil {
        return fmt.Errorf("failed to lookup MX records: %v", err)
    }

    if len(mxRecords) == 0 {
        return fmt.Errorf("no MX records found for domain %s", domain)
    }

    // 2. 连接到第一个MX记录的25端口
    mxHost := mxRecords[0].Host
    conn, err := net.Dial("tcp", mxHost+":25")
    if err != nil {
        return fmt.Errorf("failed to connect to MX host %s: %v", mxHost, err)
    }
    defer conn.Close()

    client, err := smtp.NewClient(conn, mxHost)
    if err != nil {
        return fmt.Errorf("failed to create SMTP client: %v", err)
    }
    defer client.Quit()

    // 3. 发送 HELO 命令
    if err := client.Hello("localhost"); err != nil {
        return fmt.Errorf("failed to say HELO: %v", err)
    }

    // 4. 发送 STARTTLS 命令
    if ok, _ := client.Extension("STARTTLS"); !ok {
        return fmt.Errorf("STARTTLS not supported by %s", mxHost)
    }

    config := &tls.Config{ServerName: mxHost, InsecureSkipVerify: true}
    if err := client.StartTLS(config); err != nil {
        return fmt.Errorf("failed to start TLS: %v", err)
    }

    // 5. 设置发件人和收件人
    if err := client.Mail(from); err != nil {
        return fmt.Errorf("failed to set sender: %v", err)
    }

    if err := client.Rcpt(to); err != nil {
        return fmt.Errorf("failed to set recipient: %v", err)
    }

    // 6. 编写邮件内容,添加Message-ID头
    wc, err := client.Data()
    if err != nil {
        return fmt.Errorf("failed to get write closer: %v", err)
    }

    msgID := generateMessageID(from)
    msg := fmt.Sprintf("Message-ID: %s\r\nFrom: %s\r\nTo: %s\r\nSubject: %s\r\n\r\n%s", msgID, from, to, subject, body)
    _, err = wc.Write([]byte(msg))
    if err != nil {
        return fmt.Errorf("failed to write message: %v", err)
    }

    if err := wc.Close(); err != nil {
        return fmt.Errorf("failed to close write closer: %v", err)
    }

    return nil
}

标签:发邮件,return,nil,err,fmt,golang,failed,Errorf,编写
From: https://www.cnblogs.com/xiangxisheng/p/18517267

相关文章

  • gomail 发邮件
    gomail发邮件packagemainimport( "crypto/tls" "fmt" "log" "strconv" "gopkg.in/gomail.v2")funcSendMail(mailTo[]string,subjectstring,bodystring)error{ //设置邮箱主体 mailConn:=map[string]str......
  • 在openwrt上跑golang程序
    1.安装Go语言、搭建开发环境https://blog.csdn.net/qq_38105536/article/details/1426351322.VMwareWorkstation部署最新版OpenWrt23.05.3https://blog.csdn.net/gtj0617/article/details/137706312桥接模式(负责物理网络连接状态),设置ip:192.168.0.11设置root密码root@Ope......
  • shellcode编写实验
       作业题目shellcode广泛用于许多涉及代码注入的攻击中。编写shellcode是相当有挑战性的。虽然我们可以很容易地从互联网上找到现有的shellcode,但是能够从头开始编写我们自己的shellcode总是令人兴奋的。shellcode中涉及到几种有趣的技术。本实验室的目的是帮助学生理解这......
  • makefile如何编写?
    什么是makefile?        makefile文件中定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令. makefile带来的好处就是——“......
  • golang驱动系统打印机
    参考项目https://github.com/google/cloud-print-connector谷歌云打印机连接器cupslinux系统winspoolwindows系统https://github.com/lxn/winAWindowsAPIwrapperpackagefortheGoProgrammingLanguagehttps://github.com/antonlahti/go-winapiAWind......
  • input角度:I2C触摸屏驱动分析和编写一个简单的I2C驱动程序
    往期内容本专栏往期内容:input子系统的框架和重要数据结构详解-CSDN博客inputdevice和inputhandler的注册以及匹配过程解析-CSDN博客inputdevice和inputhandler的注册以及匹配过程解析-CSDN博客编写一个简单的Iinput_dev框架-CSDN博客GPIO按键驱动分析与使用:input_dev......
  • 92. 反转链表 II Golang实现
    题目描述:给你单链表的头指针head和两个整数left和right,其中left<=right。请你反转从位置left到位置right的链表节点,返回反转后的链表。思路分析:没到指定的位置范围时,直接进行链表的链接,然后到了需要转换的范围就将这些节点用一个栈保存,然后再利用栈的先入后出......
  • 在linux系统中,手动编写java代码,将接口打成jar供其他程序调用,实现方式
    本文是在学习java时做的记录工作目录:/root/JAVA1、编写接口文件IHello.java,将IHello.java文件放到usr/com/example目录下注意:usr不是根目录下的/usr,是在当前目录下创建usr/com/example,因为package需要指定目录。目录结构:.└──usr└──com└──......
  • 142. 环形链表 II Golang实现
    #题目描述:给定一个链表的头节点head,返回链表开始入环的第一个节点。如果链表无环,则返回null。如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数pos来表示链表尾连接到链表中的位置(索引从0开始)。如......
  • 编写一个桌面应用程序,你还有多少选择?
    原创 IT软件部落 IT软件部落 一、Java:优势:跨平台性:这是 Java 的最大优势之一,一次编写,可在多个操作系统上运行,大大降低了开发者针对不同平台进行适配的工作量。丰富的类库和框架:拥有庞大的生态系统,如 Swing 和 JavaFX 等用于 GUI 开发的框架,提供了丰富......