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

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

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

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

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

OAuth 2.0

OAuth 2.0(Open Authorization 2.0)は、APIを通して保護されたリソース(サードパーティのアプリケーション)へアクセスする為のオープンプロトコルです。

SMTP

SMTP(Simple Mail Transfer Protocol)はIPネットワークでemailを伝送する為のプロトコルです。

Q&A

解決済

2回答

10016閲覧

【C#ストアアプリ】OAuth2.0を利用しSMTPメール送信

greentea_

総合スコア7

Gmail

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

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

OAuth 2.0

OAuth 2.0(Open Authorization 2.0)は、APIを通して保護されたリソース(サードパーティのアプリケーション)へアクセスする為のオープンプロトコルです。

SMTP

SMTP(Simple Mail Transfer Protocol)はIPネットワークでemailを伝送する為のプロトコルです。

0グッド

0クリップ

投稿2016/11/22 03:11

編集2016/11/22 03:13

###前提・実現したいこと
C#ストアアプリ用.NET Frameworkを用い(Windowsストアアプリ)、GmailやYahoo!メールなどでログインし
マルチアカウントでメールの送受信が可能なメーラーソフトを作成しています。

メールの送信(SMTP)にOAuth2.0での認証を考えているのですが、
OAuthに対応したSMTP送信の方法がなかなか見つからず困っています。

下記の通りGoogleでのアクセストークン、リフレッシュトークンの取得には成功しています。

取得したアクセストークンを用い、メールを送信する方法、ライブラリなどございましたらご教授のほどお願いいたします。

###該当のソースコード
/**
* リクエストトークンの取得
*/
private async void GetRequestToken()
{
string res;

var consumerKey = [CONSUMER KEY]; //認証に使うURL var callbackURL = [CALLBACK URL]; var requestTokenURL = "https://accounts.google.com/o/oauth2/auth"; var authorizeURL = "https://www.googleapis.com/auth/userinfo.profile email"; //パラメータをつくる string param = requestTokenURL + "?client_id=" + consumerKey + "&redirect_uri=" + callbackURL + "&scope=" + authorizeURL + "&approval_prompt=force" + "&response_type=code" + "&access_type=offline"; //認証ページにリダイレクト WebAuthenticationResult result = await WebAuthenticationBroker.AuthenticateAsync( WebAuthenticationOptions.None, new Uri(param), new Uri(callbackURL) ); //認証レスポンスを取得 if (result.ResponseStatus == WebAuthenticationStatus.Success) { res = result.ResponseData.ToString(); res = res.Substring(res.IndexOf("code=")+5); //アクセストークンの取得に進む GetAccessToken(res); } } /** * アクセストークンの取得 */ private async void GetAccessToken(string code) { var consumerKey = [CONSUMER KEY]; var consumerKeySecret = [CONSUMER SECRET]; var callbackURL = [CALLBACK URL]; var accessTokenURL = "https://accounts.google.com/o/oauth2/token"; var authorizeURL = "https://www.googleapis.com/auth/userinfo.profile email"; //Dictionaryオブジェクト Dictionary<string, string> param = new Dictionary<string, string>(); param["code"] = code; param["grant_type"] = "authorization_code"; param["redirect_uri"] = callbackURL; param["client_id"] = consumerKey; param["client_secret"] = consumerKeySecret; HttpClient httpClient = new HttpClient(); httpClient.MaxResponseContentBufferSize = int.MaxValue; HttpContent content = new FormUrlEncodedContent(param); var response = await httpClient.PostAsync(accessTokenURL, content);

//アクセストークン、リフレッシュトークンが含まれるデータが返る
string result = await response.Content.ReadAsStringAsync();

//テキスト成形 int A_first = (result.IndexOf("\"access_token\" : \"") + 18); int A_charcnt = result.IndexOf("\",\n \"expires_in\"") - A_first; int R_first = (result.IndexOf("\"refresh_token\" : \"") + 19); int R_chercnt = result.IndexOf("\",\n \"token_type\"") - R_first; AccessToken = result.Substring(A_first, A_charcnt); RefrashToken = result.Substring(R_first, R_chercnt); }

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

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

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

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

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

guest

回答2

0

MailKitというライブラリで簡単にSMTP送信できるみたいですがライセンスはわかりません。
http://stackoverflow.com/questions/24195508/smtp-and-oauth-2

あと、Gmailの場合もしかするとメールの設定をしていないとメール送信できないかもしれません。(AccessToken使ってればいけるのかもしれませんが)
https://support.google.com/mail/answer/7126229?visit_id=1-636154147692078370-1511659987&hl=ja&rd=1
※私は認証とか難しいことはわかりません。

投稿2016/11/22 12:42

Hey_CH

総合スコア437

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

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

0

ベストアンサー

こんにちは。

トークンまで取れてれば以下と同じ要領で、トークン渡してやれば出来るんじゃないでしょうか。(リンク先はAndroidJavaですが)
AndroidからOAuthトークンを利用してGMailを送る

で、ストアアプリ(UWPじゃなくて?)の場合はNuGetで有志のSMTPクライアントが公開されているようなのでそれを使う、もしくは改造すれば自分でSMTPソケットを実装しなくても簡単に出来るかもです。
SMTP client for WinRT and UWP

投稿2016/11/22 10:04

Tak1wa

総合スコア4791

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問