通过 smtp 发送电子邮件并更改发件人姓名

Posted

技术标签:

【中文标题】通过 smtp 发送电子邮件并更改发件人姓名【英文标题】:Send e-mail over smtp and change the sender's name 【发布时间】:2015-01-30 16:07:48 【问题描述】:

我在 golang 中通过 smtp 发送电子邮件,效果很好。要设置电子邮件的发件人,我使用Client.Mail 函数:

func (c *Client) Mail(from string) error

当收件人收到电子邮件时,他将发件人视为明文电子邮件地址:sender@example.com

我希望发件人显示为:Sandy Sender <sender@example.com>

这可能吗?我尝试将发件人设置为Sandy Sender <sender@example.com> 或仅Sandy Sender,但它们都不起作用。我收到错误501 5.1.7 Invalid address

【问题讨论】:

【参考方案1】:

您可以检查像jpoehls/gophermail 这样的项目是否效果更好。

它有一个测试用例like this one:

m.SetFrom("Domain Sender <sender@domain.com>")

它在内部 (main.go) 调用 SetMailAddress() 方法 mail.ParseAddress() 即 supposed to follow RFC 5322。

【讨论】:

【参考方案2】:

我认为您可以使用mail.Address 并使用Address.String 函数格式化地址

func (a *Address) String() string

字符串将地址格式化为有效的 RFC 5322 地址。如果地址名称包含非 ASCII 字符,则名称将根据 RFC 2047 呈现。

我写了例子:

go_smtp.go

【讨论】:

【参考方案3】:

您需要将邮件的From字段设置为Sandy Sender &lt;sender@example.com&gt;

...
From: Sandy Sender <sender@example.com>
To: recipient@example.com
Subject: Hello!

This is the body of the message.

并且只使用Client.Mail中的地址(sender@example.com)。

或者,你可以使用我的包Gomail:

package main

import (
    "gopkg.in/gomail.v2"
)

func main() 
    m := gomail.NewMessage()
    m.SetAddressHeader("From", "sender@example.com", "Sandy Sender")
    m.SetAddressHeader("To", "recipient@example.com")
    m.SetHeader("Subject", "Hello!")
    m.SetBody("text/plain", "This is the body of the message.")

    d := gomail.NewPlainDialer("smtp.example.com", 587, "user", "123456")

    if err := d.DialAndSend(m); err != nil 
        panic(err)
    

【讨论】:

所以我可以通过一个 smtp 连接发送多封电子邮件? 您可以使用 Gomail v2(仍然不稳定):github.com/go-gomail/gomail/issues/10#issuecomment-122090752 @codingrogue Gomail v2 现已推出,支持使用单个 SMTP 连接发送多封电子邮件。查看时事通讯示例:godoc.org/gopkg.in/gomail.v2#example-package--Newsletter【参考方案4】:

您可以在邮件标题中添加"From: EmailName&lt;" + EmailAdderss + "&gt; \r\n" 以显示您想要的任何电子邮件名称,并添加电子邮件地址以使重复邮件无效。

【讨论】:

另外,与其他答案相比,有点低级...... 是的,它只用于 smtp 包。不使用任何其他包。不过还是谢谢

以上是关于通过 smtp 发送电子邮件并更改发件人姓名的主要内容,如果未能解决你的问题,请参考以下文章

SMTP 的哪些实现通常处理邮件数据以响应 DATA 之后的 RSET?

使用 gmail SMTP 发送电子邮件,“发件​​人”字段重要吗?我需要先设置帐户权限吗?

PHPMailer 使用 SMTP 身份验证发送电子邮件,但 Gmail 仍然声称它无法验证发件人

使用c#发送电子邮件SMTP服务器需要安全连接或客户端未通过身份验证[重复]

电子邮件仅发送给第一个收件人 smtp mail python

Ruby Net::SMTP - 使用密件抄送发送电子邮件:收件人