[無料配布] Gmailのエイリアスを自動作成するツールを無料で使えるAIのPhindにコード生成してもらった!
アカウント作成や登録時に使うGmailでの エイリアス/サブアド/捨てアド を作りたい人向けです。
受信を想定しているので送信のための+でのエイリアス登録機能はないです。
知らない人がいると思うので一応言っておくと、サービスサイトによってはGmailのエイリアスは拒否するところも結構あるので予め3個くらいは確認したほうがいいです。
ソースコードとファイルは最下部です。
通信は一切行わずにオフラインで使えます。
javascriptはオフはだめです。
スマホでの動作確認はしてませんけど普通に余裕で使えるはず。
基本の話し
Gmailのエイリアスはこうなってます。
([^.](?=[^\s@]*@g(oogle)?mail\.com))/g基本のメアドexample@gmail.comに対して
ドットでe.xample@gmail.comとかe.xa.m.ple@gmail.comとかとでき、
プラスでexample+moge@gmail.comとかexample+piyo@gmail.comとかとできる。
さらに@gmail.comを@googlemail.comにもできる。
んでこれら全てはexample@gmail.comで受信する。
noteとかの目線ではexample@gmail.comと上記のようなexample+piyo@gmail.comとかは別のメアドに見える。
昔は裏ワザで今はプチ情報の@googlemail.comは大昔にイギリスで使われてた名残で今も使える。
当然ながら昔から不正で使われ続けてもいるので、サービスサイト側では対策方法もあり導入されてる場合もある。ただしエイリアス◯個までは認めるとかちょっと緩くしてたりもする。
経緯をだらだらと書いとく
とあるサービスのフォロワーを水増しするのにメアドが大量に必用になったので適当に作り始めたのがきっかけです。
最初はPythonで作ろうかと思ったのですが「実行環境に依存しないほうがいいなぁ」「自分以外も使う可能性あるなぁ」と思い、JavaScriptくんがガンバルHTMLファイルひとつの構成です。
最初は下記画像のように自分で手入力で作ろうと思ったのですがめんどくなりました。
VSCodeに入っているCodeiumでやろうと思ったら金の亡者になってたので、無料で登録不要で使えてコーディングにおいてはGPT-4を超える能力だと言われる言語AIのPhindに作ってもらおうと思いました。
PhindはAI検索エンジンです。
VSCodeの拡張もある(サインインが必用)
ブラウザからだと超気楽に使えるので今回はブラウザで逝きました。
Phindの使い方をダラダラ書く気はありませんが少しだけ。
日本語でおk。返事も日本語。
無料でもすこしは調整できる。
入力内容を覚えてて次に活かしてくれる。
アホかコイツってなったらトップページに再度行けば内容リセット。
6000文字くらいが限界っぽい。
んで100文字くらいの内容で「Gmailのエイリアスを自動作成するHTMLツールを作って」とお願いしたら2分くらいで作ってくれた。
なんだかんだで5分もかからずにコレならええやん。
コレは逝ける!と思ったので3回くらい手直しして20分くらいでできた完成版がこれ。
あ〜便利っ♪
そういえば、ソースのチェックは全くしてません。
手直しゼロの産まれたままでアップしてあります。
仕様は
入力できるのは半角英数字で6文字から30文字まで
ドット[.]は1つから5つまで全て使い全パターン作成する
ドットの数ごとに背景色が変わるので見やすい
※ベースのメールアドレスが長いととんでもない量が作成される
メアドが20文字だと生成数:16663になるプラス[+]を使用したエイリアスは、3文字から6文字までランダムな文字数でランダムな半角小文字で作成される
作成後に自動で文字数の少ない順でソートされるコピーボタンを押せば一括コピー
追加すれば良かった機能
・CSVやJSON形式でエクスポートするのつければよかった、と今さらきづいたorz
・プラス[+]を使用で生成される文字列は、「英字のみ」「数字のみ」「英数字」と選択できるようにする。同時に文字数の幅を任意で決められるようにもする。
他になんかあるかな?Outlook版もつくってもらうか?
Phindで生成されたHTMLファイルはこちら
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Gmailエイリアス生成</title>
<style>
/* 基本スタイル */
body {
font-family: system-ui, -apple-system, sans-serif;
margin: 0;
padding: 20px;
background-color: #f5f5f5;
color: #333;
}
/* ヘッダー */
header {
margin: var(--margin-xxl, 2rem);
text-align: center;
}
header h1 {
font-size: 3em;
font-weight: 600;
margin: 0;
}
header p {
width: 40%;
margin: 0 auto;
color: var(--dark-600, #666);
}
/* メインコンテンツ */
.container {
max-width: 600px;
margin: 0 auto;
padding: 20px;
border-radius: 10px;
background-color: white;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
}
/* 入力フォームとボタン */
.input-group {
display: flex;
gap: 15px;
margin-bottom: 20px;
}
input[type="text"] {
flex: 1;
padding: 12px;
border: 2px solid #ddd;
border-radius: 6px;
font-size: 16px;
}
.generate-btn {
padding: 12px 24px;
background-color: #2196f3;
color: white;
border: none;
border-radius: 6px;
cursor: pointer;
}
/* ラジオボタン */
.radio-group {
display: flex;
gap: 20px;
margin-bottom: 20px;
align-items: center;
}
.radio-item {
display: flex;
align-items: center;
gap: 8px;
}
/* 結果表示 */
#result-container {
position: relative;
margin-top: 20px;
padding: 15px;
border-radius: 6px;
min-height: 60px;
background-color: #f8f9fa;
}
/* 上部ボタングループ */
.top-controls {
position: absolute;
top: 12px;
right: 12px;
display: flex;
gap: 8px;
}
/* カウント表示 */
.count-info {
padding: 4px 8px;
background-color: #eee;
color: #666;
border: 1px solid #ddd;
border-radius: 4px;
font-size: 0.8em;
}
/* コピーボタン */
.copy-btn {
padding: 4px 8px;
background-color: #eee;
color: #666;
border: 1px solid #ddd;
border-radius: 4px;
cursor: pointer;
font-size: 0.8em;
}
/* 再生成ボタン */
.regenerate-btn {
padding: 4px 8px;
background-color: #42a5f5;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
font-size: 0.8em;
}
/* メールアドレス表示 */
.email-item {
padding: 8px;
margin: 4px 0;
border-radius: 4px;
font-size: 0.9em;
}
.email-item.dot-1 { background-color: #e3f2fd; }
.email-item.dot-2 { background-color: #e8eaf6; }
.email-item.dot-3 { background-color: #f3e5f5; }
.email-item.dot-4 { background-color: #fff3e0; }
.email-item.dot-5 { background-color: #fbe9e7; }
.email-item.dot-6 { background-color: #e8f5e9; }
/* メインメールアドレス表示 */
.main-email-display {
font-size: 1.5em;
font-weight: bold;
color: #2196f3;
margin: 15px 0;
padding: 10px;
background-color: #f8f9fa;
border-radius: 6px;
}
/* レスポンシブデザイン */
@media (max-width: 480px) {
header h1 {
font-size: 2em;
}
header p {
width: 100%;
}
.container {
padding: 15px;
}
.input-group {
flex-direction: column;
gap: 10px;
}
.radio-group {
flex-direction: column;
gap: 10px;
}
.top-controls {
flex-direction: column;
gap: 4px;
}
.main-email-display {
font-size: 1.2em;
}
}
</style>
</head>
<body>
<header>
<h1>Gmailエイリアス生成</h1>
<p>
半角英数字で6文字から30文字までを入力してください。<br />
ドットは1つから5つまで使われます。<br />
プラスは3文字から6文字のランダム英字です。
</p>
</header>
<div class="container">
<!-- メインフォーム -->
<div class="input-group">
<input type="text" id="username" placeholder="@より前を入力してください" maxlength="30">
<button class="generate-btn" onclick="generateAliases()">作成</button>
</div>
<!-- メインメールアドレス表示領域 -->
<div id="main-email-display" class="main-email-display"></div>
<!-- オプションラジオボタン -->
<div class="radio-group">
<label class="radio-item">
<input type="radio" name="alias-type" id="use-dot" value="dot" checked>
ドット . を使用
</label>
<label class="radio-item">
<input type="radio" name="alias-type" id="use-plus" value="plus">
プラス + を使用
</label>
</div>
<!-- ドメイン切り替えチェックボックス -->
<div class="radio-group">
<label class="radio-item">
<input type="radio" name="domain-type" id="use-gmail" value="gmail" checked onchange="toggleDomain()">
@gmail.com
</label>
<label class="radio-item">
<input type="radio" name="domain-type" id="use-googlemail" value="googlemail" onchange="toggleDomain()">
@googlemail.com
</label>
</div>
<!-- 結果表示領域 -->
<div id="result-container"></div>
</div>
<script>
// ドメインの状態管理
let currentDomain = 'gmail';
// メインメールアドレスの表示を更新
function updateMainEmailDisplay() {
const usernameInput = document.getElementById('username').value;
const display = document.getElementById('main-email-display');
if (usernameInput) {
display.textContent = `${usernameInput}@${currentDomain}.com`;
} else {
display.textContent = '';
}
}
// 入力値が変更されたときの処理
document.getElementById('username').addEventListener('input', updateMainEmailDisplay);
// ランダムな小文字を生成する関数
function generateRandomLowercase(length) {
const lowercaseLetters = 'abcdefghijklmnopqrstuvwxyz';
return Array.from(
{ length },
() => lowercaseLetters[Math.floor(Math.random() * lowercaseLetters.length)]
).join('');
}
// ランダムな長さ(3-6)のランダムな文字列を生成する関数
function generateRandomString() {
const randomLength = Math.floor(Math.random() * 4) + 3; // 3から6までの乱数
return generateRandomLowercase(randomLength);
}
// メールアドレスの文字数を取得する関数
function getPlusLength(email) {
const plusIndex = email.indexOf('+');
if (plusIndex === -1) return 0;
return email.slice(plusIndex + 1).split('@')[0].length;
}
// エイリアス生成関数
function generateAliases() {
const usernameInput = document.getElementById('username').value;
const resultContainer = document.getElementById('result-container');
// 入力値の検証
if (!usernameInput || usernameInput.length < 6 || usernameInput.length > 30) {
alert('6文字以上30文字以下で入力してください');
return;
}
// 半角英数字チェック
if (!/^[a-zA-Z0-9]+$/.test(usernameInput)) {
alert('半角英数字のみ使用可能です');
return;
}
const aliases = [];
const useDot = document.getElementById('use-dot').checked;
const usePlus = document.getElementById('use-plus').checked;
// プラスバリエーションを追加
if (usePlus) {
while (aliases.length < 20) {
const randomString = generateRandomString();
const email = `${usernameInput}+${randomString}@${currentDomain}.com`;
if (!aliases.includes(email)) {
aliases.push(email);
}
}
// プラスの後に付加される文字列の長さでソート
aliases.sort((a, b) => getPlusLength(a) - getPlusLength(b));
}
// ドットバリエーションを追加
else if (useDot) {
const dotVariations = generateDotVariations(usernameInput);
aliases.push(...dotVariations.map(v => `${v}@${currentDomain}.com`));
}
// 結果を表示
resultContainer.innerHTML = `
<div class="top-controls">
<div class="count-info">生成数: ${aliases.length}</div>
<button class="copy-btn" onclick="copyAliases()">コピー</button>
<button class="regenerate-btn" onclick="generateAliases()">再生成</button>
</div>
${aliases.map((alias, index) => {
const dotCount = (alias.match(/\./g) || []).length;
return `<div class="email-item dot-${dotCount}">${alias}</div>`;
}).join('')}
`;
}
// ドットバリエーション生成関数
function generateDotVariations(username) {
const variations = [];
const n = username.length;
// 1つのドットの場合
for (let i = 1; i < n; i++) {
variations.push(username.slice(0, i) + '.' + username.slice(i));
}
// 2つのドットの場合
for (let i = 1; i < n - 1; i++) {
for (let j = i + 1; j < n; j++) {
variations.push(
username.slice(0, i) + '.' +
username.slice(i, j) + '.' +
username.slice(j)
);
}
}
// 3つのドットの場合
for (let i = 1; i < n - 2; i++) {
for (let j = i + 1; j < n - 1; j++) {
for (let k = j + 1; k < n; k++) {
variations.push(
username.slice(0, i) + '.' +
username.slice(i, j) + '.' +
username.slice(j, k) + '.' +
username.slice(k)
);
}
}
}
// 4つのドットの場合
for (let i = 1; i < n - 3; i++) {
for (let j = i + 1; j < n - 2; j++) {
for (let k = j + 1; k < n - 1; k++) {
for (let l = k + 1; l < n; l++) {
variations.push(
username.slice(0, i) + '.' +
username.slice(i, j) + '.' +
username.slice(j, k) + '.' +
username.slice(k, l) + '.' +
username.slice(l)
);
}
}
}
}
// 5つのドットの場合
for (let i = 1; i < n - 4; i++) {
for (let j = i + 1; j < n - 3; j++) {
for (let k = j + 1; k < n - 2; k++) {
for (let l = k + 1; l < n - 1; l++) {
for (let m = l + 1; m < n; m++) {
variations.push(
username.slice(0, i) + '.' +
username.slice(i, j) + '.' +
username.slice(j, k) + '.' +
username.slice(k, l) + '.' +
username.slice(l, m) + '.' +
username.slice(m)
);
}
}
}
}
}
return variations;
}
// ドメイン切り替え機能
function toggleDomain() {
currentDomain = document.querySelector('input[name="domain-type"]:checked').value;
updateMainEmailDisplay();
generateAliases();
}
// コピー機能
function copyAliases() {
const resultContainer = document.getElementById('result-container');
const text = Array.from(resultContainer.getElementsByClassName('email-item'))
.map(div => div.textContent)
.join('\n');
navigator.clipboard.writeText(text).then(() => {
const copyBtn = document.querySelector('.copy-btn');
const originalText = copyBtn.textContent;
copyBtn.textContent = 'コピー完了!';
setTimeout(() => {
copyBtn.textContent = originalText;
}, 2000);
}).catch(err => {
alert('コピーに失敗しました:' + err);
});
}
// 初期表示の設定
updateMainEmailDisplay();
</script>
</body>
</html>ファイルのダウンロードはこちら
おわりに
まぁじでノーコード時代っすね。
ブラウザからのPhindで十分いけそう。
ただまぁ、ノーコード時代とはいえAIが答えをくれるわけではなく、あくまでも人間のサポートの領域は出てないですね。
当然なんだけどChatGPTに「お金の稼ぎかた教えて」とか「1億円を手に入れる方法を教えて」ってきいてもゴミ内容で笑ってしまったw
つまりAIを使う側の人間自体にキーワードを含むリテラシーや論理的思考や相関関係の把握などが備わっていないと相応の質で応えてくる。
まさにAIとトバシは使いようですね。


コメント
2正規表現はこれが答えかな?
^[a-zA-Z][-_.a-zA-Z0-9]{5,29}@g(oogle)?mail.com$
はじめまして
30文字だといつまで待っても制作されません
29文字までなら6~7秒で生成数: 122437個が出来上がります
ドット . を使用 で
@gmail.com
@googlemail.com どちらも反応無しでした