質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.02%
Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

Q&A

解決済

go-mail でのconnection refused メールが送れない

AGLAAGLA
AGLAAGLA

総合スコア48

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

1回答

0グッド

0クリップ

691閲覧

投稿2022/11/25 03:54

編集2022/11/25 03:57

golangにてメールを送信するプログラムを実行したいのですが、connection refusedで送信できません。

go

1package main 2 3import ( 4 "gopkg.in/gomail.v2" 5) 6 7func main() { 8 m := gomail.NewMessage() 9 m.SetHeader("From", "???@gmail.com") 10 m.SetHeader("To", "???") 11 m.SetHeader("Subject", "Hello!") 12 m.SetBody("text/plain", "Hello!") 13 14 d := gomail.Dialer{Host: "localhost", Port: 25} 15 if err := d.DialAndSend(m); err != nil { 16 panic(err) 17 } 18} 19

吐いているエラーは以下の通りです。

panic: dial tcp [::1]:25: connect: connection refused goroutine 1 [running]: main.main() /Users/???/Desktop/mail.go:16 +0x361

メールアドレスや、ポート番号を変更し試しましたが、無理でした。
原因がわかる方、教えていただければ幸いです。

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答1

1

ベストアンサー

このライブラリは単体でメールを任意のところに送れるわけではありません。
別途SMTPサーバーが必要です。
「localhost:25」を指定してメールが送れるためには、
「localhost:25」にSMTPサーバーつまり「手元のPC上にてSMTPサーバーを起動する」必要があります。

ただ、このライブラリはgmail対応なのでgmailサービスが設置しているSMTPサーバーを利用することができます。 <- すいません勘違い
まずはSMTPサーバーを確保しましょう。(ローカルに立てるか、クラウドにSMTPサーバーを立てるか、SMTPサーバーをレンタルするか)

ローカルに立てる場合

以下のコードでシンプルなSMTPサーバーを立てることができます。

go

1package main 2 3import ( 4 "bytes" 5 "log" 6 "net" 7 "net/mail" 8 9 "github.com/mhale/smtpd" 10) 11 12func mailHandler(origin net.Addr, from string, to []string, data []byte) error { 13 msg, _ := mail.ReadMessage(bytes.NewReader(data)) 14 subject := msg.Header.Get("Subject") 15 log.Printf("Received mail from %s for %s with subject %s", from, to[0], subject) 16 return nil 17} 18 19func main() { 20 smtpd.ListenAndServe("127.0.0.1:2525", mailHandler, "MyServerApp", "") 21}

これはメール送信を検知してそれを表示するだけのSMTPサーバーです。
さらに外部のSMTPサーバーに中継する機能はありません。
(これだと外部ドメインに実際にメールを送ることはできません。)

投稿2022/11/25 04:34

編集2022/11/25 04:45
nobonobo

総合スコア3267

holly👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

nobonobo

2022/11/25 04:40

SMTPサーバーを直接使わずメールを送る方法もあります。 それがGMailのAPI利用です。
AGLAAGLA

2022/11/25 04:43 編集

ご丁寧な説明ありがとうございます。 一度ローカルに立ててみるのが、手っ取り早いですかね... (というのも、ローカルで正しく送れるかの実装をテストした後、AWSにあるファイルを送信する実装をしようと思っていました。) なので、とりあえず、メールが送信できるようになるのが現在のゴールなので、ローカルに立てて実装したいと思います。 申し訳ないですが、nobonoboさんのご存じの範囲で教えていただくことは可能でしょうか? 追記→ GmailAPI良さそうですね、無料なら使ってみたいと思います。
AGLAAGLA

2022/11/25 04:50

ありがとうございます。 参考にさせていただきます。
nobonobo

2022/11/25 04:58

ちなみに自前でのインターネットに公開する形のSMTPサーバーの運用はあまりお勧めしません。(悪意の踏み台にならないよう運用するのには抑えておくノウハウがそれなりにあります)
AGLAAGLA

2022/11/25 05:49

ご丁寧にありがとうございます。 もう1つだけ質問させていただきたいです。 https://github.com/go-gomail/gomail こちらのリポジトリには、smtp.goなどのファイルもありますが、このライブラリだけでも送信は厳しいのでしょうか?
nobonobo

2022/11/25 15:48

そのファイルの内容はSMTPクライアントなので。 唯一SMTPクライアント実装だけでメールを送れる可能性があるのは ご自身で契約しているインターネットプロバイダがSMTPサーバーを利用者に開放している場合ですね。 あるならプロバイダの提供される情報を使ってSMTPサーバーにDialすることでメールが送れるかもしれません。

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.02%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。