2

PasswordRecovery コントロールを使用していますが、複数のアカウントが同じ電子メールを使用している場合、複数の電子メールを送信できません。Membership.FindUsersByEmail で MembershipUserCollection を取得します。次に、foreach でループします。私の問題は、複数のユーザーがいる場合、最後のメールのみを送信することです。ループするときに各アカウントのメールを送信するにはどうすればよいですか? デリゲートは正しい回数呼び出されます。また、全員が同じメールに送信されることはわかっていますが、アカウントごとに 1 つずつ送信されるようにしたいと考えています。

コード スニップ:

protected void PasswordRecovery1_SendingMail(object sender, MailMessageEventArgs e)
{

}

bool IsValidEmail(string strIn)
{
    // Return true if strIn is in valid e-mail format.
    return Regex.IsMatch(strIn, @"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$");
}


protected void PasswordRecovery1_VerifyingUser(object sender, LoginCancelEventArgs e)
{
    if (IsValidEmail(PasswordRecovery1.UserName))
    {
        // string uName = Membership.GetUserNameByEmail(PasswordRecovery1.UserName) ?? PasswordRecovery1.UserName;
        MembershipUserCollection users = Membership.FindUsersByEmail(PasswordRecovery1.UserName);
        if (users.Count < 1)
        {
            PasswordRecovery1.UserName = " ";
            PasswordRecovery1.UserNameFailureText = "That user is not available"; }
        else
        {
            foreach (MembershipUser user in users)
            {

                PasswordRecovery1.UserName = user.UserName;
                PasswordRecovery1.SendingMail += PasswordRecovery1_SendingMail;
                PasswordRecovery1.SuccessTemplateContainer.Visible = true;

            }

        }
    }
    else
    { 
        PasswordRecovery1.UserName = " ";
        PasswordRecovery1.UserNameFailureText ="Please enter a valid e-mail";           
    }
}
4

1 に答える 1

1

それを理解しました...私が最初にやっていた方法はうまくいかなかったので、私はセミカスタムに行きました。送信ボタンにイベントハンドラーを追加し、以下のようにコードを編集しました。ご覧のとおり、私は単にコレクションをループしました。確かに最高ではありませんが、機能し、理解しやすいです。

電子メールの本文は、html形式のtxtファイルで作成されます。mailDefinitionクラスを使用すると、置換文字列を使用できるため、メール本文の作成が簡単になります。

アカウントごとに個別のメールを同じメールに送信します。それらすべてを1つのメールにまとめることもできましたが、これが彼らが望んでいたことです...

protected void PasswordRecovery1_SendingMail(object sender, MailMessageEventArgs e)
{
    e.Cancel = true;
}

bool IsValidEmail(string strIn)
{
    // Return true if strIn is a valid e-mail
    return Regex.IsMatch(strIn, @"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$");
}

protected void SubmitLinkButton_Click(object sender, EventArgs e)
{
    if (IsValidEmail(PasswordRecovery1.UserName))
    {
        // Get user collection by shared email
        MembershipUserCollection users = Membership.FindUsersByEmail(PasswordRecovery1.UserName);
        if (users.Count < 1)
        {
            PasswordRecovery1.UserName = " ";
            PasswordRecovery1.UserNameFailureText = "That user is not available";
        }
        else
        {
            // Loop and email each user in collection
            foreach (MembershipUser user in users)
            {
                MembershipUser ur = Membership.GetUser(user.UserName);

                DateTime now = DateTime.Now;

                // Using MailDefinition instead of MailMessage so we can substitue strings
                MailDefinition md = new MailDefinition();

                // list of strings in password.txt file to be replace
                ListDictionary replacements = new ListDictionary();
                replacements.Add("<%UserName%>", ur.UserName);
                replacements.Add("<%Password%>", ur.GetPassword());

                // Text file that is in html format
                md.BodyFileName = "absolute path to password.txt";
                md.IsBodyHtml = true;
                md.Priority = MailPriority.High;
                md.Subject = "Email Subject Line - " + now.ToString("MM/dd - h:mm tt");
                md.From = ConfigurationManager.AppSettings["FromEmailAddress"];

                // Add MailDefinition to the MailMessage
                MailMessage mailMessage = md.CreateMailMessage(ur.Email, replacements, this);
                mailMessage.From = new MailAddress(ConfigurationManager.AppSettings["FromEmailAddress"], "Friendly Name");
                SmtpClient m = new SmtpClient();
                m.Host = "127.0.0.1";
                m.Send(mailMessage);

                PasswordRecovery1.UserName = user.UserName;

                PasswordRecovery1.SendingMail += PasswordRecovery1_SendingMail;
            }

        }
    }
    else
    {
        PasswordRecovery1.UserName = " ";
        PasswordRecovery1.UserNameFailureText = "Please enter a valid e-mail";
    }
}
于 2012-08-20T18:05:25.863 に答える