2
var SITE_URL = Meteor.absoluteUrl();

function sendEmailNotification(type, sourceUser, recipients, notificationObject) {
    var emailFrom = 'server@example.com';
    var emailSubject = 'MyApp: ';
    var emailBody = '';
    $.each(recipients, function (index, recipient) {
        recipients[index] = recipient + '@example.com';
    });

    switch(type) {
        case 'item_assigned':
            emailSubject += notificationObject.item_title;
            emailBody += '<div style="padding:10px;">';
            emailBody += sourceUser;
            emailBody += ' has assigned you an action item';
            emailBody += '</div>'
            break;
        case 'list_shared':
            emailSubject += notificationObject.list_title;
            emailBody += '<div style="padding:10px;">';
            emailBody += sourceUser;
            emailBody += ' has shared a list with you: ';
            emailBody += '<a href="' + SITE_URL + '#' + notificationObject.list_id + '">' + notificationObject.list_title + '</a>';
            emailBody += '</div>'
            break;
    }
    if (Meteor.isServer) {
        // This function only runs on server
        Email.send({
            from: emailFrom,
            bcc: recipients,
            subject: emailSubject,
            html: emailBody
        });
    }
}

上記の関数はルートのJSファイルにあります(したがって、そのコードはクライアントとサーバーの両方で使用できます)。しかし、クライアントコードで呼び出すと、何も起こりません。アプリにemailパッケージが含まれています。MAIL_URLローカルマシン(Windows 7)では、変数が設定されていません。したがって、Email.send()関数を呼び出すと、コマンドプロンプトで出力が生成されるのが理想的ですが、実際には何も出力されません。

本番サーバーでは、SMTPが適切に設定されており、他のアプリケーションも同じ設定でメールを送信できます。そこで環境変数を正しく設定しましたMAIL_URLが、それでもメールは送信されません。

私のコードに問題があるかどうか誰かに教えてもらえますか?私が正しくやっていないことはありますか?

PS:以下のコードのように、Email.send()を直接呼び出しようとしましたが、それでも何も起こりませんでした。

if (Meteor.isServer) {
    Email.send({
        from: 'server@example.com',
        to: 'my-gmail-id@gmail.com',
        subject: 'This is a test email',
        html: '<b>Congrats, it works!</b>'
    });
}



    }
});
4

2 に答える 2

3

Meteor の電子メールのほとんどの複製は未定義です

サンプル コードについては、このプル リクエストを参照してください。

明確にするために: Meteor はクライアントとサーバーのコードをそのように順番に実行しません。クライアントとサーバーで何が実行されているかをより明確にする必要があります。JavaScript ページに沿った直線的な実行という観点から考えるのではなく、Meteor コードの各部分がイベントの結果として実行されると考えてください。コードの一部が実行されていない場合は、それをトリガーしたイベントがないためです。

于 2012-12-11T09:09:35.373 に答える
0

Meteor.methods上記のコード全体 を使用してサーバー側のメソッドを作成し、そこに配置することで解決しました。

var SITE_URL = Meteor.absoluteUrl();

Meteor.methods({
    sendEmailNotification: function (type, sourceUser, recipients, notificationObject) {
        if (recipients.length > 0) {
            var emailFrom = 'app@example.com';
            var emailSubject = 'MyApp: ';
            var emailBody = '';
            for (var i = 0; i < recipients.length; i++) {
                recipients[i] = recipients[i] + '@example.com';
            }

            switch (type) {
                case 'item_assigned':
                    emailSubject += notificationObject.item_title;
                    emailBody += '<div style="padding:10px;">';
                    emailBody += sourceUser;
                    emailBody += ' has assigned you an action item';
                    emailBody += '</div>'
                    break;
                case 'list_shared':
                    emailSubject += notificationObject.list_title;
                    emailBody += '<div style="padding:10px;">';
                    emailBody += sourceUser;
                    emailBody += ' has shared a list with you: ';
                    emailBody += '<a href="' + SITE_URL + '#' + notificationObject.list_id + '">' + notificationObject.list_title + '</a>';
                    emailBody += '</div>'
                    break;
            }
            Email.send({
                from: emailFrom,
                bcc: recipients,
                subject: emailSubject,
                html: emailBody
            });
        }
    }
});

クライアント コードで上記の関数を呼び出すには、次を使用します。

Meteor.call('sendEmailNotification', 'list_shared', Meteor.user().username, [sharedUserName], listDetails);
于 2012-12-22T17:47:16.483 に答える