cURLで困った時はこうする!?

汎用クライアントのcURLについてのチートシートのようなものです
覚え書き&使用例なので、詳細は本家のTips( https://curl.haxx.se/docs/ )を読むことをお勧めします。

- 使えるプロトコル

```
DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMB,
 SMBS, SMTP, SMTPS, Telnet and TFTP. curl supports SSL certificates, HTTP POST, HTTP PUT, FTP uploading,
 HTTP form based upload, proxies, HTTP/2, cookies, user+password 
 authentication (Basic, Plain, Digest, CRAM-MD5, NTLM, Negotiate and Kerberos)
```

# cURLにproxyを設定

コマンドラインで設定する

```
curl -U (ユーザ名):(パスワード) -x proxy.host.com:(ポート) -L https://www.google.com
```


設定ファイルで設定する

```
vi ~/.curlrc
※全ユーザの場合は/etc/curlrc

proxy-user = "(ユーザ名):(パスワード)"
proxy = "http://proxy.host.com:(ポート)"
```


# cURLでFTP(FTPにコマンドを渡すより楽)

Download

```
curl -u <user>:<password> ftp://<host>/<path to file>
```

Upload

```
curl -T <file> -u <user>:<password> ftp://<host>//<dir>
```

list

```
curl -u <user>:<password> ftp://<host>/<path to directory>
```

# cURLでHTTP[s]

Download

```
#単一ファイル
curl -O http://www.example.com/index.html

#連番
curl -O http://www.example.com/data[001-100].txt
```

Upload(PUT):WebDAVなんかの場合

```
curl -X PUT --user myuser:mypasswd http://www.upload.com/tofile -F "file=@/path/to/file.ext;type=image/jpg"
```

Upload(POST):アップロードフォームにポストする場合

```
curl -F "form_input_id=1" -F "form_file_comment=This is an image file" -F "image=@/local_path/filename.jpg" localhost/uploader.php
```

POST:URLエンコードしながらフォームにポストする場合

```
curl --data-urlencode "input_text=a&b" --data-urlencode "input_jp_text=あ" http://example.org/test.cgi
```

# SAMBAやWindows共有サーバ (smb/cifs) (cURL 7.33 以上)

Download

```
curl -u "domain\username:passwd" smb://サーバ名/パス/file.txt
```

Upload

```
curl -T アップするファイル名 -u "domain\username:passwd" smb://サーバ名/パス/
```

STDIN

```
cat "ファイル名" | curl -T - -u "domain\username:passwd" smb://サーバ名/パス/file.txt
```

# SMTP(s) (Mail Send)

```
curl smtp://example.com --mail-from 'from@example.com' --mail-rcpt 'to@example.com' -u 'username:password'  -T \
"From: 'xxxxx'
To: 'xxxxx'
Subject: I am cURL

NoHTTP(Not Only HTTP)
"
```

もしくは、

```
cat <<EOF | curl -v --url 'smtps://smtp.gmail.com:465' --mail-from 'from@example.com' --mail-rcpt 'to@example.com' --user 'username:password' -T -
From: 'xxxxx'
To: 'xxxxx'
Subject:  I am cURL

NoHTTP(Not Only HTTP)
EOF
```

ファイル(email-contents.txt)を本文にして送る場合

```
curl --connect-timeout 15 -v --insecure 'smtp://smtp.example.com:25' -u 'username:password' --mail-from 'from@example.com' --mail-rcpt 'to@example.com' -T email-contents.txt --ssl
```

# IMAP(s) (Mail Receive)

メールボックス確認

```
curl -u 'username:password' --url 'imaps://imap.gmail.com:993' -X 'EXAMINE INBOX'
```

一覧取得

```
curl -u 'username:password' --url 'imaps://imap.gmail.com:993/INBOX;'
```

未読/既読一覧取得

```
curl -u 'username:password' --url 'imaps://imap.gmail.com:993/INBOX' -X 'SEARCH UNSEEN'
curl -u 'username:password' --url 'imaps://imap.gmail.com:993/INBOX' -X 'SEARCH SEEN'
```

メールを読む

```
curl -u 'username:password' --url 'imaps://imap.gmail.com:993/INBOX;UID=(読みたいメールのUID);SECTION=TEXT' | nkf
※;SECTION=TEXTを外すとヘッダー込みのデータが、;SECTION=HEADERにするとヘッダーのみのデータを取得出来ます。

もしくは
curl -u 'username:password' --url 'imaps://imap.gmail.com:993/INBOX' -X 'FETCH (読みたいメールのUID) BODY[TEXT]' | nkf
```
※添付ファイルを取りだす場合、BODYからマルチパートを取りだす

削除フラグ

```
curl -u 'username:password' --url 'imaps://imap.gmail.com:993/INBOX' -X "STORE (メールのUID) +Flags \Deleted"
```

未読化(-Flags \Seen)/既読化(+Flags \Seen)

```
curl -u 'username:password' --url 'imaps://imap.gmail.com:993/INBOX' -X "STORE (メールのUID) -Flags \Seen"

curl -u 'username:password' --url 'imaps://imap.gmail.com:993/INBOX' -X "STORE (メールのUID) +Flags \Seen"
```

個人的に使うのがこのくらいだったので、他に使う機会が出たら随時追加していきます。