Commit 186b4916 authored by Frank Bergmann's avatar Frank Bergmann

- Updated to OpenACS 5.9.1

parent eef7c813
......@@ -9,19 +9,19 @@
<implements-subsite-p>f</implements-subsite-p>
<inherit-templates-p>t</inherit-templates-p>
<version name="5.9.0" url="http://openacs.org/repository/download/apm/acs-mail-lite-5.9.0.apm">
<version name="5.9.1" url="http://openacs.org/repository/download/apm/acs-mail-lite-5.9.1.apm">
<owner url="mailto:malte.sussdorff@cognovis.de">Malte Sussdorff</owner>
<owner url="mailto:timo@studio-k4.de">Timo Hentschel</owner>
<summary>Simplified reliable email transmission with bounce management.</summary>
<release-date>2015-10-04</release-date>
<release-date>2017-08-06</release-date>
<vendor url="http://www.openacs.org">OpenACS</vendor>
<description format="text/html">This package provides a service for sending messages, queueing messages in the database to ensure reliable sending and make sending a message 'transactional'. Replacement for acs-mail.</description>
<maturity>3</maturity>
<provides url="acs-mail-lite" version="5.9.0"/>
<requires url="acs-kernel" version="5.9.0"/>
<requires url="acs-service-contract" version="5.9.0"/>
<requires url="acs-tcl" version="5.9.0"/>
<provides url="acs-mail-lite" version="5.9.1"/>
<requires url="acs-kernel" version="5.9.1"/>
<requires url="acs-service-contract" version="5.9.1"/>
<requires url="acs-tcl" version="5.9.1"/>
<callbacks>
<callback type="after-upgrade" proc="acs_mail_lite::after_upgrade"/>
......@@ -38,7 +38,7 @@
Set this parameter to the root of your filesystem will disable this restriction.
Default for the empty value of this parameter will be to allow only files into the temporary folder of the system, as in '[ns_tmpdir]'" section_name="email"/>
<parameter scope="instance" datatype="string" min_n_values="1" max_n_values="1" name="FixedFont" description="Font definition (after the font tag) that will always be wrapped around HTML e-mail. Example: face=Verdana size=2. Default is empty" section_name="email"/>
<parameter scope="instance" datatype="string" min_n_values="1" max_n_values="1" name="FixedSenderEmail" description="Email addres that will be always the email stored in the sender. Default is empty" section_name="email"/>
<parameter scope="instance" datatype="string" min_n_values="1" max_n_values="1" name="FixedSenderEmail" description="Email address that will be always the email stored in the sender. Default is empty" section_name="email"/>
<parameter scope="instance" datatype="number" min_n_values="1" max_n_values="1" name="FolderID" description="Folder ID of a folder in the content repository that contains files that can be included using checkboxes in each e-mail send out of the system. This effects /lib/email" section_name="email"/>
<parameter scope="instance" datatype="string" min_n_values="1" max_n_values="1" name="MMEncodeBin" default="/usr/bin/mmencode" description="Location of mmencode executable." section_name="email"/>
<parameter scope="instance" datatype="number" min_n_values="1" max_n_values="1" name="MaxBounceCount" default="10" description="Number of bounced emails after resulting in disabling an email-address" section_name="email"/>
......
......@@ -3,8 +3,6 @@
<msg key="Associated_files">Verknpfte Dateien:</msg>
<msg key="BCC">BCC</msg>
<msg key="Bounce_disabled">Bouncing abgestellt. Sie bekommen wieder normal Email</msg>
<msg key="Bouncing_users">Bouncende Benutzer</msg>
<msg key="CC">CC</msg>
<msg key="cc_help">Liste von E-Mail Adressen durch &#34;;&#34; getrennt an die eine Kopie der E-Mail geschickt werden soll.</msg>
<msg key="check_uncheck">Alle/Keine auswhlen</msg>
......@@ -16,7 +14,6 @@
<msg key="Send">Senden</msg>
<msg key="Sender">Absender</msg>
<msg key="Subject">Betreff</msg>
<msg key="Unbounce">Unbounce</msg>
<msg key="Untitled">Unbenannt</msg>
<msg key="Upload_file">Datei hinzufgen</msg>
<msg key="Your_message_was_sent_to">Ihre Nachricht wurde an die folgende Empfnger geschickt: %recipients%</msg>
......
......@@ -6,7 +6,7 @@
<msg key="Bounce_disabled">Bouncing recorded as disabled. You will receive E-Mails again.</msg>
<msg key="Bouncing_users">Bouncing users</msg>
<msg key="CC">CC</msg>
<msg key="cc_help">Send copy to multiple addresses separated by &#34;;&#34;</msg>
<msg key="cc_help">Send copy to multiple addresses separated by &quot;;&quot;</msg>
<msg key="check_uncheck">Check/Uncheck</msg>
<msg key="lt_there_was_an_error_processing">There was an error processing this request.</msg>
<msg key="Message">Message</msg>
......
......@@ -2,9 +2,8 @@
<message_catalog package_key="acs-mail-lite" locale="nl_NL" charset="ISO-8859-1">
<msg key="Associated_files">Verbintenis met de bestanden:</msg>
<msg key="BCC">BCC</msg>
<msg key="CC">CC</msg>
<msg key="cc_help">Stuur kopie aan meerdere adressen gescheiden door &#34;;&#34;</msg>
<msg key="cc_help">Stuur kopie aan meerdere adressen gescheiden door &quot;;&quot;</msg>
<msg key="check_uncheck">Aanvinken/Afvinken</msg>
<msg key="lt_there_was_an_error_processing">Er is een fout opgetreden tijdens het verwerken van dit verzoek.</msg>
<msg key="Message">Bericht</msg>
......
......@@ -3,7 +3,7 @@
<msg key="Associated_files">Powiązane Pliki:</msg>
<msg key="CC">CC</msg>
<msg key="cc_help">Wyślij kopie pod wiele adresów rozdzielając je &#34;;&#34;</msg>
<msg key="cc_help">Wyślij kopie pod wiele adresów rozdzielając je &quot;;&quot;</msg>
<msg key="check_uncheck">Zaznacz/Odznacz</msg>
<msg key="lt_there_was_an_error_processing">Wystąpił błąd.</msg>
<msg key="Message">Komunikat</msg>
......
......@@ -3,7 +3,7 @@
<msg key="Associated_files">Arquivos Associados:</msg>
<msg key="CC">CC</msg>
<msg key="cc_help">Enviar cpia para mltiplos endereos de email separados por &#34;;&#34;</msg>
<msg key="cc_help">Enviar cpia para mltiplos endereos de email separados por &quot;;&quot;</msg>
<msg key="check_uncheck">Marcar/Desmarcar</msg>
<msg key="lt_there_was_an_error_processing">Ocorreu um erro ao processar esta solicitao.</msg>
<msg key="Message">Mensagem</msg>
......
......@@ -2,11 +2,11 @@
<message_catalog package_key="acs-mail-lite" locale="ru_RU" charset="utf-8">
<msg key="Associated_files">Связанные файлы:</msg>
<msg key="BCC">&#34;Слепая копия&#34;</msg>
<msg key="BCC">&quot;Слепая копия&quot;</msg>
<msg key="Bounce_disabled">Повторные ошибочные электронные почтовые сообщения записаны как отключенные. Вы будете получать электронные почтовые сообщения снова.</msg>
<msg key="Bouncing_users">Адресаты повторных ошибочных электронных почтовых сообщений</msg>
<msg key="CC">Копия</msg>
<msg key="cc_help">Отправить копию по нескольким адресам, разделённым с помощью &#34;;&#34;</msg>
<msg key="cc_help">Отправить копию по нескольким адресам, разделённым с помощью &quot;;&quot;</msg>
<msg key="check_uncheck">Проверять/Не проверять</msg>
<msg key="lt_there_was_an_error_processing">Произошла ошибка в обработке этого запроса.</msg>
<msg key="Message">Сообщение</msg>
......
......@@ -25,7 +25,9 @@ CREATE TABLE acs_mail_lite_queue (
references apm_packages,
file_ids varchar(4000),
filesystem_files varchar(4000),
delete_filesystem_files_p boolean,
delete_filesystem_files_p char(1)
constraint amlq_del_fs_files_p_ck
check (delete_filesystem_files_p in ('t','f')),
mime_type varchar(200),
object_id integer,
no_callback_p char(1)
......
......@@ -6,4 +6,6 @@
-- new columns
alter table acs_mail_lite_queue add filesystem_files varchar(4000);
alter table acs_mail_lite_queue add delete_filesystem_files_p boolean;
\ No newline at end of file
alter table acs_mail_lite_queue add delete_filesystem_files_p char(1)
constraint amlq_del_fs_files_p_ck
check (delete_filesystem_files_p in ('t','f'));
......@@ -24,32 +24,25 @@ ad_proc -public -callback acs_mail_lite::send {
{-filesystem_files}
{-delete_filesystem_files_p}
{-object_id}
{-status ok}
{-errorMsg ""}
} {
Callback for executing code after an email has been send using the send mechanism.
@param package_id Package ID of the sending package
@param message_id the generated message_id for this mail
@param from_addr email of the sender
@param to_addr list of emails to whom did we send this email
@param body Text body of the email
@param mime_type Mime type of the email body
@param mime_type Mime type of the email body
@param subject of the email
@param cc_addr list of emails to whom did we send this email in CC
@param bcc_addr list of emails to whom did we send this email in BCC
@param file_ids List of file ids sent as attachments.
@param object_id The ID of the object that is responsible for sending the mail in the first place
@param object_id The ID of the object that is responsible for sending the mail in the first place
@param status Status of the send operation ("ok" or "error")
@param errorMsg Error Details
} -
ad_proc -public -callback acs_mail_lite::incoming_email {
......@@ -99,7 +92,7 @@ ad_proc -public -callback acs_mail_lite::incoming_email -impl acs-mail-lite {
upvar $array email
set to [acs_mail_lite::parse_email_address -email $email(to)]
ns_log Debug "acs_mail_lite::incoming_email -impl acs-mail-lite called. Recepient $to"
ns_log Debug "acs_mail_lite::incoming_email -impl acs-mail-lite called. Recipient $to"
lassign [acs_mail_lite::parse_bounce_address -bounce_address $to] user_id package_id signature
......
......@@ -329,6 +329,7 @@ namespace eval acs_mail_lite {
-subject $subject \
-body $body \
-package_id $package_id \
-object_id $object_id \
-file_ids $file_ids \
-filesystem_files $filesystem_files \
-delete_filesystem_files_p $delete_filesystem_files_p \
......@@ -421,6 +422,7 @@ namespace eval acs_mail_lite {
# Decide which sender to use
set fixed_sender [parameter::get -parameter "FixedSenderEmail" \
-package_id $mail_package_id]
if { $fixed_sender ne "" && !$use_sender_p} {
set from_addr $fixed_sender
......@@ -591,14 +593,16 @@ namespace eval acs_mail_lite {
set originator [bounce_address -user_id $rcpt_id \
-package_id $package_id \
-message_id $message_id]
# fraber 2016-11-02: Overwrite fixed_sender in case we got
# issues with corporate mail gateways etc.
if { $fixed_sender ne ""} {
set originator $fixed_sender
}
# fraber 2016-11-02: Overwrite fixed_sender in case we got
# issues with corporate mail gateways etc.
if { $fixed_sender ne ""} {
set originator $fixed_sender
}
set errorMsg ""
set status ok
if { $send_mode eq "log" } {
# Add recipients to headers
......@@ -616,10 +620,12 @@ namespace eval acs_mail_lite {
ns_log Notice "acs-mail-lite::send: $notice\n\n**********\nEnvelope sender: $originator\n\n$packaged\n**********"
} else {
acs_mail_lite::smtp -multi_token $tokens \
-headers $headers_list \
-originator $originator
if {[catch {acs_mail_lite::smtp -multi_token $tokens \
-headers $headers_list \
-originator $originator} errorMsg]} {
set status error
}
# Close all mime tokens
mime::finalize $tokens -subordinates all
......@@ -640,7 +646,9 @@ namespace eval acs_mail_lite {
-file_ids $file_ids \
-filesystem_files $filesystem_files \
-delete_filesystem_files_p $delete_filesystem_files_p \
-object_id $object_id
-object_id $object_id \
-status $status \
-errorMsg $errorMsg
}
# Attachment files can now be deleted, if so required.
......@@ -648,9 +656,12 @@ namespace eval acs_mail_lite {
# could need to look at files for their own purposes.
if {[string is true $delete_filesystem_files_p]} {
foreach f $filesystem_files {
file delete $f
file delete -- $f
}
}
if {$status ne "ok"} {
error $errorMsg
}
}
#---------------------------------------
......@@ -683,7 +694,7 @@ namespace eval acs_mail_lite {
{bcc {}}
} {
Replacement for ns_sendmail for backward compability.
Replacement for ns_sendmail for backward compatibility.
} {
......
......@@ -19,7 +19,18 @@ namespace eval acs_mail_lite {
} {
set domain [parameter::get_from_package_key -package_key "acs-mail-lite" -parameter "BounceDomain"]
if { $domain eq "" } {
regsub {http://} [ns_config [ns_driversection -driver nssock] hostname] _ domain
#
# If there is no domain configured, use the configured
# hostname as domain name
#
foreach driver {nsssl nssock} {
set driver_section [ns_driversection -driver $driver]
set configured_hostname [ns_config $driver_section hostname]
if {$configured_hostname ne ""} {
set domain $configured_hostname
break
}
}
}
return $domain
}
......@@ -108,7 +119,7 @@ namespace eval acs_mail_lite {
}
#let's delete the file now
if {[catch {file delete $msg} errmsg]} {
if {[catch {file delete -- $msg} errmsg]} {
ns_log Error "load_mails: unable to delete queued message $msg: $errmsg"
} else {
ns_log Debug "load_mails: deleted $msg"
......@@ -123,7 +134,7 @@ namespace eval acs_mail_lite {
} {
An email is splitted into several parts: headers, bodies and files lists and all headers directly.
The headers consists of a list with header names as keys and their correponding values. All keys are lower case.
The headers consists of a list with header names as keys and their corresponding values. All keys are lower case.
The bodies consists of a list with two elements: content-type and content.
The files consists of a list with three elements: content-type, filename and content.
......@@ -173,7 +184,7 @@ namespace eval acs_mail_lite {
set content [read $stream]
close $stream
ns_log error $content
file delete $file
file delete -- $file
return
}
......
......@@ -26,6 +26,10 @@ ad_proc acs_mail_lite::utils::build_subject {
the mime::word_encode proc to do it or local code (word_encode is
buggy in mime < 1.5.2 )
A purely tcllib based version would be
[mime::word_encode utf-8 quoted-printable $subject]
but that would miss the safety-belt for newline handling
} {
set charset [string toupper $charset]
......@@ -35,6 +39,20 @@ ad_proc acs_mail_lite::utils::build_subject {
# 69 = 76 - 7 where 7 is for "=?"+"?Q?+"?="
set maxlen [expr {69 - [string length $charset]}]
#
# Make sure, the subject line does not have surrounding white
# space/new lines
#
set subject [string trim $subject]
if {[regsub -all {[\r\n]} $subject " " s]} {
ad_log warning "subject line contains line breaks (replaced by space): '$subject' -> '$s'"
set subject $s
}
#
# set up variables for loop
#
set result ""
set line ""
set i 0
......
<property name="context">{/doc/acs-mail-lite {Mail Services Lite}} {User Documentation for ACS Mail Lite}</property>
<property name="context">{/doc/acs-mail-lite {ACS Mail Services Lite}} {User Documentation for ACS Mail Lite}</property>
<property name="doc(title)">User Documentation for ACS Mail Lite</property>
<master>
<h1>User Documentation for ACS Mail Lite</h1>
......@@ -14,26 +14,27 @@ location of the binary as a parameter) or SMTP to send the mail. If
the sending fails, the mail will be placed in the outgoing queue
again and be given another try a few minutes later when processing
the queue again.</p>
<p>Each email contains an X-Envelope-From adress constructed as
<p>Each email contains an X-Envelope-From address constructed as
follows:<br>
The adress starts with "bounce" (can be changed by a parameter)
followed by the user_id, a hashkey and the package_id of the
package instance that sent the email, separated by "-". The domain
name of this adress can be changed with a parameter.</p>
The address starts with "bounce" (can be changed by a
parameter) followed by the user_id, a hashkey and the package_id of
the package instance that sent the email, separated by
"-". The domain name of this address can be changed with
a parameter.</p>
<p>The system checks every 2 minutes (configurable) in a certain
maildirectory (configurable) for newly bounced emails, so the
mailsystem will have to place every mail to an address beginning
with "bounce" (or whatever the appropriate parameter says) in that
directory. The system then processes each of the bounced emails,
strips out the message_id and verifies the hashkey in the
bounce-address. After that the package-key of the package sending
the original mail is found out by using the package_id provided in
the bounce adress. With that, the system then tries to invoke a
callback procedure via a service contract if one is registered for
that particular package-key. This enables each package to deal with
bouncing mails on their own - probably logging this in special
tables. ACS Mail Lite then logs the event of a bounced mail of that
user.</p>
with "bounce" (or whatever the appropriate parameter
says) in that directory. The system then processes each of the
bounced emails, strips out the message_id and verifies the hashkey
in the bounce-address. After that the package-key of the package
sending the original mail is found out by using the package_id
provided in the bounce address. With that, the system then tries to
invoke a callback procedure via a service contract if one is
registered for that particular package-key. This enables each
package to deal with bouncing mails on their own - probably logging
this in special tables. ACS Mail Lite then logs the event of a
bounced mail of that user.</p>
<p>Every day a procedure is run that checks if an email account has
to be disabled from receiving any more mail. This is done the
following way:</p>
......@@ -59,14 +60,15 @@ To use this system here is a quick guide how to do it with postfix.
<li>Set "recipient_delimiter" to " - "</li><li>Set "home_mailbox" to "Maildir/"</li><li>Make sure that /etc/postfix/aliases is hashed for the alias
database</li>
</ul>
</li><li>Edit /etc/postfix/aliases. Redirect all mail to "bounce" (if
you leave the parameter as it was) to "nsadmin" (in case you only
run one server).</li>
</li><li>Edit /etc/postfix/aliases. Redirect all mail to
"bounce" (if you leave the parameter as it was) to
"nsadmin" (in case you only run one server).</li>
</ul>
In case of multiple services on one system, create a bounce email
for each of them (e.g. changeing "bounce" to "bounce_service1") and
create a new user that runs the aolserver process for each of them.
You do not want to have service1 deal with bounces for service2.
for each of them (e.g. changeing "bounce" to
"bounce_service1") and create a new user that runs the
aolserver process for each of them. You do not want to have
service1 deal with bounces for service2.
<h2>Release Notes</h2>
<p>Please file bugs in the <a href="http://openacs.org/bugtracker/openacs/">Bug Tracker</a>.</p>
......@@ -17,12 +17,12 @@ If the sending fails, the mail will be placed in the outgoing queue
again and be given another try a few minutes later when processing
the queue again.
<p>
Each email contains an X-Envelope-From adress constructed as
Each email contains an X-Envelope-From address constructed as
follows:<br>
The adress starts with "bounce" (can be changed by a parameter)
The address starts with "bounce" (can be changed by a parameter)
followed by the user_id, a hashkey and the package_id of the
package instance that sent the email, separated by "-". The
domain name of this adress can be changed with a parameter.
domain name of this address can be changed with a parameter.
<p>
The system checks every 2 minutes (configurable) in a certain
maildirectory (configurable) for newly bounced emails, so the
......@@ -32,7 +32,7 @@ directory. The system then processes each of the bounced emails,
strips out the message_id and verifies the hashkey in the bounce-address.
After that the package-key of the package sending the original mail
is found out by using the package_id provided in the bounce
adress. With that, the system then tries to invoke a callback
address. With that, the system then tries to invoke a callback
procedure via a service contract if one is registered for that
particular package-key. This enables each package to deal with
bouncing mails on their own - probably logging this in special tables.
......
......@@ -5,7 +5,7 @@
<p>#acs-mail-lite.Bounce_disabled#</p>
<p>
<b>&raquo;</b> <a href="@return_url@">#acs-subsite.Continue#</a>
<strong>&raquo;</strong> <a href="@return_url@">#acs-subsite.Continue#</a>
</p>
......
......@@ -2,7 +2,7 @@ ad_page_contract {
The page restores a user from the deleted state.
@cvs-id $Id$
} {
{return_url {[ad_pvt_home]}}
{return_url:localurl {[ad_pvt_home]}}
}
set page_title [_ acs-mail-lite.Restore_bounce]
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment