# mutt-oauth2
[](https://www.python.org/)
[](https://pypi.org/project/mutt-oauth2/)
[](https://github.com/Tatsh/mutt-oauth2/tags)
[](https://github.com/Tatsh/mutt-oauth2/blob/master/LICENSE.txt)
[](https://github.com/Tatsh/mutt-oauth2/compare/v0.1.1...master)
[](https://github.com/Tatsh/mutt-oauth2/actions/workflows/qa.yml)
[](https://github.com/Tatsh/mutt-oauth2/actions/workflows/tests.yml)
[](https://coveralls.io/github/Tatsh/mutt-oauth2?branch=master)
[](https://mutt-oauth2.readthedocs.org/?badge=latest)
[](http://mypy-lang.org/)
[](https://github.com/pre-commit/pre-commit)
[](http://www.pydocstyle.org/en/stable/)
[](https://docs.pytest.org/en/stable/)
[](https://github.com/astral-sh/ruff)
[](https://pepy.tech/project/mutt-oauth2)
[](https://github.com/Tatsh/mutt-oauth2/stargazers)
[](https://bsky.app/profile/Tatsh.bsky.social)
[](https://hostux.social/@Tatsh)
This is an update of [Alexander Perlis' script](https://github.com/muttmua/mutt/blob/master/contrib/mutt_oauth2.py)
and conversion to a package. Instead of using GPG for token storage, this package uses Keyring.
## Installation
### Pip
```shell
pip install mutt-oauth2
```
## Usage
```plain
Usage: mutt-oauth2 [OPTIONS]
Obtain and print a valid OAuth2 access token.
Options:
-a, --authorize Manually authorise new tokens.
-d, --debug Enable debug logging.
-t, --test Test authentication.
-u, --username TEXT Keyring username.
-v, --verbose Enable verbose logging.
-h, --help Show this message and exit.
```
Start by calling `mutt-oauth2 -a`. Be sure to have your client ID and and client secret available.
### Scopes required
| Provider | Scopes |
| --------- | ------------------------------------------------------------------- |
| Gmail | Gmail API |
| Microsoft | offline_access IMAP.AccessAsUser.All POP.AccessAsUser.All SMTP.Send |
To support other accounts, use the `--username` argument with a unique string such as the account
email address.
Test the script with the `--test` argument.
### mutt configuration
Add the following to `muttrc`:
```plain
set imap_authenticators="oauthbearer:xoauth2"
set imap_oauth_refresh_command="/path/to/mutt-oauth2"
set smtp_authenticators=${imap_authenticators}
set smtp_oauth_refresh_command=${imap_oauth_refresh_command}
```
Raw data
{
"_id": null,
"home_page": "https://tatsh.github.io/mutt-oauth2/",
"name": "mutt-oauth2",
"maintainer": null,
"docs_url": null,
"requires_python": "<3.14,>=3.10",
"maintainer_email": null,
"keywords": "email, gmail, mutt, outlook",
"author": "Andrew Udvare",
"author_email": "audvare@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/e7/a7/d16bbead414435082fbed35f9dd7b73b74a6baf42eb19e43cbd62016fe7c/mutt_oauth2-0.1.1.tar.gz",
"platform": null,
"description": "# mutt-oauth2\n\n[](https://www.python.org/)\n[](https://pypi.org/project/mutt-oauth2/)\n[](https://github.com/Tatsh/mutt-oauth2/tags)\n[](https://github.com/Tatsh/mutt-oauth2/blob/master/LICENSE.txt)\n[](https://github.com/Tatsh/mutt-oauth2/compare/v0.1.1...master)\n[](https://github.com/Tatsh/mutt-oauth2/actions/workflows/qa.yml)\n[](https://github.com/Tatsh/mutt-oauth2/actions/workflows/tests.yml)\n[](https://coveralls.io/github/Tatsh/mutt-oauth2?branch=master)\n[](https://mutt-oauth2.readthedocs.org/?badge=latest)\n[](http://mypy-lang.org/)\n[](https://github.com/pre-commit/pre-commit)\n[](http://www.pydocstyle.org/en/stable/)\n[](https://docs.pytest.org/en/stable/)\n[](https://github.com/astral-sh/ruff)\n[](https://pepy.tech/project/mutt-oauth2)\n[](https://github.com/Tatsh/mutt-oauth2/stargazers)\n\n[](https://bsky.app/profile/Tatsh.bsky.social)\n[](https://hostux.social/@Tatsh)\n\nThis is an update of [Alexander Perlis' script](https://github.com/muttmua/mutt/blob/master/contrib/mutt_oauth2.py)\nand conversion to a package. Instead of using GPG for token storage, this package uses Keyring.\n\n## Installation\n\n### Pip\n\n```shell\npip install mutt-oauth2\n```\n\n## Usage\n\n```plain\nUsage: mutt-oauth2 [OPTIONS]\n\n Obtain and print a valid OAuth2 access token.\n\nOptions:\n -a, --authorize Manually authorise new tokens.\n -d, --debug Enable debug logging.\n -t, --test Test authentication.\n -u, --username TEXT Keyring username.\n -v, --verbose Enable verbose logging.\n -h, --help Show this message and exit.\n```\n\nStart by calling `mutt-oauth2 -a`. Be sure to have your client ID and and client secret available.\n\n### Scopes required\n\n| Provider | Scopes |\n| --------- | ------------------------------------------------------------------- |\n| Gmail | Gmail API |\n| Microsoft | offline_access IMAP.AccessAsUser.All POP.AccessAsUser.All SMTP.Send |\n\nTo support other accounts, use the `--username` argument with a unique string such as the account\nemail address.\n\nTest the script with the `--test` argument.\n\n### mutt configuration\n\nAdd the following to `muttrc`:\n\n```plain\nset imap_authenticators=\"oauthbearer:xoauth2\"\nset imap_oauth_refresh_command=\"/path/to/mutt-oauth2\"\nset smtp_authenticators=${imap_authenticators}\nset smtp_oauth_refresh_command=${imap_oauth_refresh_command}\n```\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Packaged, maintained version of contributed mutt_oauth2.py script.",
"version": "0.1.1",
"project_urls": {
"Documentation": "https://mutt-oauth2.readthedocs.org",
"Homepage": "https://tatsh.github.io/mutt-oauth2/",
"Issues": "https://github.com/Tatsh/mutt-oauth2/issues",
"Repository": "https://github.com/Tatsh/mutt-oauth2"
},
"split_keywords": [
"email",
" gmail",
" mutt",
" outlook"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "f590668632c79aa2c302618d887069e112c96e1df5568ce24e818350b98ada2b",
"md5": "7fd03c16a69c618f34de99e3717943d2",
"sha256": "b18c52b1e231e61612982158ada416c656d3c348a633cc93521ed7df4bc06369"
},
"downloads": -1,
"filename": "mutt_oauth2-0.1.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "7fd03c16a69c618f34de99e3717943d2",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": "<3.14,>=3.10",
"size": 10685,
"upload_time": "2025-07-30T23:28:37",
"upload_time_iso_8601": "2025-07-30T23:28:37.443852Z",
"url": "https://files.pythonhosted.org/packages/f5/90/668632c79aa2c302618d887069e112c96e1df5568ce24e818350b98ada2b/mutt_oauth2-0.1.1-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "e7a7d16bbead414435082fbed35f9dd7b73b74a6baf42eb19e43cbd62016fe7c",
"md5": "fdd66f4e66db1cfa8cb7f69a23904e27",
"sha256": "1defa486639e918cf1924c75b350d4261cec2d36dbab9fa290b7c8ca7c3dfcb4"
},
"downloads": -1,
"filename": "mutt_oauth2-0.1.1.tar.gz",
"has_sig": false,
"md5_digest": "fdd66f4e66db1cfa8cb7f69a23904e27",
"packagetype": "sdist",
"python_version": "source",
"requires_python": "<3.14,>=3.10",
"size": 15685,
"upload_time": "2025-07-30T23:28:38",
"upload_time_iso_8601": "2025-07-30T23:28:38.556777Z",
"url": "https://files.pythonhosted.org/packages/e7/a7/d16bbead414435082fbed35f9dd7b73b74a6baf42eb19e43cbd62016fe7c/mutt_oauth2-0.1.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-07-30 23:28:38",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "Tatsh",
"github_project": "mutt-oauth2",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "mutt-oauth2"
}