parent $text
parent $mail_root
object $mail
var $root child_index 18
var $root owners [$mail]
var $root owned [$mail]
var $root fertile 1
var $root inited 1
var $located location $creation
var $has_verbs verbs #[]
var $mail readers []
var $root info []
var $ text []
var $root manager $mail
var $root writable [$mail]
var $root readable ['parameters, 'methods, 'code]
var $root dbref 'mail
var $mail header #[]
var $mail delivered 0
method del_recipient
disallow_overrides;
arg whom;
var rcpts;
if (!($mail_utils.has_mail_perms(caller())))
(> .perms(sender()) <);
rcpts = setremove(header['rcpt], whom);
if (!rcpts)
.destroy();
else
header = header.add('rcpt, rcpts);
.
method add_recipient
disallow_overrides;
arg whom;
var current;
if (!($mail_utils.has_mail_perms(caller())))
(> .perms(sender()) <);
current = (| header['rcpt] |) || [];
if ((| whom in current |))
throw(~type, "Recipient is already in the list of recipients");
header = header.add('rcpt, current.union([whom]));
.
method letter
disallow_overrides;
if (!($mail_utils.has_mail_perms(caller())))
(> .perms(sender()) <);
return dict_add(.header(), 'text, .text());
.
method readers
disallow_overrides;
if (!($mail_utils.has_mail_perms(caller())))
(> .perms(sender()) <);
return readers;
.
method did_read
disallow_overrides;
if (!($mail_utils.has_mail_perms(caller())))
(> .perms(sender()) <);
readers = [@readers, sender()];
.
method set_time
disallow_overrides;
arg time;
if (!($mail_utils.has_mail_perms(caller())))
(> .perms(sender()) <);
header = header.add('time, time);
.
method set_recipients
disallow_overrides;
arg whom;
if (!($mail_utils.has_mail_perms(caller())))
(> .perms(sender()) <);
header = header.add('rcpt, whom);
.
method set_subject
disallow_overrides;
arg what;
if (!($mail_utils.has_mail_perms(caller())))
(> .perms(sender()) <);
header = header.add('subj, what);
.
method set_from
disallow_overrides;
arg whom;
if (!($mail_utils.has_mail_perms(caller())))
(> .perms(sender()) <);
header = dict_add(header, 'from, whom);
.
method add_reader
disallow_overrides;
arg who;
if (!($mail_utils.has_mail_perms(caller())))
(> .perms(sender()) <);
readers = readers.union([who]);
.
method recipients
disallow_overrides;
if (!($mail_utils.has_mail_perms(caller())))
(> .perms(sender()) <);
return (| header['rcpt] |) || [$no_one];
.
method from
disallow_overrides;
if (!($mail_utils.has_mail_perms(caller())))
(> .perms(sender()) <);
return (| header['from] |) || $no_one;
.
method subject
disallow_overrides;
if (!($mail_utils.has_mail_perms(caller())))
(> .perms(sender()) <);
return (| header['subj] |) || "<none>";
.
method time
disallow_overrides;
if (!($mail_utils.has_mail_perms(caller())))
(> .perms(sender()) <);
return (| header['time] |) || 0;
.
method format
disallow_overrides;
var output, names, o, h;
if (!($mail_utils.has_mail_perms(caller())))
(> .perms(sender()) <);
h = .header();
output = ["From: " + ((h['from]).namef('ref))];
names = ((h['rcpt]).omap($mail_utils, 'mail_name)).to_english();
output = [@output, "To: " + names];
output = [@output, "When: " + ($time.date(h['time]))];
output = [@output, "Subject: " + (h['subj])];
output = [@output, "---", @.text(), "---"];
return output;
.
method header
disallow_overrides;
var h, d;
(> .perms(sender()) <);
h = #[['from, $no_one], ['rcpt, [$no_one]], ['subj, "<none>"], ['time, 0]];
for d in (header)
h = h.add(@d);
return h;
.
method uninit_mail
disallow_overrides;
var r;
(> .perms(caller(), $root) <);
for r in (.recipients())
(| r.del_mail(this(), (| (.from()) || this() |)) |);
header = #[];
readers = [];
.
method init_mail
disallow_overrides;
(> .perms(caller(), $root) <);
header = #[];
readers = [];
.set_readable([]);
.
method has_read
disallow_overrides;
arg who;
return who in readers;
.
method text
return (> pass() <) || ["", "(no message)", ""];
.
method send
arg [recips];
var r, valid, invalid;
if (!($mail_utils.has_mail_perms(caller())))
(> .perms(sender()) <);
if (delivered)
throw(~delivered, "This mail has already been delivered.");
if (!recips)
recips = .recipients();
if ((listlen(recips) == 1) && ((recips[1]) == $no_one))
throw(~norcpt, "No recipients specified.");
valid = [];
invalid = [];
for r in (recips) {
if (r.has_ancestor($mail_list))
valid = [@valid, r];
else
invalid = [@invalid, r];
}
if (invalid)
throw(~invrcpt, "Invalid mail recipients: " + (invalid.map('name)), invalid);
recips = valid;
invalid = [];
// ok, now that we have that cleared up, lets set pertinent info...
.set_time(time());
.set_from(sender());
// and now to finalize the recipients
for r in (recips) {
if (r.list_is_sendable_by(sender())) {
r.add_mail();
.add_recipient(r);
} else {
invalid = [@invalid, r];
}
}
delivered = 1;
return invalid;
.
method new_mail
var new;
if (!($mail_utils.has_mail_perms(caller())))
(> .perms(sender()) <);
if (definer() != $mail)
throw(~perm, "Only spawn mail from $mail.");
new = .spawn();
new.add_writer(sender());
new.set_manager(new);
return new;
.