[Gmail API] Javaでメールをメールボックスに入れる(自分にメール送信)

Gmail API v1（Java）を使用して、
Gmailでメールをメールボックスに入れる方法
についてご紹介します。

メールボックスにメールを入れる方法は下記の２通りあります。

**・メールボックスに直接メールを入れる**
メールクライアントに介することなく、メールボックスに直接メールを入れます。
IMAPコマンドのAPPENDを実行した場合と同じ動きです。
(IMAP：メールサーバー側のメール受信に使用する機能)

**・SMTPサーバーを介してメールボックスにメールを入れる**
通常のメール送信と同様の流れでメールボックスにメールを入れます。
ただし、SPFチェックは行われません。
（SPF：電子メールの送信元ドメインが詐称されていないかを検査するための仕組み）

:::note info
APIを利用する環境の準備から始める場合や、コードを実行する際は、
[⧉[Gmail API] JavaでGmail APIを使う](https://qiita.com/doran/items/a078e966bfd93c4b19c2)
を参照ください。
:::

本文中の引数にある「メールアドレス」の指定は、
OAuth 2.0使用の場合は「me」（自身）と指定してください。
「me」は認証されたユーザーを示します。

|No|||目次|
|---|---|---|---|
|1|||[メールをメールボックスに入れる(INSERT)](#1-メールをメールボックスに入れるinsert)|
||1||[スコープ](#11-スコープ)|
||2||[実行](#12-実行)|
||3||[レスポンスの内容](#13-レスポンスの内容)|
|2|||[メールをメールボックスに入れる(IMPORT)](#2-メールをメールボックスに入れるimport)|
||1||[スコープ](#21-スコープ)|
||2||[実行](#22-実行)|
||3||[レスポンスの内容](#23-レスポンスの内容)|

## 1. メールをメールボックスに入れる(INSERT)
メールクライアントに介することなく、メールボックスに直接メールを入れます。

#### 1.1. スコープ
このAPIを実行するには、以下のいずれかのスコープを指定してください。
```
GmailScopes.MAIL_GOOGLE_COM
GmailScopes.GMAIL_MODIFY
GmailScopes.GMAIL_INSERT
```
[⧉[Gmail API] JavaでGmail APIを使う(2.2 Gmailインスタンスを取得)](https://qiita.com/doran/items/a078e966bfd93c4b19c2#22-gmailインスタンスを取得)
でスコープを指定してください。

#### 1.2. 実行
送信するMessageを生成してメールを送信します。

createMimeMessage()、createMessage()の説明は、
[⧉[Gmail API] Javaでメッセージ本文を作成する](https://qiita.com/doran/items/e5bff14b8de85f74ff8b)
を参照ください。
```java
public static void main(String[] args) throws Exception{
    Gmail gmail = getGmail();
    Gmail.Users users = gmail.users();
    Gmail.Users.Messages messages = users.messages();
    
    Map<String,String> files = new HashMap<>();
    files.put("添付ファイル名","添付ファイルパス");
    Message content = createMessage(createMimeMessage("Toメールアドレス","件名","本文",files));
    Gmail.Users.Messages.Insert insert = messages.insert("me",content);
    
    Message res = insert.execute();
    System.out.println(res);
}
```
##### 1.2.1. HTTPリクエスト

添付ファイルがない場合
POST:　https:\//gmail.googleapis.com/gmail/v1/users/{メールアドレス}/messages

添付ファイルがある場合
POST:　https:\//gmail.googleapis.com/upload/gmail/v1/users/{メールアドレス}/messages

が実行されます。

##### 1.2.2. クエリパラメータ
Gmail.Users.Messages.Insertのsetメソッドにより、クエリパラメータを追加できます。

|メソッド|引数|説明|
|---|---|---|
|setInternalDateSource|[InternalDateSource(enum)](#internaldatesource)|Gmail内部のメールの日付|
|setDeleted|Boolean|メールを完全に削除して、GoogleVaultの管理者のみに表示されるようにするか<br>GoogleWorkspaceのアカウントでのみ使用可能|

#### InternalDateSource

|定義値|内容|
|---|---|
|receivedTime|Gmailで受信した社内メールの日付を現在時刻|
|dateHeader|メールの「日付」ヘッダーに基づく内部メッセージ時間|

##### 1.2.3. リクエストボディ
Messageのsetメソッドにより、リクエストボディを設定できます。

Messageクラスのsetterの詳細は、
[⧉[Gmail API] Javaでメッセージ本文を作成する(Message)](https://qiita.com/doran/items/e5bff14b8de85f74ff8b#message)
を参照ください。

#### 1.3. レスポンスの内容

#### Message

|メソッド|戻り値|説明|
|---|---|---|
|getId|String|メッセージID|
|getThreadId|String|メッセージが属するスレッドID|
|getLabelIds|List\<String\>|このメッセージに適用されるラベルのIDのリスト|
|getSnippet|String|メッセージテキストの短い部分|
|getHistoryId|String|このメッセージを変更した最後の履歴レコードの ID|
|getInternalDate|Long|内部メッセージ作成タイムスタンプ(エポックミリ秒)|
|getPayload|[MessagePart](#messagepart)|メッセージ部分の解析された電子メール構造。
|getSizeEstimate|Integer|メッセージの推定サイズ(バイト単位)|
|getRaw|String|RFC2822形式で Base64URLエンコードされた文字列の電子メールメッセージ全体|

#### MessagePart

|メソッド|戻り値|説明|
|---|---|---|
|getPartId|String|メッセージ部分ID|
|getMimeType|String|メッセージ部分のMIMEタイプ|
|getFilename|String|添付ファイルのファイル名|
|getHeaders|List\<[MessagePartHeader](#messagepartheader)\>|メッセージ部分のヘッダーのリスト|
|getBody|[MessagePartBody](#messagepartbody)|メッセージ部分の本文|
|getParts|List\<[MessagePart](#messagepart)\>|子のMIMEメッセージ部分|

#### MessagePartHeader

|メソッド|戻り値|説明|
|---|---|---|
|getName|String|セパレータの前のヘッダーの名前|
|getValue|String|区切り文字の後のヘッダーの値|

#### MessagePartBody

|メソッド|戻り値|説明|
|---|---|---|
|getAttachmentId|String|添付ファイルID|
|getSize|Integer|メッセージ部分データのバイト数|
|getData|String|MIME メッセージ部分の本文データ(base64 url エンコード文字列)|

## 2. メールをメールボックスに入れる(IMPORT)
通常のメール送信と同様の流れでメールボックスにメールを入れます。

#### 2.1. スコープ
このAPIを実行するには、以下のいずれかのスコープを指定してください。
```
GmailScopes.MAIL_GOOGLE_COM
GmailScopes.GMAIL_MODIFY
GmailScopes.GMAIL_INSERT
```
[⧉[Gmail API] JavaでGmail APIを使う(2.2 Gmailインスタンスを取得)](https://qiita.com/doran/items/a078e966bfd93c4b19c2#22-gmailインスタンスを取得)
でスコープを指定してください。

#### 2.2. 実行
送信するMessageを生成してメールを送信します。

送信元(From)は必須になります。
指定していない場合はエラーになります。

createMimeMessage()、createMessage()の説明は、
[⧉[Gmail API] Javaでメッセージ本文を作成する](https://qiita.com/doran/items/e5bff14b8de85f74ff8b)
を参照ください。
```java
public static void main(String[] args) throws Exception{
    Gmail gmail = getGmail();
    Gmail.Users users = gmail.users();
    Gmail.Users.Messages messages = users.messages();
    
    Map<String,String> files = new HashMap<>();
    files.put("添付ファイル名","添付ファイルパス");
    Message content = createMessage(createMimeMessage("Toメールアドレス","件名","本文",files));
    Gmail.Users.Messages.GmailImport gmailImport = messages.gmailImport("me",content);
    
    Message res = gmailImport.execute();
    System.out.println(res);
}
```
##### 2.2.1. HTTPリクエスト

添付ファイルがない場合
POST:　https:\//gmail.googleapis.com/gmail/v1/users/{メールアドレス}/messages/import

添付ファイルがある場合
POST:　https:\//gmail.googleapis.com/upload/gmail/v1/users/{メールアドレス}/messages/import

が実行されます。

##### 2.2.2. クエリパラメータ
Gmail.Users.Messages.GmailImportのsetメソッドにより、クエリパラメータを追加できます。

|メソッド|引数|説明|
|---|---|---|
|setInternalDateSource|[InternalDateSource(enum)](#internaldatesource)|Gmail内部のメールの日付|
|setDeleted|Boolean|メールを完全に削除して、GoogleVaultの管理者のみに表示されるようにするか<br>GoogleWorkspaceのアカウントでのみ使用可能|
|setNeverMarkSpam|Boolean|Gmailの迷惑メール分類基準を無視し、迷惑メールに分類しないようにするか|
|setProcessForCalendar|Boolean|メールに含まれるカレンダーの招待状を処理し、Googleカレンダーに追加するか|

##### 2.2.3. リクエストボディ
Messageのsetメソッドにより、リクエストボディを設定できます。

Messageクラスのsetterの詳細は、
[⧉[Gmail API] Javaでメッセージ本文を作成する(Message)](https://qiita.com/doran/items/e5bff14b8de85f74ff8b#message)
を参照ください。

#### 2.3. レスポンスの内容

#### Message

[2.3. レスポンスの内容(Message)](#message)と同じです。

<br>
<br>
おしまい。。