반응형

매번 SMTP를 25번 , 587번으로만 보내다가 465 Port는 보내지지 않았었는데

 

해당 아래 소스로 465번 포트도 보내지는 것을 확인했다.

 

아래 소스로 이메일 전송 로직을 만들었다.

[HttpPost]
public void SendEmail_PORT465(HttpFileCollectionBase files, string strPath, string strSubject, string strBody)
{
    System.Web.Mail.MailMessage msg = new System.Web.Mail.MailMessage();
    msg.Subject = strSubject;

    msg.Body = strBody;
    msg.BodyFormat = System.Web.Mail.MailFormat.Html;
    msg.BodyEncoding = System.Text.Encoding.UTF8;

    msg.From = "From";
    msg.To = "To";


    msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpserver", "Host");
    msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpserverport", "465");
    msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusing", "2");

    msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate", "1");
    //User name
    msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusername", "smtp ID");
    //Password
    msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendpassword", "smtp PW");
    msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpusessl", "true");

    System.Web.Mail.SmtpMail.SmtpServer = "smtp Host";
    System.Web.Mail.SmtpMail.Send(msg);


}
반응형

파일 다운로드 로직을 만들었을때 Return File을 사용하여 브라우저에서 다운로드를 받을 수 있게 만들었었다.

이번 프로젝트에서도 파일 다운로드 로직이 있었고 기존대로 사용하였는데 문제가 발생 하였다.

이미지로 데이터 화 시켜서 올렸을 때 '아이폰' 에서는 Content Type에 따라서 확장자가 변경되어 저장이 되고 있었다.

 

실제로 사용하던 Return 형태

