Revision 740
Date:
2018/11/12 22:03:41
Author:
ahitrov
Revision Log:
in-core e-mail sender
Files:
Legend:
Added
Removed
Modified
utf8/core/GNUmakefile
95
95
project_reload reload \
96
96
project_fullreload full \
97
97
project_rewind rewind nano \
98
project_fullrewind giga \
98
99
project_refresh refresh \
99
100
project_deinstall pdi \
100
101
project_user user \
…
…
963
964
project_conf project_start
964
965
@echo $@ done
965
966
967
# full reinstall & restart core & project
968
giga: project_fullrewind ;
969
project_fullrewind:: project_stop mason_clean \
970
core_install project_install plugins_install \
971
project_conf project_start
972
@echo $@ done
973
966
974
# full reinstall & restart project
967
975
reload: project_reload ;
968
976
project_reload:: project_stop mason_clean project_update project_install \
…
…
1531
1539
DEFAULT_ESCAPE_FLAGS \
1532
1540
DEFAULT_HANDLER \
1533
1541
DEVELOPMENT \
1542
EMAIL_ENABLE \
1543
EMAIL_MAILER \
1544
EMAIL_FROM \
1545
EMAIL_LOGIN \
1546
EMAIL_PASSWORD \
1547
EMAIL_SMTP_SERVER \
1548
EMAIL_SMTP_HELLO \
1549
EMAIL_SMTP_TIMEOUT \
1550
EMAIL_SMTP_SSL \
1551
EMAIL_SMTP_PORT \
1534
1552
ERROR_MODE \
1535
1553
FILES \
1536
1554
FILE_WEB_STORAGE \
utf8/core/lib/Contenido/Mail.pm
1
package Contenido::Mail;
2
3
use Net::SMTP;
4
use MIME::Lite;
5
use MIME::Base64;
6
use Data::Dumper;
7
use Contenido::Globals;
8
9
sub new {
10
my ($proto) = @_;
11
my $class = ref($proto) || $proto;
12
my $self = {};
13
14
$self->{enable} = $state->{email_enable};
15
if ( $self->{enable} ) {
16
$self->{mailer} = $state->{email_mailer};
17
$self->{from} = $state->{email_from};
18
$self->{login} = $state->{email_auth_login};
19
$self->{password} = $state->{email_auth_password};
20
if ( $self->{mailer} eq 'smtp' ) {
21
$self->{server} = $state->{email_smtp_server};
22
$self->{hello} = $state->{email_smtp_hello};
23
$self->{timeout} = $state->{email_smtp_timeout};
24
$self->{ssl} = $state->{email_smtp_ssl};
25
$self->{port} = $state->{email_smtp_port};
26
}
27
}
28
29
bless $self, $class;
30
return $self;
31
}
32
33
sub send {
34
return unless @_;
35
my $self;
36
if ( ref $_[0] eq 'Contenido::Mail' ) {
37
$self = shift;
38
} else {
39
$self = Contenido::Mail->new;
40
}
41
42
my $opts = shift // {};
43
44
my $email = delete $opts->{email} // return undef;
45
return unless ref $email && exists $email->{to} && $email->{subject} && $email->{body};
46
47
my $etype = delete $opts->{etype} // 'mixed';
48
my $debug = $state->development || $DEBUG || $opts->{debug} ? 1 : 0;
49
50
my $subject = $email->{subject};
51
$subject = MIME::Base64::encode($subject);
52
$subject =~ s/\s//sgi;
53
$subject = '=?utf-8?B?'.$subject.'?=';
54
55
my $emailfrom;
56
if ( $email->{from} ) {
57
my ($from, $efrom) = $email->{from} =~ /^(.*?)<(.*?)>/ ? ($1, $2) : $email->{from} =~ /<(.*?)>/ ? ('',$1) : ('',$email->{from});
58
if ( $from ) {
59
$from = MIME::Base64::encode($from);
60
$from =~ s/\s+$//si;
61
$from = '=?utf-8?B?'.$from.'?=';
62
$emailfrom = $from.' <'.$efrom.'>';
63
} else {
64
$emailfrom = $efrom;
65
}
66
} elsif ( $state->{email_from} ) {
67
$emailfrom = $self->{from}
68
}
69
70
my ($emailto, @to);
71
if ( ref $email->{to} eq 'ARRAY' ) {
72
foreach my $tostr ( @{$email->{to}} ) {
73
my ($to, $eto) = $tostr =~ /^(.*?)<(.*?)>/ ? ($1, $2) : $tostr =~ /<(.*?)>/ ? ('',$1) : ('',$tostr);
74
if ( $to ) {
75
$to = MIME::Base64::encode($to);
76
$to =~ s/\s+$//si;
77
$to = '=?utf-8?B?'.$to.'?=';
78
push @to, $to.' <'.$eto.'>';
79
} else {
80
push @to, $eto;
81
}
82
}
83
$emailto = shift @to;
84
} else {
85
my ($to, $eto) = $email->{to} =~ /^(.*?)<(.*?)>/ ? ($1, $2) : $email->{to} =~ /<(.*?)>/ ? ('',$1) : ('',$email->{to});
86
if ( $to ) {
87
$to = MIME::Base64::encode($to);
88
$to =~ s/\s+$//si;
89
$to = '=?utf-8?B?'.$to.'?=';
90
$emailto = $to.' <'.$eto.'>';
91
} else {
92
$emailto = $eto;
93
}
94
}
95
96
my $ccmail;
97
if ( exists $email->{cc} && ref $email->{cc} eq 'ARRAY' ) {
98
foreach my $cc ( @{ $email->{cc}} ) {
99
my ($cce, $ecce) = $cc =~ /^(.*?)<(.*?)>/ ? ($1, $2) : $cc =~ /<(.*?)>/ ? ('',$1) : ('',$cc);
100
$cc = $ecce;
101
}
102
$ccmail = join ', ', (@to, @{$email->{cc}});
103
} elsif ( exists $email->{cc} && $email->{cc} ) {
104
my ($cce, $ecce) = $email->{cc} =~ /^(.*?)<(.*?)>/ ? ($1, $2) : $email->{cc} =~ /<(.*?)>/ ? ('',$1) : ('',$email->{cc});
105
$ccmail = join ', ', (@to, $ecce);
106
} elsif ( @to ) {
107
$ccmail = join ', ', @to;
108
}
109
110
my $body = $email->{body};
111
warn Dumper($email) if $debug;
112
my $dt = Contenido::DateTime->new;
113
$dt->set_locale('en_EN');
114
my $pdate = $dt->strftime("%a, %d %b %Y %H:%M:%S %z");
115
my $msg = MIME::Lite->new(
116
To => $emailto,
117
From => $emailfrom,
118
$ccmail ? ( Cc => $ccmail ) : (),
119
Subject => $subject,
120
# Encoding=> 'binary',
121
Date => $pdate,
122
Type => ($etype eq 'mixed' ? 'multipart/mixed' : $etype eq 'related' ? 'multipart/related;type="multipart/alternative";charset="utf-8"' : $etype),
123
);
124
$msg->attach(
125
'Type' => 'text/html;charset="utf-8"',
126
'Data' => $body,
127
'Disposition' => '',
128
);
129
130
my $email_body = $msg->as_string;
131
if ( $self->mailer eq 'smtp' ) {
132
my $mailer = Net::SMTP->new( $self->{server},
133
$self->{hello} ? (Hello => $self->{hello}) : (),
134
Port => $self->{port},
135
Timeout => $self->{timeout},
136
SSL => $self->{ssl},
137
Debug => $debug,
138
);
139
warn Dumper $mailer if $debug;
140
if ( ref $mailer ) {
141
if ( $self->{login} && $self->{password} ) {
142
$mailer->auth( $self->{login}, $self->{password} );
143
}
144
$mailer->mail( $emailfrom );
145
$mailer->to( $emailto );
146
$mailer->data;
147
$mailer->datasend( $email_body );
148
$mailer->dataend;
149
$mailer->quit;
150
} else {
151
warn "MAIL ERROR! Can't connect to Yandex SMTP\n";
152
}
153
}
154
}
155
156
157
1;
utf8/core/lib/Contenido/State.pm.proto
144
144
$self->{preamble_handler} = '@PREAMBLE_HANDLER@';
145
145
$self->{preamble_handler_path} = '@PREAMBLE_HANDLER_PATH@';
146
146
147
$self->{email_enable} = lc('@EMAIL_ENABLE@') eq 'yes' ? 1 : 0;
148
if ( $self->{email_enable} ) {
149
$self->{email_mailer} = lc ('@EMAIL_MAILER@') eq 'smtp' ? 'smtp' : 'sendmail';
150
$self->{email_from} = '@EMAIL_FROM@';
151
$self->{email_auth_login} = '@EMAIL_LOGIN@';
152
$self->{email_auth_password} = '@EMAIL_PASSWORD@';
153
if ( $self->{email_mailer} eq 'smtp' ) {
154
$self->{email_smtp_server} = '@EMAIL_SMTP_SERVER@';
155
$self->{email_smtp_hello} = '@EMAIL_SMTP_HELLO@';
156
$self->{email_smtp_timeout} = int(@EMAIL_SMTP_TIMEOUT@) || 10;
157
$self->{email_smtp_ssl} = lc ('@EMAIL_SMTP_SSL@') eq 'yes' ? 1 : 0;
158
$self->{email_smtp_port} = int(@EMAIL_SMTP_PORT@) || ($self->{email_smtp_ssl} ? 465 : 25);
159
}
160
}
161
147
162
$self->_refresh_();
148
163
$self->_init_();
149
164
…
…
267
282
memcached_object_expire
268
283
memcached_namespace
269
284
convert_binary
285
286
email_enable email_mailer
287
email_from email_auth_login email_auth_password
288
email_smtp_server email_smtp_hello email_smtp_timeout email_smtp_ssl email_smtp_port
270
289
) )
271
290
{
272
291
$self->{attributes}->{ $attribute } = 'SCALAR';
utf8/core/project-default.mk
65
65
RSYNC_DIRS ?=
66
66
RSYNC_CORE_DIRS += contenido/i
67
67
68
EMAIL_ENABLE ?= NO
69
68
70
# apache pool
69
71
${PROJECT_LC}_START_SERVERS ?= 1
70
72
START_SERVERS ?= ${${PROJECT_LC}_START_SERVERS}
Небольшая справка по веткам
cnddist – контейнер, в котором хранятся все дистрибутивы всех библиотек и программных пакетов, которые использовались при построении различных версий Contenido. Если какой-то библиотеки в данном хранилище нет, инсталлятор сделает попытку "подтянуть" ее с веба (например, с CPAN). Если библиотека слишком старая, есть очень большая вероятность, что ее там уже нет. Поэтому мы храним весь хлам от всех сборок. Если какой-то дистрибутив вдруг отсутствует в cnddist - напишите нам, мы положим его туда.
koi8 – отмирающая ветка, чей код, выдача и все внутренние библиотеки заточены на кодировку KOI8-R. Вносятся только те дополнения, которые касаются внешнего вида и функционала админки, баги ядра, обязательные обновления портов и мелочи, которые легко скопипастить. В дальнейшем планируется полная остановка поддержки по данной ветке.
utf8 – актуальная ветка, заточенная под UTF-8.
Внутри каждой ветки: core – исходники ядра; install – скрипт установки инсталляции; plugins – плагины; samples – "готовые к употреблению" проекты, которые можно поставить, запустить и посмотреть, как они работают.