1

我正在尝试根据用户在其客户端中触发的某些事件发送电子邮件。我不希望从客户端发送电子邮件(因为这将要求我们允许域中的几乎每个工作站都使用 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 服务器(可以使用 SMTP 服务)上的开发框 VM 上运行代码,则电子邮件会触发,但如果我在物理框上的客户端中运行它(不允许使用 SMTP)则不会服务)。

我认为扩展RunBaseBatch和覆盖run会做到这一点,但显然不是。有任何想法吗 ?

我还想知道这种方法是否会失败,因为我认为大多数用户不能使用他们的帐户运行批处理......也许我必须使用模拟?

谢谢!

4

2 回答 2

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();
于 2014-03-01T16:52:10.153 回答
2

DAXaholic 的答案是对您问题的回答,但也许您应该考虑使用内置的 AX 框架来发送电子邮件,而不是编写自己的方法。我想你会遇到更少的问题,并且更容易升级到 2012+。

见我的博文:

http://alexondax.blogspot.com/2013/09/how-to-properly-send-emails-with-built.html

于 2014-03-03T16:59:20.333 回答