init
This commit is contained in:
65
README.txt
Normal file
65
README.txt
Normal file
@@ -0,0 +1,65 @@
|
||||
|
||||
AI Email Generator
|
||||
==================
|
||||
|
||||
This is a simple AI-powered Email Generator tool that helps users turn rough email drafts into polished emails.
|
||||
It uses OpenAI's GPT API (gpt-3.5-turbo) to generate emails in various tones and languages.
|
||||
|
||||
---
|
||||
|
||||
▶ FEATURES:
|
||||
- Choose between 3 Tones: Formal, Casual, Persuasive
|
||||
- Supports 25 Languages (English, Swedish, Spanish, French, German, etc.)
|
||||
- Copy email to clipboard
|
||||
- Save email as .txt file
|
||||
- Toggle Dark Mode for better readability
|
||||
|
||||
---
|
||||
|
||||
▶ INSTALLATION:
|
||||
1. Make sure your server has PHP 7.4+ and cURL enabled.
|
||||
2. Create an OpenAI API Key from:
|
||||
https://platform.openai.com/account/api-keys
|
||||
|
||||
3. Add your API key inside the `config.php` file like this:
|
||||
```php
|
||||
<?php
|
||||
return [
|
||||
'openai_api_key' => 'YOUR_OPENAI_API_KEY_HERE',
|
||||
];
|
||||
?>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
▶ USAGE:
|
||||
1. Open `index.php` in your browser.
|
||||
2. Paste your rough email draft.
|
||||
3. Select tone and language.
|
||||
4. Click “Generate Email”.
|
||||
5. Copy, save, or toggle dark mode as desired.
|
||||
|
||||
---
|
||||
|
||||
▶ FILES INCLUDED:
|
||||
- index.php → Main form page
|
||||
- process.php → Handles API requests and generates the email
|
||||
- style.css → Styling for the tool (with dark mode)
|
||||
- config.php → Configuration (API key)
|
||||
- home.php → landing page
|
||||
---
|
||||
|
||||
▶ NOTES:
|
||||
- You need an active OpenAI API Key with sufficient quota.
|
||||
- The tool works locally or on any PHP-compatible web server.
|
||||
- If the buyer wants to integrate this tool into an existing website or system,
|
||||
it is their responsibility to handle the integration. This tool is provided as a standalone solution.
|
||||
|
||||
---
|
||||
|
||||
▶ LICENSE:
|
||||
This project is provided "as is" for personal or commercial use.
|
||||
No liability is accepted for API costs or usage.
|
||||
|
||||
---
|
||||
|
||||
7
config.php
Normal file
7
config.php
Normal file
@@ -0,0 +1,7 @@
|
||||
<?php
|
||||
// config.php
|
||||
return [
|
||||
'openai_api_key' => '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',
|
||||
|
||||
];
|
||||
?>
|
||||
26
home.php
Normal file
26
home.php
Normal file
@@ -0,0 +1,26 @@
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>AI Email Generator</title>
|
||||
<link rel="stylesheet" href="style.css">
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<h1>AI Email Generator</h1>
|
||||
<p>Effortlessly craft polished, professional emails in seconds.</p>
|
||||
<a href="index.php"><button>Start Generating Emails</button></a>
|
||||
<button id="darkModeBtn">Toggle Dark Mode</button>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
const darkBtn = document.getElementById('darkModeBtn');
|
||||
if (darkBtn) {
|
||||
darkBtn.onclick = function () {
|
||||
document.body.classList.toggle('dark-mode');
|
||||
};
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
65
index.php
Normal file
65
index.php
Normal file
@@ -0,0 +1,65 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>AI Email Generator</title>
|
||||
<link rel="stylesheet" href="style.css">
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<h1>AI Email Generator</h1>
|
||||
<form action="process.php" method="POST">
|
||||
<label for="email_input">Your Rough Email:</label>
|
||||
<textarea name="email_input" id="email_input" rows="8" required></textarea>
|
||||
|
||||
<label for="tone">Select Tone:</label>
|
||||
<select name="tone" id="tone" required>
|
||||
<option value="formal">Formal</option>
|
||||
<option value="casual">Casual</option>
|
||||
<option value="persuasive">Persuasive</option>
|
||||
</select>
|
||||
|
||||
<label for="language">Select Language:</label>
|
||||
<select name="language" id="language" required>
|
||||
<option value="English">English</option>
|
||||
<option value="Swedish">Swedish</option>
|
||||
<option value="Spanish">Spanish</option>
|
||||
<option value="French">French</option>
|
||||
<option value="German">German</option>
|
||||
<option value="Italian">Italian</option>
|
||||
<option value="Portuguese">Portuguese</option>
|
||||
<option value="Dutch">Dutch</option>
|
||||
<option value="Norwegian">Norwegian</option>
|
||||
<option value="Danish">Danish</option>
|
||||
<option value="Finnish">Finnish</option>
|
||||
<option value="Polish">Polish</option>
|
||||
<option value="Czech">Czech</option>
|
||||
<option value="Hungarian">Hungarian</option>
|
||||
<option value="Greek">Greek</option>
|
||||
<option value="Turkish">Turkish</option>
|
||||
<option value="Russian">Russian</option>
|
||||
<option value="Chinese">Chinese</option>
|
||||
<option value="Japanese">Japanese</option>
|
||||
<option value="Korean">Korean</option>
|
||||
<option value="Arabic">Arabic</option>
|
||||
<option value="Hebrew">Hebrew</option>
|
||||
<option value="Hindi">Hindi</option>
|
||||
<option value="Thai">Thai</option>
|
||||
<option value="Vietnamese">Vietnamese</option>
|
||||
</select>
|
||||
|
||||
<button type="submit">Generate Email</button>
|
||||
<button id="darkModeBtn" type="button">Toggle Dark Mode</button>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
const darkBtn = document.getElementById('darkModeBtn');
|
||||
if (darkBtn) {
|
||||
darkBtn.onclick = function () {
|
||||
document.body.classList.toggle('dark-mode');
|
||||
};
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
117
process.php
Normal file
117
process.php
Normal file
@@ -0,0 +1,117 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>AI Email Generator - Result</title>
|
||||
<link rel="stylesheet" href="style.css">
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<?php
|
||||
// Load API key from config
|
||||
$config = include 'config.php';
|
||||
$apikey = $config['openai_api_key'];
|
||||
|
||||
// Sanitize and validate user inputs
|
||||
$emailInput = trim($_POST['email_input'] ?? '');
|
||||
$tone = $_POST['tone'] ?? '';
|
||||
$language = $_POST['language'] ?? 'English'; // Language selector
|
||||
|
||||
$allowedTones = [
|
||||
'formal' => 'Write this email in a formal tone',
|
||||
'casual' => 'Write this email in a casual tone',
|
||||
'persuasive' => 'Write this email in a persuasive tone',
|
||||
];
|
||||
|
||||
if (empty($emailInput) || !isset($allowedTones[$tone])) {
|
||||
die('Invalid Input.');
|
||||
}
|
||||
|
||||
// Improved Prompt with strict language response
|
||||
$prompt = $allowedTones[$tone] . ". Transform this rough text into a polished, professional email in " . $language . ". ONLY reply in " . $language . ":\n\n" . $emailInput;
|
||||
|
||||
// Prepare API request
|
||||
$apiurl = 'https://api.openai.com/v1/chat/completions';
|
||||
|
||||
$data = [
|
||||
'model' => 'gpt-3.5-turbo',
|
||||
'messages' => [
|
||||
['role' => 'user', 'content' => $prompt],
|
||||
],
|
||||
'max_tokens' => 500,
|
||||
'temperature' => 0.7,
|
||||
];
|
||||
|
||||
$headers = [
|
||||
'Content-Type: application/json',
|
||||
'Authorization: Bearer ' . $apikey,
|
||||
];
|
||||
|
||||
// Make API request
|
||||
$ch = curl_init();
|
||||
curl_setopt($ch, CURLOPT_URL, $apiurl);
|
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||||
curl_setopt($ch, CURLOPT_POST, true);
|
||||
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
|
||||
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
|
||||
|
||||
$response = curl_exec($ch);
|
||||
curl_close($ch);
|
||||
|
||||
// Handle response
|
||||
$result = json_decode($response, true);
|
||||
|
||||
if (isset($result['choices'][0]['message']['content'])) {
|
||||
$aiEmail = htmlspecialchars($result['choices'][0]['message']['content']);
|
||||
echo "<h2>Your AI-Generated Email:</h2>";
|
||||
echo "<div class='email-output'>";
|
||||
echo "<pre>$aiEmail</pre>";
|
||||
echo "<button id='copyBtn'>Copy Email</button>";
|
||||
echo "<button id='saveBtn'>Save Email as .txt</button>";
|
||||
echo "<button id='darkModeBtn'>Toggle Dark Mode</button>";
|
||||
echo "<a href='index.php' class='back-link'>← Generate Another Email</a>";
|
||||
echo "</div>";
|
||||
} else {
|
||||
echo "Error: Failed to generate email. Try again later.";
|
||||
}
|
||||
?>
|
||||
<div id="toast">Copied to clipboard ✔️</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
const copyBtn = document.getElementById('copyBtn');
|
||||
const saveBtn = document.getElementById('saveBtn');
|
||||
const darkBtn = document.getElementById('darkModeBtn');
|
||||
|
||||
if (copyBtn) {
|
||||
copyBtn.onclick = function () {
|
||||
const text = document.querySelector('pre').innerText;
|
||||
navigator.clipboard.writeText(text).then(() => {
|
||||
const toast = document.getElementById('toast');
|
||||
toast.classList.add('show');
|
||||
setTimeout(() => toast.classList.remove('show'), 2000);
|
||||
});
|
||||
return false;
|
||||
};
|
||||
}
|
||||
|
||||
if (saveBtn) {
|
||||
saveBtn.onclick = function () {
|
||||
const text = document.querySelector('pre').innerText;
|
||||
const blob = new Blob([text], { type: 'text/plain' });
|
||||
const link = document.createElement('a');
|
||||
link.href = URL.createObjectURL(blob);
|
||||
link.download = 'email.txt';
|
||||
link.click();
|
||||
return false;
|
||||
};
|
||||
}
|
||||
|
||||
if (darkBtn) {
|
||||
darkBtn.onclick = function () {
|
||||
document.body.classList.toggle('dark-mode');
|
||||
};
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
153
style.css
Normal file
153
style.css
Normal file
@@ -0,0 +1,153 @@
|
||||
/* Import Google Font */
|
||||
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap');
|
||||
|
||||
html {
|
||||
box-sizing: border-box;
|
||||
width: 100%;
|
||||
overflow-x: hidden;
|
||||
}
|
||||
|
||||
*, *::before, *::after {
|
||||
box-sizing: inherit;
|
||||
}
|
||||
|
||||
body {
|
||||
background-color: #f5f7fa;
|
||||
margin: 0;
|
||||
font-family: 'Inter', Arial, sans-serif;
|
||||
color: #333;
|
||||
min-height: 100vh;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
padding: 40px 20px;
|
||||
transition: background-color 0.3s ease, color 0.3s ease;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
body.dark-mode {
|
||||
background-color: #121212;
|
||||
color: #f5f5f5;
|
||||
}
|
||||
|
||||
.container {
|
||||
width: 100%;
|
||||
max-width: 600px;
|
||||
text-align: center;
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
form, .email-output {
|
||||
padding: 25px;
|
||||
background-color: #ffffff;
|
||||
border-radius: 12px;
|
||||
box-shadow: 0 8px 16px rgba(0, 0, 0, 0.1);
|
||||
margin-top: 20px;
|
||||
transition: background-color 0.3s ease, color 0.3s ease, transform 0.3s ease;
|
||||
}
|
||||
|
||||
body.dark-mode form,
|
||||
body.dark-mode .email-output {
|
||||
background-color: #1e1e1e;
|
||||
color: #f5f5f5;
|
||||
}
|
||||
|
||||
label {
|
||||
font-weight: bold;
|
||||
display: block;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
textarea, select {
|
||||
width: 100%;
|
||||
padding: 10px;
|
||||
border: 1px solid #ccc;
|
||||
border-radius: 4px;
|
||||
resize: vertical;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
button {
|
||||
background-color: #3498db;
|
||||
color: white;
|
||||
padding: 12px 20px;
|
||||
border: none;
|
||||
border-radius: 4px;
|
||||
cursor: pointer;
|
||||
font-size: 16px;
|
||||
transition: background-color 0.3s ease, transform 0.3s ease;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
button:hover {
|
||||
background-color: #2980b9;
|
||||
transform: translateY(-2px);
|
||||
}
|
||||
|
||||
button + button {
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
#copyBtn {
|
||||
background-color: #2ecc71;
|
||||
}
|
||||
|
||||
#copyBtn:hover {
|
||||
background-color: #27ae60;
|
||||
}
|
||||
|
||||
.back-link {
|
||||
display: inline-block;
|
||||
margin-top: 15px;
|
||||
color: #3498db;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.back-link:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
#toast {
|
||||
position: fixed;
|
||||
bottom: 20px;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
background-color: #2ecc71;
|
||||
color: white;
|
||||
padding: 12px 20px;
|
||||
border-radius: 8px;
|
||||
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
|
||||
transition: opacity 0.3s ease, visibility 0.3s ease;
|
||||
opacity: 0;
|
||||
visibility: hidden;
|
||||
pointer-events: none;
|
||||
z-index: 9999;
|
||||
}
|
||||
|
||||
#toast.show {
|
||||
opacity: 1;
|
||||
visibility: visible;
|
||||
}
|
||||
|
||||
@media (max-width: 600px) {
|
||||
.container {
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
form, .email-output {
|
||||
padding: 15px;
|
||||
}
|
||||
|
||||
button {
|
||||
padding: 10px;
|
||||
}
|
||||
}
|
||||
|
||||
.email-output button {
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
.email-output pre {
|
||||
white-space: pre-wrap;
|
||||
word-wrap: break-word;
|
||||
}
|
||||
Reference in New Issue
Block a user