1 (изменено: Rumata, 2012-05-24 23:42:50)

Тема: JScript: Отправка почты с помощью CDO.Message

Захотелось поиграться с отправкой почты скриптом, без внешних утилит. Приглашаю всех заинтересованных и любопытствующих к тестированию. Критика и пожелания к расширению приветствуются. Кое-что получилось - почта отправляется, принимается. Можно прикреплять файлы, указывать различные параметры и дополнительные заголовки сообщений (уведомление о доставке, прочтении, важность письма и прочие).

Интерфейс прост - все писалось с упором на простоту использования. Так как это всего лишь обертка вокруг компонента, то не все возможности компонента реализованы в интерфейсе. Кое-то можно реализовать и вручную. Если будет интерес и модуль востребован, работы можно будет продолжить, а функционал компонента добавить в методы класса. Опять же с целью упрощения взаимодействия.

Также добавлены еще три обертки - для наиболее популярных у нас в России почтовых служб Mail.Ru, Yandex, и GMail.

Во всех примерах используется для отправки GMail. Аналогично работают и другие. Необходимо указать правильные параметры: авторизация, использование SSL и прочие. Для своих тестов замените username, password на реальные значения ваших почтовых ящиков, а также исправьте smtpserver, smtpserverport в случае использования вами другой службы, отличной от GMail. Значение recipient может быть таким же как и username. В таком случае письмо просто придет к вам же.

Общий пример отправки почты. Используется GMail. Все параметры указаны явно.


// логин и пароль для авторизации на сервере gmail
// логин также используется в качестве поля From
var username = 'login@gmail.com';
var password = 'password';

// адрес получателя
var recepient = 'login@gmail.com';

var mailer = new Mail({
	sendusing: 2, 
	smtpusessl: true, 
	smtpauthenticate: 1, 
	smtpserver: 'smtp.gmail.com', 
	smtpserverport: 465, 
	sendusername: username, 
	sendpassword: password
});

mailer.send({
	from: username, 
	to: recepient, 
	subject: 'Тестовое письмо', 
	textbody: 'Это письмо отправлено скриптом через почтовую службу GMail'
});

.
То же самое. Используется обертка Mail.GMail


// логин и пароль для авторизации на сервере gmail
// логин также используется в качестве поля From
var username = 'login@gmail.com';
var password = 'password';

// адрес получателя
var recepient = 'login@gmail.com';

var mailer = new Mail.GMail({
	sendusername: username, 
	sendpassword: password
});

mailer.send({
	from: username, 
	to: recepient, 
	subject: 'Тестовое письмо', 
	textbody: 'Это письмо отправлено скриптом через почтовую службу GMail'
});

.
Отправка почты с прикрепленным файлом


// логин и пароль для авторизации на сервере gmail
// логин также используется в качестве поля From
var username = 'login@gmail.com';
var password = 'password';

// адрес получателя
var recepient = 'login@gmail.com';

var mailer = new Mail.GMail({
	sendusername: username, 
	sendpassword: password
});

var filename = 'C:\\Windows\\System32\\drivers\etc\\lmhosts.sam';
mailer.addAttachment(filename);

mailer.send({
	from: username, 
	to: recepient, 
	subject: 'Письмо с вложением', 
	textbody: 'К письму прикреплен один файл'
});

.
Исходный код без комментариев.
Полный текст расположен по адресу http://code.google.com/p/jsxt/source/br … 32/Mail.js


//
// Mail.js
// Extension to simplify sending of e-mails via CDO.Message
//
// Copyright (c) 2012 by Ildar Shaimordanov
//

function Mail(options)
{
	this.driver = new ActiveXObject('CDO.Message');
	this.configure(options);
};

(function()
{

var fieldsUpdate = function(fields, prefix, options)
{
	for (var p in options) {
		if ( ! p || ! options.hasOwnProperty(p) ) {
			continue;
		}
		fields.Item(prefix + p) = options[p];
	}

	fields.Update();
};

Mail.prototype.configure = function(options)
{
	fieldsUpdate(
		this.driver.Configuration.Fields, 
		'http://schemas.microsoft.com/cdo/configuration/', 
		options);
};

Mail.prototype.setMailHeaders = function(options)
{
	fieldsUpdate(
		this.driver.Fields, 
		'urn:schemas:mailheader:', 
		options);
};

Mail.prototype.addAttachment = function(URL, mimetype, options)
{
	options = options || {};
	var attachment = this.driver.AddAttachment(URL, options.username, options.password);
	if ( mimetype ) {
		attachment.ContentMediaType = mimtype;
	}
};

Mail.prototype.prepareMessage = function(options)
{
	var driver = this.driver;

	for (var p in options) {
		if ( ! p || ! options.hasOwnProperty(p) ) {
			continue;
		}
		driver[p] = options[p];
	}
};

Mail.prototype.send = function(options)
{
	this.prepareMessage(options);
	this.driver.Send();
};

var prepareSmtpOptions = function(options, host, port)
{
	options = options || {};
	options.sendusing = 2;
	options.smtpusessl = true;
	options.smtpauthenticate = 1;
	options.smtpserver = host;
	options.smtpserverport = port;
	return options;
};

Mail.MailRu = function(options)
{
	return new Mail(prepareSmtpOptions(options, 'smtp.mail.ru', 25));
};

Mail.Yandex = function(options)
{
	return new Mail(prepareSmtpOptions(options, 'smtp.yandex.ru', 465));
};

Mail.GMail = function(options)
{
	return new Mail(prepareSmtpOptions(options, 'smtp.gmail.com', 465));
};

})();
( 2 * b ) || ! ( 2 * b )

2

Re: JScript: Отправка почты с помощью CDO.Message

Ещё один красивый скрипт от Rumata

Для отправки больших файлов в опции можно добавить параметр
options.smtpconnectiontimeout=90 //(по умолчанию ~30 с)

3

Re: JScript: Отправка почты с помощью CDO.Message

badik
Спасибо.

badik пишет:

можно добавить параметр

Там много чего можно добавить. Параметров много, а тех что указаны - достаточно для отправки большинства сообщений. Суммирую информацию на текущий момент. Для отправки почты по SMTP необходимо указывать следующие параметры:

Основные параметры соединения:

    sendusing: 2,
Отправка почты по сети, через внешние почтовые службы

    smtpusessl: true,
Отправлять письма с шифрованием SSL

    smtpauthenticate: 1,
Простая (basic) авторизация. Требуется указать логин и пароль.

    smtpserver: host,
Адрес SMTP сервера

    smtpserverport: port,
Порт, на котором будет производится отправка

    smtpconnectiontimeout
Таймаут соединения при отправке больших сообщений. Значение по умолчанию 30с.

    sendusername
Имя пользователя в форме login@hostname. Чаще всего этот параметр совпадает с адресом отправителя. Но не всегда. Например, для Yandex-а этот параметр соответствует первой части login, без @hostname.

    sendpassword
Пароль пользователя sendusername

В качестве дополнения - пример для Rambler. За основу взято описание на странице Общие настройки для почтовых клиентов


var username = 'login@rambler.ru';
var password = 'pasword';

var mailer = new Mail({
	sendusing: 2, 
	smtpusessl: true, 
	smtpauthenticate: 1, 
	smtpserver: 'mail.rambler.ru', 
	smtpserverport: 587, 

	sendusername: username, 
	sendpasword: password
});
( 2 * b ) || ! ( 2 * b )