카테고리 보관물: .Net / C#

C# MySQL Connector/NET 을 이용한 연동

개요

SQL Server나 Oracle DB는 서버 라이센스 비용이 상상을 초월합니다. 그래서 웬만한 기업에서는 도입을 할 수 없습니다. 그 대안으로 MySQL, MariaDB 등을 사용하게 됩니다. .NET 기반 프로젝트라면 이전에는 SQL Server에 연동해서 작업을 진행했습니다. 라이센스 비용이 부담이 되면서 근래에는 Open Source 기반 DB를 사용하는 경우가 많아졌습니다. .NET 프레임워크에서는 기본적으로 MySQL 에 직접 연결할 수 있는 클래스는 없습니다. ODBC 클래스를 이용해서 연동을 할 수 있는 방법만 존재했습니다. 이 방법도 드라이버를 설치하고 ODBC 설정을 해야 가능합니다. MySQL 에서 제공하는 MySQL Connector 를 이용하여 연동하는 방법을 알아보도록 하겠습니다.

MySQL Connector

MySQL 홈페이지에서 다양한 언어와 플랫폼에 연동할 수 있도록 Connector 를 제공하고 있습니다. 여기에서는 Connector/NET 을 사용하도록 하겠습니다. 다음의 주소에서 다운로드 받으실 수 있습니다.

https://dev.mysql.com/downloads/connector/net/

설치는 별다른 어려움이 없으므로 설치했다고 가정하겠습니다.

연동

Visual Studio를 실행하고 ASP.NET 웹 응용 프로그램 프로젝트를 생성합니다. WinForm 프로젝트를 생성해서 진행하셔도 무방합니다. 솔루션 탐색기에서 참조를 선택하고 오른쪽 버튼을 클릭합니다. 메뉴에서 참조 추가를 선택합니다.

참조 추가 선택

참조 추가 선택

참조 관리자에서 찾아보기를 선택한 후 설치한 경로에서 MySql.Data.dll 을 선택합니다. 그러면 다음과 같이 참조가 됩니다.

MySql.Data 참조 추가

MySql.Data 참조 추가

System.Data.SqlClient 네임스페이스에 포함된 클래스 명칭 앞에 My 만 추가로 붙은 형태라고 생각하시고 사용하시면 됩니다. 예를 들면 다음과 같습니다.

SqlConnection -> MySqlConnection
SqlCommand -> MySqlCommand
.
.
.

MySQL DB 에 연결하는 코드는 다음과 같습니다.

using MySql.Data.MySqlClient;

var connectionString = "server=localhost;user=userid;database=yourdb;password=yourpassword";
var connection = new MySqlConnection(connectionString);

try
{
	Response.Write("MySQL DB 연결 중...");
	connection.Open();

	//DB 연동작업
	
}
catch (Exception ex)
{
	Response.Write(ex.ToString());
}

connection.Close();

SqlConnection 클래스를 사용한 것과 동일한 형태입니다.

다음은 MySqlCommand 클래스를 이용한 예를 살펴보겠습니다. MySqlCommand 클래스를 이용하여 쿼리한 결과를 DataTable 객체에 넣는 예제 입니다.

using System.Data;
using MySql.Data.MySqlClient;

var connectionString = "server=localhost;user=userid;database=yourdb;password=yourpassword";
var connection = new MySqlConnection(connectionString);

try
{
	Response.Write("MySQL DB 연결 중...");
	connection.Open();

	var sql = "SELECT user_name, user_id, user_password FROM your_table";
	var mySqlCommand = new MySqlCommand(sql, connection);
	var mySqlDataReader = mySqlCommand.ExecuteReader();

	var mySqlDataTable = new DataTable();
	mySqlDataTable.Load(mySqlDataReader);
	mySqlDataReader.Close();
}
catch (Exception ex)
{
	Response.Write(ex.ToString());
}

connection.Close();

예제에서 본 것과 같이 기존 Sql … 로 시작되는 클래스를 이용한 방법과 동일합니다. MariaDB 도 같은 방법으로 연동할 수 있습니다.

이상으로 MySQL Connector/NET 을 이용한 연동 방법을 알아보았습니다.

C# POP3, IMAP 메일 읽어오기

개요

여러가지 이유로 특정 계정의 메일을 읽어와야 할 경우가 있습니다. 필자의 경우 특정한 형식의 메일로 자료를 받아오는 처리를 하게되었습니다. 메일서버와 통신하는 프로토콜은 POP3, IMAP 이 있는데 모두 알아보도록 하겠습니다.

POP3

프로토콜 자체에 대한 설명은 자료를 찾아보면 많이 있습니다. 이번 포스트에서는 서버에 접속해서 목록과 내용을 가져오는 부분을 중점적으로 살펴 보겠습니다. 메일을 읽어오는 방식이 여러가지 방법이 있지만 잘 만들어진 라이브러리를 이용하는 것이 효율적입니다. 여러가지 라이브러리가 있는데 OpenPop.NET 를 사용하겠습니다.

