Axapta 从AOS服务器发送电子邮件

Axapta 从AOS服务器发送电子邮件,axapta,x++,dynamics-ax-2009,aot,Axapta,X++,Dynamics Ax 2009,Aot,我正在尝试根据用户在其客户端触发的某些事件发送电子邮件。我不希望从客户端发送电子邮件(因为这需要我们允许域中几乎每个工作站都使用SMTP服务),而是从AOS服务器发送 我想创建一个类来扩展RunBaseBatch,并在其中使用SysMailer 这是我到目前为止所拥有的 class Batch_Mailer extends RunBaseBatch { str subject; str body; str fromName; str fromAddress;

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

我认为扩展
RunBaseBatch
和重写
run
可以做到这一点,但显然不行。有什么想法吗

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


谢谢

扩展
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();

扩展
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();

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

请参阅我的博客帖子:


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

请参阅我的博客帖子:


谢谢。我想我需要使用类似于
RunAsPermission
的东西,因为即使与对系统有相当多访问权限的用户一起运行此代码,我也会遇到类似
请求“InteroperMission”类型的权限失败之类的错误。
这修复了它:谢谢。我想我需要使用类似于
RunAsPermission
的东西,因为即使与对系统有大量访问权限的用户一起运行此代码,我也会遇到类似
请求“InteroperMission”类型权限失败的错误。
这修复了它: