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

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

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

GmailとはGoogleによって提供されているウェブメールのサービスのことです。

Go

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

Q&A

1回答

1434閲覧

gmail-api で添付ファイルを送りたい go言語

AGLAAGLA

総合スコア54

Gmail

GmailとはGoogleによって提供されているウェブメールのサービスのことです。

Go

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

0グッド

0クリップ

投稿2022/11/25 08:42

編集2022/11/25 08:46

現在、gmail-apiを使用し、go言語でメールを送信する部分を実装しました。
そこで、添付ファイルも一緒に送信したいのですが、attachをつけて送信すると良いとのことで、本文に追加したのですが、うまく送れないです。

go

1package main 2 3import ( 4 "context" 5 "encoding/base64" 6 "encoding/json" 7 "fmt" 8 "io/ioutil" 9 "log" 10 "net/http" 11 "os" 12 "strings" 13 14 "golang.org/x/oauth2" 15 "golang.org/x/oauth2/google" 16 "golang.org/x/text/encoding/japanese" 17 "golang.org/x/text/transform" 18 "google.golang.org/api/gmail/v1" 19 "google.golang.org/api/option" 20) 21 22func getClient(config *oauth2.Config) *http.Client { 23 tokFile := "token.json" 24 tok, err := tokenFromFile(tokFile) 25 if err != nil { 26 tok = getTokenFromWeb(config) 27 saveToken(tokFile, tok) 28 } 29 return config.Client(context.Background(), tok) 30} 31 32func getTokenFromWeb(config *oauth2.Config) *oauth2.Token { 33 authURL := config.AuthCodeURL("state-token", oauth2.AccessTypeOffline) 34 fmt.Printf("Go to the following link in your browser then type the "+ 35 "authorization code: \n%v\n", authURL) 36 37 var authCode string 38 if _, err := fmt.Scan(&authCode); err != nil { 39 log.Fatalf("Unable to read authorization code: %v", err) 40 } 41 42 tok, err := config.Exchange(context.TODO(), authCode) 43 if err != nil { 44 log.Fatalf("Unable to retrieve token from web: %v", err) 45 } 46 return tok 47} 48 49func tokenFromFile(file string) (*oauth2.Token, error) { 50 f, err := os.Open(file) 51 if err != nil { 52 return nil, err 53 } 54 defer f.Close() 55 tok := &oauth2.Token{} 56 err = json.NewDecoder(f).Decode(tok) 57 return tok, err 58} 59 60func saveToken(path string, token *oauth2.Token) { 61 fmt.Printf("Saving credential file to: %s\n", path) 62 f, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0600) 63 if err != nil { 64 log.Fatalf("Unable to cache oauth token: %v", err) 65 } 66 defer f.Close() 67 json.NewEncoder(f).Encode(token) 68} 69 70func main() { 71 ctx := context.Background() 72 b, err := os.ReadFile("credentials.json") 73 if err != nil { 74 log.Fatalf("Unable to read client secret file: %v", err) 75 } 76 config, err := google.ConfigFromJSON(b, gmail.MailGoogleComScope) 77 if err != nil { 78 log.Fatalf("Unable to parse client secret file to config: %v", err) 79 } 80 client := getClient(config) 81 82 srv, err := gmail.NewService(ctx, option.WithHTTPClient(client)) 83 if err != nil { 84 log.Fatalf("Unable to retrieve Gmail client: %v", err) 85 } 86 fmt.Println("Created Gmail service", srv) 87 //追記 88 msgStr := "From: 'me'\r\n" + 89 "reply-to: gmail.com\r\n" + //送信元 90 "To: gmail.com\r\n" + //送信先 91 "Subject:test\r\n" + 92 "\r\n" + "これはtestです" + 93 "attach: Desktop/test.png" 94 reader := strings.NewReader(msgStr) 95 transformer := japanese.ISO2022JP.NewEncoder() 96 msgISO2022JP, err := ioutil.ReadAll(transform.NewReader(reader, transformer)) 97 if err != nil { 98 log.Fatalf("Unable to convert to ISO2022JP: %v", err) 99 } 100 msg := []byte(msgISO2022JP) 101 message := gmail.Message{} 102 message.Raw = base64.StdEncoding.EncodeToString(msg) 103 _, err = srv.Users.Messages.Send("me", &message).Do() 104 if err != nil { 105 fmt.Printf("%v", err) 106 } 107} 108

プログラムやセットアップは
https://zenn.dev/happy663/articles/36a21fa960a0f8
こちらを参考にさせていたできました。
もちろん、この状態では、pathがテキストとして送られています。
わかる方いれば、教えてほしいです。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

MIMEについて学ぶとよいでしょう。

参考: https://www.mew.org/~kazu/doc/newsletter/3.html

実際のコードはここが参考になるかと。

投稿2022/11/29 23:13

nobonobo

総合スコア3367

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問