OpenPop.NET은 오픈소스 POP3 client 라이브러리 입니다. 설치는 패키지 관리자 콘솔에서 다음과 같이 입력하면 됩니다.

Install-Package OpenPop.NET

메일 목록을 가져오는 코드를 보겠습니다.

using (Pop3Client client = new Pop3Client())
{
	client.Connect("yourserver", 110, false); //서버접속

	client.Authenticate("youraccount", "yourpassword", AuthenticationMethod.UsernameAndPassword); //서버인증

	var messageCount = client.GetMessageCount(); //받은메일의 메시지 개수

	List<Message> allMessages = new List<Message>(messageCount);

	for (var i = 1; i messageCount; i++)
	{
		var message = client.GetMessage(i);
		var fromAddress = message.Headers.From.Address;
		var subject = message.Headers.Subject;
		var messageBody = String.Empty;

		var plainText = message.FindFirstPlainTextVersion();

		if (plainText == null)
		{
			var html = message.FindFirstHtmlVersion();
			messageBody = html.GetBodyAsText();
		}
		else
		{
			messageBody = plainText.GetBodyAsText();
		}

		var attachFile = message.FindAllAttachments();

		Response.Write("fromAddress : " + fromAddress + "<br />");
		Response.Write("subject : " + subject + "<br />");
		Response.Write("messageBody : " + messageBody + "<br />");
		Response.Write("attachFileCount : " + attachFile.Count + "<br />");
		Response.Write("MessageId : " + message.Headers.MessageId + "<br />");

		foreach (var currentAttachFile in attachFile)
		{
			Response.Write("currentAttachFile : " + currentAttachFile.FileName + "<br />");
			var attachFileInfo = new FileInfo(@"c:\yourpath\" + currentAttachFile.FileName);
			currentAttachFile.Save(attachFileInfo);
		}

		Response.Write("<br /><br /><br />");
	}

	Response.Write("messageCount : " + messageCount);
} 

11행과 같이 시작 인덱스가 1부터 시작한다는 것을 기억해야 합니다.

메일의 내용을 가져올 때 내용이 단순 텍스트인지 html 형태로 되어 있는지에 따로 조금 다릅니다. 일단 18행과 같이 단순 텍스트를 가져 옵니다. 텍스트의 정보가 null 이면 html 형식의 내용으로 간주해서 내용을 가져옵니다. 단순 텍스트 정보이면 그대로 내용을 가져오면 됩니다.

38행~43행은 첨부된 파일의 개수만큼 반복하면서 파일을 저장하는 부분입니다. 필요에 따라 응용하시면 됩니다.

IMAP

모든 서버가 IMAP 프로토콜을 지원하지는 않습니다. 구글메일이 IMAP 프로토콜을 지원하므로 메일을 가져오는 부분을 살펴보겠습니다. 여기에서도 ImapX 라이브러리를 사용하도록 하겠습니다. .NET 용 IMAP 라이브러리 입니다. 패키지 관리자 콘솔에서 다음과 같이 입력하면 설치됩니다.

PM> Install-Package ImapX

메일 제목을 출력하는 코드를 보겠습니다.

Imap4Client imap = new Imap4Client();

var mailServer = "yourmailserver";
var mailAddress = "yourmailaddress";
var mailPassword = "yourpassword";

try
{
	imap.ConnectSsl(mailServer);

	imap.Login(mailAddress, mailPassword);

	Mailbox inbox = imap.SelectMailbox("inbox");

	MessageCollection messages = inbox.SearchParse("OLD UNSEEN");

	if (messages.Count > 0)
	{
		for (int n = 0; n < messages.Count; n++)
		{
			Response.Write(messages[n].Subject + "");
		}
	}
}
catch (Imap4Exception iex)
{
	Response.Write("Imap4 Error: " + iex.Message + "<br />");
}
catch (Exception ex)
{
	Response.Write("Exception: " + ex.Message + "<br />");
}
finally
{
	if (imap.IsConnected)
	{
		imap.Disconnect();
	}
}

15행에 보면 문자로 된 OLD UNSEEN 부분이 있습니다. 검색 명령어인데 전체 명령어는 다음의 주소에서 확인하실 수 있습니다. 6.4.4. SEARCH Command 부분을 보시면 됩니다.

https://tools.ietf.org/html/rfc3501

여러가지 조합이 가능한데 메일을 가져오는 목적에 따라 변경하시면 됩니다.

메시지를 가져온 후 속성을 살펴보면 많은 항목이 있음을 알 수 있습니다. 개발 목적에 따라 적절하게 사용하시면 됩니다.

이상 C# 과 라이브러리를 이용한 POP3, IMAP 메일 읽어오는 방법을 살펴봤습니다.