new object $mail_message: $has_text, $mail_root;
var $mail_message creator = 0;
var $mail_message delivered = 0;
var $mail_message header = #[];
var $mail_message meta = 0;
var $mail_message readers = [];
var $root created_on = 796268969;
var $root fertile = 1;
var $root flags = ['methods, 'code, 'fertile, 'core, 'variables];
var $root inited = 1;
var $root managed = [$mail_message];
var $root manager = $mail_message;
var $root quota_exempt = 1;
public method .add_reader(): nooverride {
arg who;
if (!($mail_lib.has_mail_perms(caller())))
(> .perms(sender()) <);
readers = readers.union([who]);
};
public method .add_recipient(): nooverride {
arg whom;
var current;
if (!($mail_lib.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]));
};
public method .body() {
if (!($mail_lib.has_mail_perms(caller())))
(> .perms(sender()) <);
return .text();
};
public method .creator() {
return creator;
};
public method .del_recipient(): nooverride {
arg whom;
var rcpts;
if (!($mail_lib.has_mail_perms(caller())))
(> .perms(sender()) <);
rcpts = (header['rcpt]).setremove(whom);
if (!rcpts)
.destroy();
else
header = header.add('rcpt, rcpts);
};
public method .did_read(): nooverride {
if (!($mail_lib.has_mail_perms(caller())))
(> .perms(sender()) <);
if ($guest in (sender().parents()))
return;
readers = setadd(readers, sender());
};
public method .format(): nooverride {
arg @metainfo;
var output, o, h, line, br, sep, i;
if (!($mail_lib.has_mail_perms(caller())))
(> .perms(sender()) <);
h = .header();
o = [];
br = $cml_lib.format_br_tag();
sep = $cml_lib.format_sep_tag();
if (metainfo) {
for i in (meta || [])
o += [$cml_lib.format_tr_tag($cml_lib.format_td_tag(("I-" + (i[1])) + ":"), $cml_lib.format_td_tag(i[2]))];
}
o += [$cml_lib.format_tr_tag($cml_lib.format_td_tag("From:"), $cml_lib.format_td_tag($object_lib.get_name(h['from], 'mail_name)))];
o += [$cml_lib.format_tr_tag($cml_lib.format_td_tag("To:"), $cml_lib.format_td_tag(((h['rcpt]).omap($mail_lib, 'mail_name)).to_english()))];
o += [$cml_lib.format_tr_tag($cml_lib.format_td_tag("When:"), $cml_lib.format_td_tag($time.format("%I:%M %p %d-%b-%Y", h['time])))];
o += [$cml_lib.format_tr_tag($cml_lib.format_td_tag("Subject:"), $cml_lib.format_td_tag(h['subj]))];
output = [$cml_lib.format_table_tag("18%,82%", @o), sep, map line in (.text()) to ([line, br]), sep];
return $ctext_frob.new_with(output);
};
public method .from(): nooverride {
if (!($mail_lib.has_mail_perms(caller())))
(> .perms(sender()) <);
return (| header['from] |) || $no_one;
};
public method .has_read(): nooverride {
arg who;
return who in readers;
};
public method .header(): nooverride {
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;
};
root method .init_mail_message() {
header = #[];
readers = [];
.set_flags([]);
};
public method .meta(): nooverride {
if (!($mail_lib.has_mail_perms(caller())))
(> .perms(sender()) <);
return meta || [];
};
public method .new_mail(): nooverride {
var new, suffix;
// if (!$mail_lib.has_mail_perms(caller()))
// (> .perms(sender()) <);
if (definer() != this())
throw(~perm, "Only spawn mail from $mail_message.");
suffix = tosym("mail_" + (.get_obj_suffix()));
new = (> $sys.spawn_selfmanager(suffix, sender()) <);
// since anybody can create mail, do some tracking..
new.set_creator(user());
return new;
};
public method .readers(): nooverride {
if (!($mail_lib.has_mail_perms(caller())))
(> .perms(sender()) <);
return readers;
};
public method .recipients(): nooverride {
if (!($mail_lib.has_mail_perms(caller())))
(> .perms(sender()) <);
return (| header['rcpt] |) || [$no_one];
};
public method .send() {
arg @recips;
var r, valid, invalid;
if (!($mail_lib.has_mail_perms(caller())))
(> .perms(sender()) <);
if (delivered)
throw(~delivered, "This mail has already been delivered.");
if (!recips)
recips = .recipients();
if (((recips.length()) == 1) && ((recips[1]) == $no_one))
throw(~norcpt, "No recipients specified.");
valid = [];
invalid = [];
for r in (recips) {
if (r.has_ancestor($mail_list))
valid += [r];
else
invalid += [r];
}
if (invalid)
throw(~invrcpt, "Invalid mail recipients: " + (invalid.mmap('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 += [r];
}
}
delivered = 1;
return invalid;
};
private method .set_creator() {
arg who;
creator = who;
};
public method .set_from(): nooverride {
arg whom;
if (!($mail_lib.has_mail_perms(caller())))
(> .perms(sender()) <);
header = header.add('from, whom);
};
public method .set_meta(): nooverride {
arg new_meta;
if (!($mail_lib.has_mail_perms(caller())))
(> .perms(sender()) <);
meta = new_meta;
};
public method .set_recipients(): nooverride {
arg whom;
if (!($mail_lib.has_mail_perms(caller())))
(> .perms(sender()) <);
header = header.add('rcpt, whom);
};
public method .set_subject(): nooverride {
arg what;
if (!($mail_lib.has_mail_perms(caller())))
(> .perms(sender()) <);
header = header.add('subj, what);
};
public method .set_time(): nooverride {
arg time;
if (!($mail_lib.has_mail_perms(caller())))
(> .perms(sender()) <);
header = header.add('time, time);
};
public method .subject(): nooverride {
return (| header['subj] |) || "<none>";
};
protected method .text() {
return (> pass() <) || ["", "(no message)", ""];
};
public method .time(): nooverride {
if (!($mail_lib.has_mail_perms(caller())))
(> .perms(sender()) <);
return (| header['time] |) || 0;
};
root method .uninit_mail_message() {
var r;
for r in (.recipients())
(| r.del_mail(this(), (| (.from()) || this() |)) |);
header = #[];
readers = [];
};