using Aliyun.Acs.Core;
using Aliyun.Acs.Core.Exceptions;
using Aliyun.Acs.Core.Profile;
using Aliyun.Acs.Dysmsapi.Model.V20170525;
using System;
using System.Collections.Generic;
using Newtonsoft.Json;
using System.IO;
using System.Collections;
using System.Text.RegularExpressions;
namespace ALIYUNShortMessage
{
public enum Result
{
Success = 0, Error, ExistFailPhone, TamplateError, ParamError, SignNameError
}
public class ALIYUNSMS
{
const int msgChar = 26;
const String product = "Dysmsapi";
//产品域名,开发者无需替换
/// 发送短信
/// </summary>
/// <param name="phoneNumbers">短信接收号码,支持以逗号分隔的形式进行批量调用,批量上限为1000个手机号码,批量调用相对于单条调用及时性稍有延迟,验证码类型的短信推荐使用单条调用的方式</param>
/// <param name="signName">短信签名</param>
/// <param name="templateCode">短信模板code</param>
/// <param name="Param">短信模板替换</param>
/// <param name="accessKey">阿里云AK</param>
/// <param name="failPhoneNumbers">请求回执</param>
/// <returns></returns>
public Result SendSms(List<string> phoneNumbers, String signName, String templateCode, Hashtable Param, List<string> accessKey, ref List<string> failPhoneNumbers)
{
//返回值
var result = Result.Success;
//短信字符数
int characterNum = 0;
//将hashtable转换为json字符串
string TemplateParam = JsonConvert.SerializeObject(Param);
//签名
var SignName = signName;
if (SignName == null)
{
AppendLog("Error", "发送失败,未找到指定的签名。");
result = Result.SignNameError;
failPhoneNumbers = phoneNumbers;
return result;
}
characterNum += SignName.Length;
//模板
var TemplateCode = templateCode;
if (TemplateCode == null)
{
AppendLog("Error", "发送失败,未找到指定的模板。");
result = Result.TamplateError;
failPhoneNumbers = phoneNumbers;
return result;
}
//characterNum += 数据库中模板长度
int successCount = 0;
foreach (var phoneNumber in phoneNumbers)
{
Regex regex = new Regex("^1[345678]\\d{9}$");
if (regex.IsMatch(phoneNumber))
{
var response = Send(phoneNumber, SignName, TemplateCode, TemplateParam, accessKey);
if (response.Message != "OK")
{
AppendLog("Error", response.Message);
result = Result.ExistFailPhone;
failPhoneNumbers.Add(phoneNumber);
}
else
successCount++;
}
else
{
AppendLog("Warn", "存在不合法的手机号码。");
result = Result.ExistFailPhone;
failPhoneNumbers.Add(phoneNumber);
}
}
int msgNum = characterNum / msgChar;
msgNum = characterNum % msgChar == 0 ? msgNum : msgNum + 1;
msgNum *= successCount;
AppendLog("Success", "已发送" + msgNum + "条信息.");
return result;
}
private void AppendLog(string type, string msg)
{
//日志文件路径
var path = AppDomain.CurrentDomain.BaseDirectory;
path += "\\" + DateTime.Now.ToString("yyyyMMdd") + ".log";
if (!File.Exists(path))
File.Create(path).Close();
using (FileStream file = File.Open(path, FileMode.Append, FileAccess.Write))
{
StreamWriter sw = new StreamWriter(file);
sw.WriteLine("[{0}] " + "{1}" + " --" + DateTime.Now.ToString("hh:mm:ss"), type, msg);
sw.Flush();
sw.Close();
file.Close();
}
}
private SendSmsResponse Send(string PhoneNumber, string SignName, string TemplateCode, string TemplateParam, List<string> accessKey)
{
IClientProfile profile = DefaultProfile.GetProfile("cn-hangzhou", accessKey[0], accessKey[1]);
DefaultProfile.AddEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
IAcsClient acsClient = new DefaultAcsClient(profile);
SendSmsRequest request = new SendSmsRequest();
SendSmsResponse response = null;
try
{
//必填:待发送手机号。支持以逗号分隔的形式进行批量调用,批量上限为1000个手机号码,批量调用相对于单条调用及时性稍有延迟,验证码类型的短信推荐使用单条调用的方式
request.PhoneNumbers = PhoneNumber;
//必填:短信签名-可在短信控制台中找到
request.SignName = SignName;
//必填:短信模板-可在短信控制台中找到
request.TemplateCode = TemplateCode;
//可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
//request.TemplateParam = "{\"customer\":\"123\"}";
request.TemplateParam = TemplateParam;
//可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
//request.OutId = "yourOutId";
//请求失败这里会抛ClientException异常
response = acsClient.GetAcsResponse(request);
}
catch (ServerException e)
{
AppendLog("Error", "发送失败,错误信息:" + e.Message);
//Debug.WriteLine(e.ErrorCode);
}
catch (ClientException e)
{
AppendLog("Error", "发送失败,错误信息:" + e.Message);
//Debug.WriteLine(e.ErrorCode);
}
return response;
}
}
}
using Aliyun.Acs.Core.Exceptions;
using Aliyun.Acs.Core.Profile;
using Aliyun.Acs.Dysmsapi.Model.V20170525;
using System;
using System.Collections.Generic;
using Newtonsoft.Json;
using System.IO;
using System.Collections;
using System.Text.RegularExpressions;
namespace ALIYUNShortMessage
{
public enum Result
{
Success = 0, Error, ExistFailPhone, TamplateError, ParamError, SignNameError
}
public class ALIYUNSMS
{
const int msgChar = 26;
const String product = "Dysmsapi";
//产品域名,开发者无需替换
const String domain = "dysmsapi.aliyuncs.com";
/// 发送短信
/// </summary>
/// <param name="phoneNumbers">短信接收号码,支持以逗号分隔的形式进行批量调用,批量上限为1000个手机号码,批量调用相对于单条调用及时性稍有延迟,验证码类型的短信推荐使用单条调用的方式</param>
/// <param name="signName">短信签名</param>
/// <param name="templateCode">短信模板code</param>
/// <param name="Param">短信模板替换</param>
/// <param name="accessKey">阿里云AK</param>
/// <param name="failPhoneNumbers">请求回执</param>
/// <returns></returns>
public Result SendSms(List<string> phoneNumbers, String signName, String templateCode, Hashtable Param, List<string> accessKey, ref List<string> failPhoneNumbers)
{
//返回值
var result = Result.Success;
//短信字符数
int characterNum = 0;
//将hashtable转换为json字符串
string TemplateParam = JsonConvert.SerializeObject(Param);
//签名
var SignName = signName;
if (SignName == null)
{
AppendLog("Error", "发送失败,未找到指定的签名。");
result = Result.SignNameError;
failPhoneNumbers = phoneNumbers;
return result;
}
characterNum += SignName.Length;
//模板
var TemplateCode = templateCode;
if (TemplateCode == null)
{
AppendLog("Error", "发送失败,未找到指定的模板。");
result = Result.TamplateError;
failPhoneNumbers = phoneNumbers;
return result;
}
//characterNum += 数据库中模板长度
int successCount = 0;
foreach (var phoneNumber in phoneNumbers)
{
Regex regex = new Regex("^1[345678]\\d{9}$");
if (regex.IsMatch(phoneNumber))
{
var response = Send(phoneNumber, SignName, TemplateCode, TemplateParam, accessKey);
if (response.Message != "OK")
{
AppendLog("Error", response.Message);
result = Result.ExistFailPhone;
failPhoneNumbers.Add(phoneNumber);
}
else
successCount++;
}
else
{
AppendLog("Warn", "存在不合法的手机号码。");
result = Result.ExistFailPhone;
failPhoneNumbers.Add(phoneNumber);
}
}
int msgNum = characterNum / msgChar;
msgNum = characterNum % msgChar == 0 ? msgNum : msgNum + 1;
msgNum *= successCount;
AppendLog("Success", "已发送" + msgNum + "条信息.");
return result;
}
private void AppendLog(string type, string msg)
{
//日志文件路径
var path = AppDomain.CurrentDomain.BaseDirectory;
path += "\\" + DateTime.Now.ToString("yyyyMMdd") + ".log";
if (!File.Exists(path))
File.Create(path).Close();
using (FileStream file = File.Open(path, FileMode.Append, FileAccess.Write))
{
StreamWriter sw = new StreamWriter(file);
sw.WriteLine("[{0}] " + "{1}" + " --" + DateTime.Now.ToString("hh:mm:ss"), type, msg);
sw.Flush();
sw.Close();
file.Close();
}
}
private SendSmsResponse Send(string PhoneNumber, string SignName, string TemplateCode, string TemplateParam, List<string> accessKey)
{
IClientProfile profile = DefaultProfile.GetProfile("cn-hangzhou", accessKey[0], accessKey[1]);
DefaultProfile.AddEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
IAcsClient acsClient = new DefaultAcsClient(profile);
SendSmsRequest request = new SendSmsRequest();
SendSmsResponse response = null;
try
{
//必填:待发送手机号。支持以逗号分隔的形式进行批量调用,批量上限为1000个手机号码,批量调用相对于单条调用及时性稍有延迟,验证码类型的短信推荐使用单条调用的方式
request.PhoneNumbers = PhoneNumber;
//必填:短信签名-可在短信控制台中找到
request.SignName = SignName;
//必填:短信模板-可在短信控制台中找到
request.TemplateCode = TemplateCode;
//可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
//request.TemplateParam = "{\"customer\":\"123\"}";
request.TemplateParam = TemplateParam;
//可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
//request.OutId = "yourOutId";
//请求失败这里会抛ClientException异常
response = acsClient.GetAcsResponse(request);
}
catch (ServerException e)
{
AppendLog("Error", "发送失败,错误信息:" + e.Message);
//Debug.WriteLine(e.ErrorCode);
}
catch (ClientException e)
{
AppendLog("Error", "发送失败,错误信息:" + e.Message);
//Debug.WriteLine(e.ErrorCode);
}
return response;
}
}
}