9

暗号化された接続を使用しない SMTP アカウントを持っています。同じアカウントを使用して C# と Python から問題なくメールを送信できますが、Go ではエラーが発生します: 暗号化されていない接続

これは私が使用しているコードです:

package main

import (
        "log"
        "net/smtp"
)

func main() {
        // Set up authentication information.
        auth := smtp.PlainAuth(
                "",
                "user@example.com",
                "password",
                "mail.example.com",
        )
        // Connect to the server, authenticate, set the sender and recipient,
        // and send the email all in one step.
        err := smtp.SendMail(
                "mail.example.com:25",
                auth,
                "sender@example.org",
                []string{"recipient@example.net"},
                []byte("This is the email body."),
        )
        if err != nil {
                log.Fatal(err)
        }
}
4

1 に答える 1

20

ここでの問題はsmtp.PlainAuth、暗号化されていない接続を介してパスワードを送信することを拒否することです. これはあなた自身の保護のためです。のようなものsmtp.CRAMMD5Authがはるかに良い選択です。CRAM-MD5 を使用すると、暗号化されていない接続であっても、パスワードは公開されません。

とにかくプレーンな認証を使用したい場合は、独自のバージョンの を作成する必要がありますsmtp.PlainAuth。幸いなことに、これは非常に簡単に行うことができます。標準ライブラリから 20 行程度をコピーして、以下を削除します。

if !server.TLS {
    return "", nil, errors.New("unencrypted connection")
}

http://golang.org/src/pkg/net/smtp/auth.go?s=1820:1882#L41にはコードが含まれています。

コードをコピーしたくない場合は、関数によって返された smtp.Auth を独自の型でラップすることにより、標準ライブラリの実装を再利用できます。*smtp.ServerInfoこのようにして、暗号化された接続があるという実際の Auth メカニズム (標準ライブラリから) を傍受して騙します。なぜ自分がしていることをしているのかを明確にするために、コメントを多めにしてください。このようなもの(テストされていません):

type unencryptedAuth struct {
    smtp.Auth
}

func (a unencryptedAuth) Start(server *smtp.ServerInfo) (string, []byte, error) {
    s := *server
    s.TLS = true
    return a.Auth.Start(&s)
}

auth := unencryptedAuth {
    smtp.PlainAuth(
        "",
        "user@example.com",
        "password",
        "mail.example.com",
    ),
}
于 2012-06-16T18:37:53.287 に答える