110,565
社区成员
发帖
与我相关
我的任务
分享
namespace RpEmailService
{
partial class MailService
{
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region 组件设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要
/// 使用代码编辑器修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.tmiService = new System.Timers.Timer();
((System.ComponentModel.ISupportInitialize)(this.tmiService)).BeginInit();
//
// tmiService
//
this.tmiService.Interval = 5000;
this.tmiService.Elapsed += new System.Timers.ElapsedEventHandler(this.tmiService_Elapsed);
//
// MailService
//
this.ServiceName = "MailService";
((System.ComponentModel.ISupportInitialize)(this.tmiService)).EndInit();
}
#endregion
private System.Timers.Timer tmiService;
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using Model;
using hMailServer;
using System.Xml;
using System.Net;
using System.IO;
using System.Xml.Linq;
namespace RpEmailService
{
public partial class MailService : ServiceBase
{
public MailService()
{
InitializeComponent();
}
/// <summary>
/// 开始服务
/// </summary>
/// <param name="args"></param>
protected override void OnStart(string[] args)
{
this.tmiService.Enabled = true;
}
/// <summary>
/// 停止服务
/// </summary>
protected override void OnStop()
{
this.tmiService.Enabled = false;
}
private void tmiService_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
this.tmiService.Enabled = false;
CallBackMail();
this.tmiService.Enabled = true;
}
#region Post更新后的未回复邮件
/// <summary>
/// Post更新后的未回复邮件
/// </summary>
private void CallBackMail()
{
List<ClientMessages> replyMails = BLL.ClientMessagesBLL.SelectClientMessage();//获取未回复邮件
if (replyMails != null && replyMails.Count > 0)
{
//Post邮件信息,更新未回复邮件
for (int i = 0; i < replyMails.Count; i++)
{
FileStream fs = new FileStream("E://MailLog.txt", FileMode.Append);
StreamWriter sw = new StreamWriter(fs);//重写该文件,不存在则创建
sw.WriteLine("----------------i--------------------");
sw.WriteLine(i);
sw.WriteLine("----------------replyMails.Count--------------------");
sw.WriteLine(replyMails.Count);
sw.Flush();
sw.Close();
fs.Close();
//得到邮件的装态
DeliveryStatus d = new DeliveryStatusClass();
String status = "";//邮件发送状态
switch (d.GetDeliveryStatus(replyMails[i].ServerMessageGUID, replyMails[i].ClientToAddress))
{
case "SendFail":
status = "发送失败";
break;
case "SendOK":
status = "发送成功";
break;
case "NoRecord":
status = "没有此记录";
break;
case "SendQuotas":
status = "发件人邮箱已满,拒绝发送邮件";
break;
default:
status = "未获取到发送状态";
break;
}
String mailStr = string.Format(@"<?xml version='1.0' encoding='UTF-8'?><SendStatus><mail gid={0} recipientaddress ={1} status={2}/></SendStatus>", replyMails[i].ClientMessageGID, replyMails[i].ClientToAddress, status);
try
{
String result = PostDataToUrl(mailStr, replyMails[i].ClientCallBackAddress);
if (result.Equals("OK"))
{
//更新邮件回复状态为已读
BLL.ClientMessagesBLL.UpdateMessageReplyed(replyMails[i].ClientMessageID);
}
}
catch (Exception ex)
{
FileStream fs1 = new FileStream("E://MailLog1.txt", FileMode.Append);
StreamWriter sw1 = new StreamWriter(fs);//重写该文件,不存在则创建
sw1.WriteLine("----------------Exception--------------------");
sw1.WriteLine(ex.Message);
sw.Flush();
sw.Close();
fs.Close();
continue;
}
}
}
}
#endregion
#region post
const string sUserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727)";
const string sContentType =
"application/x-www-form-urlencoded";
const string sResponseEncoding = "gb2312";
/// <summary>
/// 数据转换类型
/// </summary>
/// <param name="data">要post的数据</param>
/// <param name="url">目标url</param>
/// <returns>服务器响应</returns>
static string PostDataToUrl(string data, string url)
{
Encoding encoding = Encoding.Unicode;
byte[] bytesToPost = encoding.GetBytes(data);
return PostDataToUrl(bytesToPost, url);
}
/// <summary>
/// Post data到url
/// </summary>
/// <param name="data">要post的数据</param>
/// <param name="url">目标url</param>
/// <returns>服务器响应</returns>
static string PostDataToUrl(byte[] data, string url)
{
WebRequest webRequest = WebRequest.Create(url);
HttpWebRequest httpRequest = webRequest as HttpWebRequest;
if (httpRequest == null)
{
throw new ApplicationException(
string.Format("Invalid url string: {0}", url)
);
}
httpRequest.UserAgent = sUserAgent;
httpRequest.ContentType = sContentType;
httpRequest.Method = "POST";
httpRequest.Timeout = 5000;
httpRequest.ContentLength = data.Length;
Stream requestStream = httpRequest.GetRequestStream();
requestStream.Write(data, 0, data.Length);
requestStream.Close();
// Stream responseStream;
string stringResponse = string.Empty;
try
{
//解析服务器返回状态信息
//responseStream = httpRequest.GetResponse().GetResponseStream();
// using (StreamReader responseReader =
// new StreamReader(responseStream, Encoding.GetEncoding(sResponseEncoding)))
// {
// stringResponse = responseReader.ReadToEnd();
// }
//responseStream.Close();
HttpWebResponse cnblogsRespone = (HttpWebResponse)httpRequest.GetResponse();
stringResponse = cnblogsRespone.StatusCode.ToString();
}
catch
{
}
return stringResponse;
}
#endregion
}
}
//将:
httpRequest.ContentType = sContentType;
//改为:
httpRequest.ContentType ="text/XML";
//还有在抛XML格式的数据时,最好生成XML对象然后生成byte[]数据流
XmlDocument xmldoc = CreatXml();//创建邮件XML对象
byte[] mail = System.Text.Encoding.UTF8.GetBytes(xmldoc.InnerXml);//解释成POST的数据流
//不建议自己直接拼接XML字符串POST出去
//小小的一点经验,希望能帮助大家。嘿嘿!