Initial commit, works on Linux.
This commit is contained in:
commit
f1ed198d59
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
dist
|
||||||
|
node_modules
|
11
README.md
Normal file
11
README.md
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
# Yandex Mail @ Desktop
|
||||||
|
|
||||||
|
This is unofficial and in any case unaffiliated electron wrapper around Yandex.Mail.
|
||||||
|
|
||||||
|
## Rationale
|
||||||
|
|
||||||
|
After using Yandex.Mail for almost a year I realized that there is absolutely no mail clients that can replace Yandex.Mail interface as it is pretty fast and nice. And sadly I failed to google already existing wrapper.
|
||||||
|
|
||||||
|
## Disclaimer
|
||||||
|
|
||||||
|
This wrapper isn't affiliated or connected or whatever with Yandex LLC. I'm not their employee.
|
BIN
assets/icons/icon.png
Normal file
BIN
assets/icons/icon.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 11 KiB |
BIN
assets/icons/unread.png
Normal file
BIN
assets/icons/unread.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 16 KiB |
7
index.html
Normal file
7
index.html
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
<html>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<webview id="yandexmail" preload="${__dirname}/renderer.js" src="https://mail.yandex.ru/" style="position:absolute;width:100%;height:100%;"></webview>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
101
main.js
Normal file
101
main.js
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
const { app, BrowserWindow, Menu, Tray } = require('electron')
|
||||||
|
const nativeImage = require('electron').nativeImage
|
||||||
|
const windowStateKeeper = require('electron-window-state');
|
||||||
|
var path = require('path');
|
||||||
|
const ipc = require('electron').ipcMain;
|
||||||
|
|
||||||
|
let mainWindow;
|
||||||
|
let tray = null;
|
||||||
|
|
||||||
|
let normalIcon = nativeImage.createFromPath(path.join(__dirname, "assets", "icons", "icon.png"));
|
||||||
|
let unreadIcon = nativeImage.createFromPath(path.join(__dirname, "assets", "icons", "unread.png"));
|
||||||
|
|
||||||
|
function createWindow() {
|
||||||
|
// Window state - load previous session data or fallback to default.
|
||||||
|
let mainWindowState = windowStateKeeper({
|
||||||
|
defaultWidth: 1000,
|
||||||
|
defaultHeight: 700
|
||||||
|
});
|
||||||
|
|
||||||
|
mainWindow = new BrowserWindow({
|
||||||
|
width: mainWindowState.width,
|
||||||
|
height: mainWindowState.height,
|
||||||
|
x: mainWindowState.x,
|
||||||
|
y: mainWindowState.y,
|
||||||
|
autoHideMenuBar: true,
|
||||||
|
titleBarStyle: 'hidden',
|
||||||
|
webPreferences: {
|
||||||
|
nodeIntegration: true,
|
||||||
|
nodeIntegrationInWorker: true,
|
||||||
|
contextIsolation: true,
|
||||||
|
webviewTag: false,
|
||||||
|
preload: path.resolve(__dirname, 'renderer.js')
|
||||||
|
}
|
||||||
|
});
|
||||||
|
mainWindowState.manage(mainWindow);
|
||||||
|
|
||||||
|
mainWindow.webContents.openDevTools();
|
||||||
|
mainWindow.loadURL('https://mail.yandex.ru/');
|
||||||
|
//mainWindow.loadFile(path.join(__dirname, "index.html"));
|
||||||
|
mainWindow.on('closed', function () {
|
||||||
|
mainWindow = null;
|
||||||
|
})
|
||||||
|
|
||||||
|
mainWindow.setIcon(normalIcon);
|
||||||
|
|
||||||
|
// Tray icon.
|
||||||
|
tray = new Tray(normalIcon);
|
||||||
|
const contextMenu = Menu.buildFromTemplate([
|
||||||
|
{ label: 'Open Yandex.Mail window', type: 'normal', click: showHideMainWindow },
|
||||||
|
{ label: '-', type: 'separator' },
|
||||||
|
{ label: 'Exit Yandex.Mail wrapper', type: 'normal', click: quitWrapper }
|
||||||
|
]);
|
||||||
|
tray.setTitle('Yandex.Mail');
|
||||||
|
tray.setToolTip('Yandex.Mail');
|
||||||
|
tray.setContextMenu(contextMenu);
|
||||||
|
tray.on('click', () => {
|
||||||
|
showHideMainWindow(null, mainWindow, null);
|
||||||
|
});
|
||||||
|
|
||||||
|
mainWindow.Notification = function (title, options) {
|
||||||
|
options.icon = unreadIcon;
|
||||||
|
notification = new Notification(title, options);
|
||||||
|
checkForUnreads();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
app.on('ready', createWindow);
|
||||||
|
|
||||||
|
app.on('window-all-closed', function () {
|
||||||
|
// On macOS it is common for applications and their menu bar
|
||||||
|
// to stay active until the user quits explicitly with Cmd + Q
|
||||||
|
if (process.platform !== 'darwin') {
|
||||||
|
quitWrapper();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
app.on('activate', function () {
|
||||||
|
// On macOS it's common to re-create a window in the app when the
|
||||||
|
// dock icon is clicked and there are no other windows open.
|
||||||
|
if (mainWindow === null) {
|
||||||
|
createWindow();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
ipc.on("has-unread", function () {
|
||||||
|
mainWindow.setIcon(unreadIcon);
|
||||||
|
tray.setImage(unreadIcon);
|
||||||
|
});
|
||||||
|
|
||||||
|
ipc.on("has-no-unread", function () {
|
||||||
|
mainWindow.setIcon(normalIcon);
|
||||||
|
tray.setImage(normalIcon);
|
||||||
|
})
|
||||||
|
|
||||||
|
function showHideMainWindow() {
|
||||||
|
mainWindow.isVisible() ? mainWindow.hide() : mainWindow.show();
|
||||||
|
}
|
||||||
|
|
||||||
|
function quitWrapper() {
|
||||||
|
app.quit();
|
||||||
|
}
|
38
package.json
Normal file
38
package.json
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
{
|
||||||
|
"name": "yandexmail-desktop",
|
||||||
|
"version": "0.1.0",
|
||||||
|
"description": "An Electron wrapper around Yandex.Mail",
|
||||||
|
"main": "main.js",
|
||||||
|
"scripts": {
|
||||||
|
"start": "electron ."
|
||||||
|
},
|
||||||
|
"repository": "https://gitlab.com/pztrn/yandexmail-desktop",
|
||||||
|
"keywords": [
|
||||||
|
"Electron",
|
||||||
|
"yandex",
|
||||||
|
"mail client",
|
||||||
|
"mail",
|
||||||
|
"yandex.mail"
|
||||||
|
],
|
||||||
|
"author": "Stanislav N. aka pztrn",
|
||||||
|
"license": "GPLv3",
|
||||||
|
"devDependencies": {
|
||||||
|
"electron": "^4.0.1",
|
||||||
|
"electron-builder": "^20.38.5"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"electron-window-state": "^5.0.3"
|
||||||
|
},
|
||||||
|
"build": {
|
||||||
|
"appId": "name.pztrn.yandexmail-desktop",
|
||||||
|
"productName": "Yandex.Mail Desktop",
|
||||||
|
"copyright": "Copyright (c) 2019, Stanislav N. aka pztrn",
|
||||||
|
"mac": {
|
||||||
|
"category": "name.pztrn.yandexmail-desktop"
|
||||||
|
},
|
||||||
|
"linux": {
|
||||||
|
"category": "Internet",
|
||||||
|
"icon": "./assets/icons/icon.png"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
13
renderer.js
Normal file
13
renderer.js
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
console.log(window);
|
||||||
|
var ipc = require("electron").ipcRenderer;
|
||||||
|
|
||||||
|
function checkForUnreads() {
|
||||||
|
unread = parseInt(document.title.split(" ")[0]);
|
||||||
|
if (unread > 0) {
|
||||||
|
ipc.send('has-unread');
|
||||||
|
} else {
|
||||||
|
ipc.send('has-no-unread');
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
setInterval(checkForUnreads, 1000);
|
178
yandex-mail-icon-unread.svg
Normal file
178
yandex-mail-icon-unread.svg
Normal file
@ -0,0 +1,178 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Creator: CorelDRAW X7 -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xml:space="preserve"
|
||||||
|
width="86.6986mm"
|
||||||
|
height="86.6986mm"
|
||||||
|
version="1.1"
|
||||||
|
style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd"
|
||||||
|
viewBox="0 0 8670 8670"
|
||||||
|
id="svg17"
|
||||||
|
sodipodi:docname="yandex-mail-icon-unread.svg"
|
||||||
|
inkscape:version="0.92.4 5da689c313, 2019-01-14"><metadata
|
||||||
|
id="metadata21"><rdf:RDF><cc:Work
|
||||||
|
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><sodipodi:namedview
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1"
|
||||||
|
objecttolerance="10"
|
||||||
|
gridtolerance="10"
|
||||||
|
guidetolerance="10"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:window-width="1920"
|
||||||
|
inkscape:window-height="1042"
|
||||||
|
id="namedview19"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="0.72021539"
|
||||||
|
inkscape:cx="163.83988"
|
||||||
|
inkscape:cy="163.83988"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="38"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="svg17" />
|
||||||
|
<defs
|
||||||
|
id="defs4">
|
||||||
|
<style
|
||||||
|
type="text/css"
|
||||||
|
id="style2">
|
||||||
|
<![CDATA[
|
||||||
|
.fil3 {fill:none}
|
||||||
|
.fil2 {fill:#EE0000}
|
||||||
|
.fil1 {fill:#F2C202}
|
||||||
|
.fil0 {fill:#FFCC02}
|
||||||
|
]]>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<filter
|
||||||
|
inkscape:label="Plaster Color"
|
||||||
|
inkscape:menu="Bumps"
|
||||||
|
inkscape:menu-tooltip="Colored plaster emboss effect"
|
||||||
|
style="color-interpolation-filters:sRGB;"
|
||||||
|
id="filter282"><feGaussianBlur
|
||||||
|
result="result10"
|
||||||
|
stdDeviation="5"
|
||||||
|
id="feGaussianBlur242" /><feGaussianBlur
|
||||||
|
in="SourceGraphic"
|
||||||
|
result="result4"
|
||||||
|
stdDeviation="1.5"
|
||||||
|
id="feGaussianBlur244" /><feBlend
|
||||||
|
mode="darken"
|
||||||
|
in2="result10"
|
||||||
|
id="feBlend246" /><feComposite
|
||||||
|
operator="atop"
|
||||||
|
in2="SourceGraphic"
|
||||||
|
result="result5"
|
||||||
|
id="feComposite248" /><feColorMatrix
|
||||||
|
type="saturate"
|
||||||
|
values="0"
|
||||||
|
result="result1"
|
||||||
|
in="result5"
|
||||||
|
id="feColorMatrix250" /><feComponentTransfer
|
||||||
|
result="component1"
|
||||||
|
in="result1"
|
||||||
|
id="feComponentTransfer258"><feFuncR
|
||||||
|
type="table"
|
||||||
|
tableValues="0 0.2 0.133333 0.3 0.4 0.333333 0.5 0.6 0.533333 0.7 0.8 0.733333 0.9 1 0.933333 1.1 1"
|
||||||
|
id="feFuncR252" /><feFuncG
|
||||||
|
type="table"
|
||||||
|
tableValues="0 0.2 0.133333 0.3 0.4 0.333333 0.5 0.6 0.533333 0.7 0.8 0.733333 0.9 1 0.933333 1.1 1"
|
||||||
|
id="feFuncG254" /><feFuncB
|
||||||
|
type="table"
|
||||||
|
tableValues="0 0.2 0.133333 0.3 0.4 0.333333 0.5 0.6 0.533333 0.7 0.8 0.733333 0.9 1 0.933333 1.1 1"
|
||||||
|
id="feFuncB256" /></feComponentTransfer><feFlood
|
||||||
|
flood-color="rgb(255,0,0)"
|
||||||
|
result="result2"
|
||||||
|
id="feFlood260" /><feBlend
|
||||||
|
in2="component1"
|
||||||
|
mode="screen"
|
||||||
|
result="result2"
|
||||||
|
in="result2"
|
||||||
|
id="feBlend262" /><feBlend
|
||||||
|
result="fbSourceGraphic"
|
||||||
|
mode="multiply"
|
||||||
|
in2="component1"
|
||||||
|
id="feBlend264" /><feColorMatrix
|
||||||
|
result="result2"
|
||||||
|
type="luminanceToAlpha"
|
||||||
|
in="fbSourceGraphic"
|
||||||
|
id="feColorMatrix266" /><feDiffuseLighting
|
||||||
|
lighting-color="#ffffff"
|
||||||
|
in="result2"
|
||||||
|
diffuseConstant="1"
|
||||||
|
result="result1"
|
||||||
|
surfaceScale="15"
|
||||||
|
id="feDiffuseLighting270"><feDistantLight
|
||||||
|
azimuth="31"
|
||||||
|
elevation="10"
|
||||||
|
id="feDistantLight268" /></feDiffuseLighting><feSpecularLighting
|
||||||
|
specularExponent="10"
|
||||||
|
in="result2"
|
||||||
|
result="result11"
|
||||||
|
surfaceScale="-15"
|
||||||
|
id="feSpecularLighting274"><feDistantLight
|
||||||
|
azimuth="225"
|
||||||
|
elevation="45"
|
||||||
|
id="feDistantLight272" /></feSpecularLighting><feComposite
|
||||||
|
operator="arithmetic"
|
||||||
|
k2="0.5"
|
||||||
|
k3="0.5"
|
||||||
|
in2="result1"
|
||||||
|
result="result12"
|
||||||
|
id="feComposite276" /><feComposite
|
||||||
|
in="result12"
|
||||||
|
in2="fbSourceGraphic"
|
||||||
|
result="result9"
|
||||||
|
operator="arithmetic"
|
||||||
|
k2="1"
|
||||||
|
k3="1"
|
||||||
|
id="feComposite278" /><feComposite
|
||||||
|
in2="SourceGraphic"
|
||||||
|
result="result7"
|
||||||
|
operator="in"
|
||||||
|
id="feComposite280" /></filter></defs>
|
||||||
|
<g
|
||||||
|
id="_871737424">
|
||||||
|
<polygon
|
||||||
|
style="fill:#ffcc02"
|
||||||
|
id="polygon7"
|
||||||
|
points="8670,7564 0,7564 0,1106 8670,1106 "
|
||||||
|
class="fil0" />
|
||||||
|
<path
|
||||||
|
style="fill:#f2c202"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path9"
|
||||||
|
d="M 0,7520 3858,4167 c 262,-229 694,-227 959,4 l 3853,3349 v 44 H 0 Z"
|
||||||
|
class="fil1" />
|
||||||
|
<path
|
||||||
|
style="fill:#ee0000"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path11"
|
||||||
|
d="M 8670,1129 4814,4617 c -263,239 -696,238 -961,-2 L 0,1129 v -23 h 8670 z"
|
||||||
|
class="fil2" />
|
||||||
|
</g><rect
|
||||||
|
style="fill:none"
|
||||||
|
y="0"
|
||||||
|
x="0"
|
||||||
|
id="rect14"
|
||||||
|
height="8670"
|
||||||
|
width="8670"
|
||||||
|
class="fil3" />
|
||||||
|
<circle
|
||||||
|
id="path20"
|
||||||
|
cx="6833.1357"
|
||||||
|
cy="5694.2798"
|
||||||
|
r="1726.6526"
|
||||||
|
style="fill:#37c837;stroke-width:26.45876122;filter:url(#filter282)" /></svg>
|
After Width: | Height: | Size: 5.1 KiB |
92
yandex-mail-icon.svg
Normal file
92
yandex-mail-icon.svg
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Creator: CorelDRAW X7 -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xml:space="preserve"
|
||||||
|
width="86.6986mm"
|
||||||
|
height="86.6986mm"
|
||||||
|
version="1.1"
|
||||||
|
style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd"
|
||||||
|
viewBox="0 0 8670 8670"
|
||||||
|
id="svg17"
|
||||||
|
sodipodi:docname="yandex-mail-icon.svg"
|
||||||
|
inkscape:version="0.92.4 5da689c313, 2019-01-14"><metadata
|
||||||
|
id="metadata21"><rdf:RDF><cc:Work
|
||||||
|
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><sodipodi:namedview
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1"
|
||||||
|
objecttolerance="10"
|
||||||
|
gridtolerance="10"
|
||||||
|
guidetolerance="10"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:window-width="1920"
|
||||||
|
inkscape:window-height="1042"
|
||||||
|
id="namedview19"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="0.72021539"
|
||||||
|
inkscape:cx="163.83988"
|
||||||
|
inkscape:cy="163.83988"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="38"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="svg17" />
|
||||||
|
<defs
|
||||||
|
id="defs4">
|
||||||
|
<style
|
||||||
|
type="text/css"
|
||||||
|
id="style2">
|
||||||
|
<![CDATA[
|
||||||
|
.fil3 {fill:none}
|
||||||
|
.fil2 {fill:#EE0000}
|
||||||
|
.fil1 {fill:#F2C202}
|
||||||
|
.fil0 {fill:#FFCC02}
|
||||||
|
]]>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</defs>
|
||||||
|
<g
|
||||||
|
id="_871737424">
|
||||||
|
<polygon
|
||||||
|
style="fill:#ffcc02"
|
||||||
|
id="polygon7"
|
||||||
|
points="8670,7564 0,7564 0,1106 8670,1106 "
|
||||||
|
class="fil0" />
|
||||||
|
<path
|
||||||
|
style="fill:#f2c202"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path9"
|
||||||
|
d="M 0,7520 3858,4167 c 262,-229 694,-227 959,4 l 3853,3349 v 44 H 0 Z"
|
||||||
|
class="fil1" />
|
||||||
|
<path
|
||||||
|
style="fill:#ee0000"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path11"
|
||||||
|
d="M 8670,1129 4814,4617 c -263,239 -696,238 -961,-2 L 0,1129 v -23 h 8670 z"
|
||||||
|
class="fil2" />
|
||||||
|
</g><rect
|
||||||
|
style="fill:none"
|
||||||
|
y="0"
|
||||||
|
x="0"
|
||||||
|
id="rect14"
|
||||||
|
height="8670"
|
||||||
|
width="8670"
|
||||||
|
class="fil3" />
|
||||||
|
<circle
|
||||||
|
id="path20"
|
||||||
|
cx="6612.7119"
|
||||||
|
cy="6429.0254"
|
||||||
|
r="1726.6526"
|
||||||
|
style="stroke-width:26.45876122;fill:none" /></svg>
|
After Width: | Height: | Size: 2.5 KiB |
Reference in New Issue
Block a user