我正在尝试根据用户在其客户端中触发的某些事件发送电子邮件。我不希望从客户端发送电子邮件(因为这将要求我们允许域中的几乎每个工作站都使用SMTP服务),而是来自AOS服务器。
我想过要创建一个扩展RunBaseBatch
并在其中使用SysMailer
的类。
这是我到目前为止所拥有的。
class Batch_Mailer extends RunBaseBatch
{
str subject;
str body;
str fromName;
str fromAddress;
str toAddress;
str smtpServer;
void new(str _subject, str _body, str _fromName, str _fromAddress, str _toAddress)
{
subject = _subject;
body = _body;
fromName = _fromName;
fromAddress = _fromAddress;
toAddress = _toAddress;
smtpServer = 'mail.domain.ca';
super();
}
public boolean canGoBatchJournal()
{
return true;
}
public void run()
{
SysMailer mail;
;
super();
try
{
mail = new SysMailer();
mail.fromAddress(fromAddress, fromName);
mail.SMTPRelayServer(smtpServer);
mail.tos().appendAddress(toAddress);
mail.htmlBody(strfmt(body));
mail.subject(subject);
mail.sendMail();
}
catch
{
//Log something maybe, but nice if the infolog would not pop up...
}
}
}
以下是我如何使用它:
Batch_Mailer mail;
mail = new Batch_Mailer("Subject.", strfmt("@VDX488", vendTable.AccountNum, curUserId()), "AX Alerts",
"AXAlerts@domain.ca", "test.mailbox@domain.ca"
不幸的是,这似乎在客户端运行。如果我在启用了AOS服务器的开发盒VM上运行代码(可以使用SMTP服务),则会触发电子邮件,但是如果我在物理盒上的客户端中运行它(不允许使用SMTP)服务)。
我认为延长RunBaseBatch
并覆盖run
会做到这一点,但显然不是。有什么想法吗?
我也想知道这种方法是否会失败,因为我不认为大多数用户可以使用他们的帐户运行批处理...也许我将不得不使用模拟?
谢谢!
答案 0 :(得分:4)
扩展RunBaseBatch
并不意味着它总是在服务器层上执行 - 代码实际执行的位置取决于对象所在的位置。
因此,您可以确保始终在服务器层上执行代码,方法是确保始终在此处创建此类对象。要完成此操作,只需创建一个server static
方法,用于创建类的新实例。
示例:
public static server Batch_Mailer newOnServer(
str _subject,
str _body,
str _fromName,
str _fromAddress,
str _toAddress)
{
;
return new Batch_Mailer(_subject, _body, _fromName, _fromAddress, _toAddress);
}
之后你只需要调用这个静态方法而不是直接使用new
:
mail = Batch_Mailer::newOnServer("Subject.", strfmt("@VDX488" ...
mail.run();
答案 1 :(得分:2)
DAXaholic的回答是回答您的问题,但也许您应该考虑使用内置的AX框架来发送电子邮件而不是编写自己的方法。我想你将会遇到更少的问题,并且更容易升级到2012 +。
请参阅我的博文:
http://alexondax.blogspot.com/2013/09/how-to-properly-send-emails-with-built.html