diff --git a/.gitignore b/.gitignore
index 633bf12..5ecadba 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,4 +2,8 @@ __pychache__/
TempMail/__pycache__/
build/
dist/
-*.egg-info/
\ No newline at end of file
+*.egg-info/
+
+.idea
+*.iml
+venv
\ No newline at end of file
diff --git a/README.md b/README.md
index f19c353..a1c4643 100644
--- a/README.md
+++ b/README.md
@@ -5,38 +5,49 @@
This repository is for the [TempMail.lol](https://tempmail.lol/) Python API.
+## Updating form v1
+The library is different from version 1.x.x. Please see Usage to learn more about the changes to
+the Python library.
+
## Installation
-Use this command in terminal.
+You can install the TempMail API using PIP:
```
pip install tempmail-lol
```
+## TempMail Plus (optional)
+
+Optionally, you can purchase time on a BananaCrumbs ID to get TempMail Plus. This includes higher rate limits, as well
+as some other features. For more info, see this page: https://tempmail.lol/pricing.html
+
## Usage
```python
-from TempMail import TempMail #imports everything from TempMail library
-import time #import time module
-
-inbox = TempMail.generateInbox() #returns an Inbox object with Email and Token
-
-print("Email Address: "+ inbox.address) #View output below
-print("Authorization Token: "+ inbox.token)
-
-#output:
-"""
- Email Address: m8h69n52824315@theeyeoftruth.com
- Authorization Token: RCfc1og1z1JzuN1mkXL2eFdAc_8uxSRAwcGhUoXuH26e7nnJMdVVtSxxasZLD9D2OHTKIjVEvLhK7S0K5QIanA
-"""
-
-while(True): #Infinite Loop
- emails = TempMail.getEmails(inbox) #Returns list of Email objects
- print(emails) # View output below
- time.sleep(30) #wait 30 sec
-
-#output:
-"""
- [Email (sender=ExampleEmail@gmail.com, recipient=d6inmp52824914@magicaljellyfish.com,
- subject=Subject line, body=Text Area, html=
Text Area
,
- date=1652824961713 )]
-"""
+from TempMail import TempMail
+
+# Create a new TempMail object
+tmp = TempMail()
+
+# If you have a BananaCrumbs ID, you can login using the constructor
+tmp = TempMail("24 number ID", "32 or 36 character token")
+
+# Generate an inbox
+inb = TempMail.generateInbox(tmp)
+
+# Generate an inbox using Community (formerly Rush) domains
+inb = TempMail.generateInbox(tmp, rush=True)
+
+# Generate an inbox using a specific normal/community domain
+inb = TempMail.generateInbox(tmp, rush=False, domain="cringemonster.com")
+
+# Check for emails
+emails = TempMail.getEmails(tmp, inbox=inb)
+
+# Check custom domains (requires TempMail Plus)
+custom_domain_emails = TempMail.checkCustomInbox(tmp, "example.com", "token given on website")
```
+
+## Custom Domain Keys
+Note that the token for custom inboxes is stored on your domain as a text record with a name of `_tmpml` and a sha512 hash.
+The token that you submit is the text pre-sha512. This helps disconnect a user's BananaCrumbs ID and the domain he/she owns.
+
diff --git a/TempMail/Email.py b/TempMail/Email.py
index 3a82fe5..7357fc9 100644
--- a/TempMail/Email.py
+++ b/TempMail/Email.py
@@ -1,5 +1,5 @@
"""
-Email class is used to store the email data which consists of
+Email class is used to store the email data which consists of
the sender, recipient, subject, body, html and date
"""
diff --git a/TempMail/TempMail.py b/TempMail/TempMail.py
index 9b9108d..787cae2 100644
--- a/TempMail/TempMail.py
+++ b/TempMail/TempMail.py
@@ -3,67 +3,130 @@
from TempMail.Email import Email
from TempMail.Inbox import Inbox
+
class TempMail:
global BASE_URL
BASE_URL = "https://api.tempmail.lol"
-
-
+
+ # class vars
+ auth_id = None
+ auth_token = None
+
+ # constructor
+ def __init__(self, auth_id=None, auth_token=None):
+ TempMail.auth_id = auth_id
+ TempMail.auth_token = auth_token
+
"""
Make a request to the tempmail.lol api with a given endpoint
The content of the request is a json string and is returned as a string object
"""
-
- def makeHTTPRequest(endpoint):
+
+ def makeHTTPRequest(self, endpoint):
headers = {
"User-Agent": "TempMailPythonAPI/1.0",
"Accept": "application/json"
}
- try:
- connection = requests.get(BASE_URL + endpoint, headers=headers)
- if connection.status_code >= 400:
- raise Exception("HTTP Error: " + str(connection.status_code))
- except Exception as e:
- print(e)
- return None
+
+ if TempMail.auth_id is not None and TempMail.auth_token is not None:
+ headers["X-BananaCrumbs-ID"] = TempMail.auth_id
+ headers["X-BananaCrumbs-MFA"] = TempMail.auth_token
+
+ connection = requests.get(BASE_URL + endpoint, headers=headers)
+
+ # Check some error codes
+ # This includes rate limits, auth errors, and server errors
+ if connection.status_code == 429: # Rate limit
+ raise Exception("TempMail Rate Limit: " + connection.text)
+ elif connection.status_code == 402: # No time left on account
+ raise Exception("BananaCrumbs ID has no time left. See https://tempmail.lol/pricing.html for more info")
+ elif 400 <= connection.status_code < 500: # Client error
+ raise Exception("HTTP Error: " + str(connection.status_code))
+ elif 500 <= connection.status_code < 600: # Server error
+ raise Exception("TempMail Server returned an error: " + str(
+ connection.status_code) + " " + connection.text + " please report this.")
response = connection.text
-
+
return response
"""
GenerateInbox will generate an inbox with an address and a token
and returns an Inbox object
> rush = False will generate a normal inbox with no rush (https://tempmail.lol/news/2022/08/03/introducing-rush-mode-for-tempmail/)
+ > domain = None will generate an inbox with a random domain
"""
- def generateInbox(rush = False):
- try :
- s = TempMail.makeHTTPRequest("/generate" + ("/rush" if rush else ""))
- except:
- print("Website responded with: "+ s)
+
+ def generateInbox(self, rush=False, domain=None):
+ url = "/generate"
+ # with rush mode: /generate/rush
+ # with domain: /generate/
+ # these two cannot be combined. If both are true, only rush will be used
+
+ if rush:
+ url = url + "/rush"
+ elif domain is not None:
+ url = url + "/" + domain
+
+ s = TempMail.makeHTTPRequest(self, url)
data = json.loads(s)
return Inbox(data["address"], data["token"])
-
"""
getEmail gets the emails from an inbox object
and returns a list of Email objects
"""
- def getEmails(inbox):
- s = TempMail.makeHTTPRequest("/auth/" + inbox.token)
+
+ def getEmails(self, inbox):
+ # if inbox is an instance of Inbox object, get the token, otherwise inbox is a string
+ if isinstance(inbox, Inbox):
+ token = inbox.token
+ else:
+ token = inbox
+
+ s = TempMail.makeHTTPRequest(self, "/auth/" + token)
data = json.loads(s)
- #Raise an exception if the token is invalid
+ # Raise an exception if the token is invalid
if "token" in s and "token" in data:
if data["token"] == "invalid":
raise Exception("Invalid Token")
- #if no emails are found, return an empty list
- #else return a list of email
- if data["email"] == None:
+ # if no emails are found, return an empty list
+ # else return a list of email
+ if data["email"] is None:
return ["None"]
else:
emails = []
for email in data["email"]:
- emails.append(Email(email["from"], email["to"], email["subject"], email["body"], email["html"], email["date"]))
+ # Some emails may not have html, so we will check for that
+ if "html" in email:
+ emails.append(
+ Email(email["from"], email["to"], email["subject"], email["body"], email["html"], email["date"]))
+ else:
+ emails.append(
+ Email(email["from"], email["to"], email["subject"], email["body"], None, email["date"]))
+ return emails
+
+ """
+ checkCustomInbox checks if there are any emails in a custom inbox
+ and returns a list of Email objects
+ > domain Required
+ > token Required
+ """
+ def checkCustomInbox(self, domain, token):
+ url = "/custom/" + token + "/" + domain
+
+ s = TempMail.makeHTTPRequest(self, url)
+ data = json.loads(s)
+
+ # There is no way to check if the token is invalid
+ # so we will just return an empty list if there are no emails
+ if data["email"] is None:
+ return []
+ else:
+ emails = []
+ for email in data["email"]:
+ emails.append(
+ Email(email["from"], email["to"], email["subject"], email["body"], email["html"], email["date"]))
return emails
-
diff --git a/setup.py b/setup.py
index c84c4a4..6c87fc4 100644
--- a/setup.py
+++ b/setup.py
@@ -5,23 +5,23 @@
here = os.path.abspath(os.path.dirname(__file__))
with codecs.open(os.path.join(here, "README.md"), encoding="utf-8") as fh:
- long_description = "\n" + fh.read()
+ long_description = "\n" + fh.read()
setup(name='tempmail-lol',
- version='1.1.0',
- description='A Python API for TempMail',
- author='Alex Torres',
- author_email='cloudbotsedc@gmail.com',
- url='https://github.com/tempmail-lol/api-python',
- packages=find_packages(),
- install_requires=['requests'],
- keywords=['python', 'video', 'api', 'tempmail'],
- classifiers=[
- "Development Status :: 1 - Planning",
- "Intended Audience :: Developers",
- "Programming Language :: Python :: 3",
- "Operating System :: Unix",
- "Operating System :: MacOS :: MacOS X",
- "Operating System :: Microsoft :: Windows",
- ]
- )
\ No newline at end of file
+ version='2.0.0',
+ description='A Python API for TempMail',
+ author='Alex Torres, Alexander Epolite',
+ author_email='cloudbotsedc@gmail.com',
+ url='https://github.com/tempmail-lol/api-python',
+ packages=find_packages(),
+ install_requires=['requests'],
+ keywords=['tempmail', 'api', 'lol', 'tempmail-lol', 'tempmail.lol', 'email', 'free'],
+ classifiers=[
+ "Development Status :: 1 - Planning",
+ "Intended Audience :: Developers",
+ "Programming Language :: Python :: 3",
+ "Operating System :: Unix",
+ "Operating System :: MacOS :: MacOS X",
+ "Operating System :: Microsoft :: Windows",
+ ]
+ )