return File(파일명, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", 다운로드 받을 때 파일명);

 

Content Type을 보면 알겠지만 예전에 엑셀 파일을 다운로드 받을 때 사용했었던 Excel Content Type 이였는데

브라우저에서 받을 때 혹은 안드로이드에서 받을 때는 문제가 되지 않았다.

 

다만 아이폰에서 받았을 때 이미지 파일임에도 불구하고 뒤에 .xlsx가 붙어서 다운로드가 되었다.

이미지 형태로 여러가지 받아야 하는 상황이여서 파일이 유동적으로 변하기 때문에 골치 아팠다.

 

File 매개변수는 무조건 파일명과 Content Type을 입력해야했기 떄문에 자체적으로 판단하여 파일이 다운로드 됐으면 했는데 아래와 같은 방법으로 해결하였다.

return File(파일명, "application/octet-stream", 다운로드 시 파일명);

 

현재 파일 다운로드 로직 상 bmp , jpg , jpeg , jpe , jfif , tif , tiff , png 해당 확장자만 저장 되게끔 사용되고 있어서 

해당 확장자들은 정상적으로 다운로드 되는 것 까지 확인 하였다.

반응형

오랜만에 C#으로 찾아왔습니다.

 

Linq 라는 것은 데이터와 데이터를 비교하여 필요한 데이터를 다시 새롭게 재 구성하기 위해서 쓰는 것이라고 요번에 습득 하였습니다.

 

이번 로직을 만들면서 2가지를 다시 배웠습니다.

 

1. LinQ는 데이터와 데이터를 재 구성하여 필요한 데이터만 찾을 수 있다.

2. DataTable에도 타입이 존재한다.

 

2번 같은 경우는 select를 다시 할 때 무척이나 애 먹었습니다..

실제 오라클 테이블에 Number로 정의가 되어있어서 데이터테이블로 데이터를 가져왔을때 컬럼 타입이 Int32로 구성되어있어서 그 부분을 확인 하지 못해 엄청난 삽질을 하였습니다.

 

아래는 제가 Linq를 사용하여 데이터를 구성한 로직입니다.

 

감사합니다.

 

//APIdt , Resultdt는 데이터 테이블 형식 입니다. 
var query = (from APIData in APIdt.AsEnumerable()
			 join dbData in Resultdt.AsEnumerable()
			 on new
			 {
				 //비교할 이름을 같게 해주어야 합니다. TEST1 , TEST2
				 TEST1 = APIData.Field<string>("TEST1"),
				 TEST2 = APIData.Field<string>("TEST2")
			 }
			 equals new
			 {
				//비교할 이름을 같게 해주어야 합니다. TEST1 , TEST2
				 TEST1 = dbData.Field<string>("TEST1"),
				 TEST2 = dbData.Field<string>("TEST2")
			 }
			 select new
			 {
				 //Field 형식이 굉장히 중요하기 떄문에 데이터테이블의 타입이 어떤것인지 꼭 확인이 필요합니다. 
				 //Test1 , Test2 , Test3 , Test4는 변수입니다. 
				 Test1 = APIData.Field<string>("REQ_SVC"),
				 Test2 = dbData.Field<int>("FCL_CNT"),
				 Test3 = dbData.Field<int>("LCL_CNT"),
				 Test4 = dbData.Field<int>("CONSOL_CNT")
			 });                    

//데이터테이블을 생성 해 줍니다.
DataTable Final_DT = new DataTable();
Final_DT.Columns.Add("Test1");
Final_DT.Columns.Add("Test2");
Final_DT.Columns.Add("Test3");
Final_DT.Columns.Add("Test4");

//구성된 데이터를 다시 데이터테이블로 만들어줍니다. 
foreach (var item in query)
{
	DataRow Final_Dr = Final_DT.NewRow();
	Final_Dr["Test1"] = item.Test1;
	Final_Dr["Test2"] = item.Test2;
	Final_Dr["Test3"] = item.Test3;
	Final_Dr["Test4"] = item.Test4;
	Final_DT.Rows.Add(Final_Dr);
}

완성된 데이터 테이블
Final_DT

 

반응형

Dictionary나 dataTable에 데이터를 .ToString()으로 가져올때 Null 값이면 오류를 발생 시킨다.

 

그것을 방지하기 위한 아래의 변수 설정을 지정해주면 된다.

public string fnTest(Dictionary<string, string> Di)
{
    string sSql = "";

    string Opt = "";
    string Type = "";
    string SearchText = "";
    int pageIndex = 0;

    if (Di.ContainsKey("Option"))
    {
    Opt = Di["Option"] == null ? "" : Di["Option"].ToString();
    }

    if (Di.ContainsKey("Type"))
    {
    Type = Di["Type"] == null ? "" : Di["Type"].ToString();
    }

    if (Di.ContainsKey("SearchText"))
    {
    SearchText = Di["SearchText"] == null ? "" : Di["SearchText"].ToString();
    }

    if (Di.ContainsKey("Page"))
    {
    pageIndex = Di["Page"] == null ? 0 : Int32.Parse(Di["Page"].ToString());
    }
}

이와 마찬가지로 DataTable도 동일하게 하면 된다.

public string fnTest(DataRow dr)
{
        string sSql = "";

        string Opt = "";
        string Type = "";
        string SearchText = "";
        int pageIndex = 0;

        if (dr.ContainsKey("Option"))
        {
        	Opt = dr["Option"] == null ? "" : dr["Option"].ToString();
        }

        if (dr.ContainsKey("Type"))
        {
        	Type = dr["Type"] == null ? "" : dr["Type"].ToString();
        }

        if (dr.ContainsKey("SearchText"))
        {
        	SearchText = dr["SearchText"] == null ? "" : dr["SearchText"].ToString();
        }

        if (dr.ContainsKey("Page"))
        {
        	pageIndex = dr["Page"] == null ? 0 : Int32.Parse(dr["Page"].ToString());
      	}
}

 

반응형

ExcelPackage를 사용하여 Dataset로 Excel 만들기.

전체 셀의 옵션 선택도 가능하고 맨 위의 header 부분도 배경화면 및 폰트 적용 가능합니다.

 

using (ExcelPackage pck = new ExcelPackage())
{
	ExcelWorksheet workSheet = pck.Workbook.Worksheets.Add(ds.Tables["Table"].TableName);

	Color DeepBlueHexCode = ColorTranslator.FromHtml("#c6efce");

	//가로 길이
	workSheet.Column(1).Width = 30;
	workSheet.Column(2).Width = 13;
	workSheet.Column(3).Width = 20;
	workSheet.Column(4).Width = 20;
	workSheet.Column(5).Width = 15;
	workSheet.Column(6).Width = 15;
	workSheet.Column(7).Width = 125;
	workSheet.Column(8).Width = 8;

	//세로 정렬
	workSheet.Column(1).Style.VerticalAlignment = ExcelVerticalAlignment.Center;
	workSheet.Column(2).Style.VerticalAlignment = ExcelVerticalAlignment.Center;
	workSheet.Column(3).Style.VerticalAlignment = ExcelVerticalAlignment.Center;
	workSheet.Column(4).Style.VerticalAlignment = ExcelVerticalAlignment.Center;
	workSheet.Column(5).Style.VerticalAlignment = ExcelVerticalAlignment.Center;
	workSheet.Column(6).Style.VerticalAlignment = ExcelVerticalAlignment.Center;
	workSheet.Column(7).Style.VerticalAlignment = ExcelVerticalAlignment.Center;
	workSheet.Column(8).Style.VerticalAlignment = ExcelVerticalAlignment.Center;

	//가로 정렬
	workSheet.Column(1).Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
	workSheet.Column(2).Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
	workSheet.Column(3).Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
	workSheet.Column(4).Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
	workSheet.Column(5).Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
	workSheet.Column(6).Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
	workSheet.Column(7).Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
	workSheet.Column(8).Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;

	//폰트 설정
	workSheet.Column(1).Style.Font.SetFromFont(new System.Drawing.Font("나눔고딕", 10));
	workSheet.Column(2).Style.Font.SetFromFont(new System.Drawing.Font("나눔고딕", 10));
	workSheet.Column(3).Style.Font.SetFromFont(new System.Drawing.Font("나눔고딕", 10));
	workSheet.Column(4).Style.Font.SetFromFont(new System.Drawing.Font("나눔고딕", 10));
	workSheet.Column(5).Style.Font.SetFromFont(new System.Drawing.Font("나눔고딕", 10));
	workSheet.Column(6).Style.Font.SetFromFont(new System.Drawing.Font("나눔고딕", 10));
	workSheet.Column(7).Style.Font.SetFromFont(new System.Drawing.Font("나눔고딕", 10));
	workSheet.Column(8).Style.Font.SetFromFont(new System.Drawing.Font("나눔고딕", 10));

	//Header 부분 스타일 적용
	workSheet.Cells["A1:H1"].Style.Font.Bold = true;
	workSheet.Cells["A1:H1"].Style.Fill.PatternType = ExcelFillStyle.Solid;
	workSheet.Cells["A1:H1"].Style.Fill.BackgroundColor.SetColor(DeepBlueHexCode);

	////테두리 border 적용
	var nBorderRowCount = ds.Tables["Table"].Rows.Count + 1;
	var nRowCount = ds.Tables["Table"].Rows.Count;

	string modelRange = "A1:H" + nBorderRowCount.ToString();

	workSheet.Cells[modelRange].Style.Border.Top.Style = ExcelBorderStyle.Thin;
	workSheet.Cells[modelRange].Style.Border.Left.Style = ExcelBorderStyle.Thin;
	workSheet.Cells[modelRange].Style.Border.Right.Style = ExcelBorderStyle.Thin;
	workSheet.Cells[modelRange].Style.Border.Bottom.Style = ExcelBorderStyle.Thin;

	//세팅 완료된 데이터 뿌려주기
	workSheet.Cells["A1"].LoadFromDataTable(ds.Tables["Table"], true);

	//엑셀 파일 저장
	pck.SaveAs(new FileInfo(strRealPath));
}

 

궁굼하신건 댓글로 남겨주세요~

반응형
if (!string.IsNullOrEmpty(Session["세션명"] as string))
{
       Null 아닐 경우 소스
}

 

반응형
DateTime.Now.ToString("yyyyMMddHHmmssFFF");

 

반응형
public void SetLogData(string strLog)
{
	try
	{
		string temp;
		string DirPath = Application.StartupPath + "\Log"; //여기 Log 폴더 만들어서 사용하자
		//Log 디렉토리 체크 후 폴더 만들기
		DirectoryInfo di = new DirectoryInfo(DirPath);

		if (di.Exists == false)
		{
			di.Create();
		}

		string FilePath = DirPath + "\\Log_" + DateTime.Today.ToString("yyyyMMdd") + ".log";
		FileInfo fi = new FileInfo(FilePath);

		if (!fi.Exists)
		{
			using (StreamWriter sw = new StreamWriter(FilePath))
			{
				temp = string.Format("[{0}] {1}", DateTime.Now, strLog);
				sw.WriteLine(temp);
				sw.Close();
			}
		}
		else
		{
			using (StreamWriter sw = File.AppendText(FilePath))
			{
				temp = string.Format("[{0}] {1}", DateTime.Now, strLog);
				sw.WriteLine(temp);
				sw.Close();
			}
		}
	}
	catch (Exception ex)
	{
		string strError = ex.Message;
	}
}
//참고 : https://dodo1054.tistory.com/85

 

+ Recent posts