티스토리 뷰
출처 : Code Snipet
C# SMTP로 대량 메일 발송하기.
Soket 이용
It’s easy to use System.net.mail namespace to send emails from asp.net. But the problem is system.net.mail.send() method does not close the connection to SMTP server. This is causing SMTP 4.2.2 error if you try to send multiple emails. While as per Microsoft this issue has been resolved in .net Framework 4.0 but people who are using 3.5 its still the issue. The workaround is to use sockets and System.Web.Mail namespace. Here is the sample code to send SMTP email using C# 3.5 -
workaround may be set maxtimeout=1
.NET Framework 4.0 has new property called SMTPClient.Dispose() to fix the issue
001 | using System; |
002 | using System.Text; |
003 | using System.IO; |
004 | using System.Net.Sockets; |
005 | using System.Net; |
006 | using System.Web.Mail; |
007 |
008 | namespace mySMTP |
009 | { |
010 | /// <summary> |
011 | /// provides methods to send email via smtp direct to mail server |
012 | /// </summary> |
013 | public class SmtpDirect |
014 | { |
015 | /// <summary> |
016 | /// Get / Set the name of the SMTP mail server |
017 | /// </summary> |
018 | private static string SmtpServer = "outbound-mail.yourorg.com" ; |
019 | private enum SMTPResponse : int |
020 | { |
021 | CONNECT_SUCCESS = 220, |
022 | GENERIC_SUCCESS = 250, |
023 | DATA_SUCCESS = 354, |
024 | QUIT_SUCCESS = 221 |
025 | } |
026 | public static bool Send(MailMessage message) |
027 | { |
028 | IPHostEntry IPhst = Dns.Resolve(SmtpServer); |
029 | IPEndPoint endPt = new IPEndPoint(IPhst.AddressList[0], 25); |
030 | Socket s = new Socket(endPt.AddressFamily, SocketType.Stream, ProtocolType.Tcp); |
031 | s.Connect(endPt); |
032 |
033 | if (!Check_Response(s, SMTPResponse.CONNECT_SUCCESS)) |
034 | { |
035 | s.Close(); |
036 | return false ; |
037 | } |
038 |
039 | Senddata(s, string .Format( "HELO {0}\r\n" , Dns.GetHostName())); |
040 | if (!Check_Response(s, SMTPResponse.GENERIC_SUCCESS)) |
041 | { |
042 | s.Close(); |
043 | return false ; |
044 | } |
045 |
046 | Senddata(s, string .Format( "MAIL From: {0}\r\n" , message.From)); |
047 | if (!Check_Response(s, SMTPResponse.GENERIC_SUCCESS)) |
048 | { |
049 |
050 | s.Close(); |
051 | return false ; |
052 | } |
053 |
054 | string _To = message.To; |
055 | string [] Tos = _To.Split( new char [] { ';' }); |
056 | foreach ( string To in Tos) |
057 | { |
058 | Senddata(s, string .Format( "RCPT TO: {0}\r\n" , To)); |
059 | if (!Check_Response(s, SMTPResponse.GENERIC_SUCCESS)) |
060 | { |
061 | s.Close(); |
062 | return false ; |
063 | } |
064 | } |
065 |
066 | if (message.Cc != null ) |
067 | { |
068 | Tos = message.Cc.Split( new char [] { ';' }); |
069 | foreach ( string To in Tos) |
070 | { |
071 | Senddata(s, string .Format( "RCPT TO: {0}\r\n" , To)); |
072 | if (!Check_Response(s, SMTPResponse.GENERIC_SUCCESS)) |
073 | { |
074 | s.Close(); |
075 | return false ; |
076 | } |
077 | } |
078 | } |
079 |
080 | StringBuilder Header = new StringBuilder(); |
081 | Header.Append( "From: " + message.From + "\r\n" ); |
082 | Tos = message.To.Split( new char [] { ';' }); |
083 | Header.Append( "To: " ); |
084 | for ( int i = 0; i < Tos.Length; i++) |
085 | { |
086 | Header.Append(i > 0 ? "," : "" ); |
087 | Header.Append(Tos[i]); |
088 | } |
089 | Header.Append( "\r\n" ); |
090 | if (message.Cc != null ) |
091 | { |
092 | Tos = message.Cc.Split( new char [] { ';' }); |
093 | Header.Append( "Cc: " ); |
094 | for ( int i = 0; i < Tos.Length; i++) |
095 | { |
096 | Header.Append(i > 0 ? "," : "" ); |
097 | Header.Append(Tos[i]); |
098 | } |
099 | Header.Append( "\r\n" ); |
100 | } |
101 | Header.Append( "Date: " ); |
102 | Header.Append(DateTime.Now.ToString( "ddd, d M y H:m:s z" )); |
103 | Header.Append( "\r\n" ); |
104 | Header.Append( "Subject: " + message.Subject + "\r\n" ); |
105 | Header.Append( "X-Mailer: SMTPDirect v1\r\n" ); |
106 | string MsgBody = message.Body; |
107 | if (!MsgBody.EndsWith( "\r\n" )) |
108 | MsgBody += "\r\n" ; |
109 | if (message.Attachments.Count > 0) |
110 | { |
111 | Header.Append( "MIME-Version: 1.0\r\n" ); |
112 | Header.Append( "Content-Type: multipart/mixed; boundary=unique-boundary-1\r\n" ); |
113 | Header.Append( "\r\n" ); |
114 | Header.Append( "This is a multi-part message in MIME format.\r\n" ); |
115 | StringBuilder sb = new StringBuilder(); |
116 | sb.Append( "--unique-boundary-1\r\n" ); |
117 | sb.Append( "Content-Type: text/plain\r\n" ); |
118 | sb.Append( "Content-Transfer-Encoding: 7Bit\r\n" ); |
119 | sb.Append( "\r\n" ); |
120 | sb.Append(MsgBody + "\r\n" ); |
121 | sb.Append( "\r\n" ); |
122 |
123 | foreach ( object o in message.Attachments) |
124 | { |
125 | MailAttachment a = o as MailAttachment; |
126 | byte [] binaryData; |
127 | if (a != null ) |
128 | { |
129 | FileInfo f = new FileInfo(a.Filename); |
130 | sb.Append( "--unique-boundary-1\r\n" ); |
131 | sb.Append( "Content-Type: application/octet-stream; file=" + f.Name + "\r\n" ); |
132 | sb.Append( "Content-Transfer-Encoding: base64\r\n" ); |
133 | sb.Append( "Content-Disposition: attachment; filename=" + f.Name + "\r\n" ); |
134 | sb.Append( "\r\n" ); |
135 | FileStream fs = f.OpenRead(); |
136 | binaryData = new Byte[fs.Length]; |
137 | long bytesRead = fs.Read(binaryData, 0, ( int )fs.Length); |
138 | fs.Close(); |
139 | string base64String = System.Convert.ToBase64String(binaryData, 0, binaryData.Length); |
140 |
141 | for ( int i = 0; i < base64String.Length; ) |
142 | { |
143 | int nextchunk = 100; |
144 | if (base64String.Length - (i + nextchunk) < 0) |
145 | nextchunk = base64String.Length - i; |
146 | sb.Append(base64String.Substring(i, nextchunk)); |
147 | sb.Append( "\r\n" ); |
148 | i += nextchunk; |
149 | } |
150 | sb.Append( "\r\n" ); |
151 | } |
152 | } |
153 | MsgBody = sb.ToString(); |
154 | } |
155 |
156 | Senddata(s, ( "DATA\r\n" )); |
157 | if (!Check_Response(s, SMTPResponse.DATA_SUCCESS)) |
158 | { |
159 | s.Close(); |
160 | return false ; |
161 | } |
162 | Header.Append( "\r\n" ); |
163 | Header.Append(MsgBody); |
164 | Header.Append( ".\r\n" ); |
165 | Header.Append( "\r\n" ); |
166 | Header.Append( "\r\n" ); |
167 | Senddata(s, Header.ToString()); |
168 | if (!Check_Response(s, SMTPResponse.GENERIC_SUCCESS)) |
169 | { |
170 | s.Close(); |
171 | return false ; |
172 | } |
173 |
174 | Senddata(s, "QUIT\r\n" ); |
175 | Check_Response(s, SMTPResponse.QUIT_SUCCESS); |
176 | s.Close(); |
177 | return true ; |
178 | } |
179 | private static void Senddata(Socket s, string msg) |
180 | { |
181 | byte [] _msg = Encoding.ASCII.GetBytes(msg); |
182 | s.Send(_msg, 0, _msg.Length, SocketFlags.None); |
183 | } |
184 | private static bool Check_Response(Socket s, SMTPResponse response_expected) |
185 | { |
186 | string sResponse; |
187 | int response; |
188 | byte [] bytes = new byte [1024]; |
189 | while (s.Available == 0) |
190 | { |
191 | System.Threading.Thread.Sleep(100); |
192 | } |
193 |
194 | s.Receive(bytes, 0, s.Available, SocketFlags.None); |
195 | sResponse = Encoding.ASCII.GetString(bytes); |
196 | response = Convert.ToInt32(sResponse.Substring(0, 3)); |
197 | if (response != ( int )response_expected) |
198 | return false ; |
199 | return true ; |
200 | } |
201 | } |
202 |
203 | } |
Usage
1 | string sBody = string .Empty; |
2 | System.Web.Mail.MailMessage message = new System.Web.Mail.MailMessage(); |
3 | message.From = "def@hotmail.com" ; |
4 | message.To= "abc@yahoo.com" ; |
5 | message.Subject = "Hello subject" ; |
6 | sBody = "Hello World" ; |
7 | mySMTP.Send(message) |
'프로그래밍 > ASP.NET' 카테고리의 다른 글
DataBinding <%# %> 데이터 바인딩 (0) | 2012.11.07 |
---|---|
LINQ 에서 anonymous types 리스트(LIST)형태나 Collection 으로 받기 (0) | 2012.11.05 |
Ajax - Web Services 호출 (0) | 2012.10.08 |
ASP.NET PageMethods와 JSON을 통한 다이나믹 페이지 개발 (0) | 2012.10.05 |
DataSet 다루기 (0) | 2012.10.05 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- 자바스크립트
- workbook
- 저장프로시저
- CSS
- Style
- IE
- JS
- Mobile
- ASP.NET
- drag&drop
- jQuery
- jQuery Mobile
- rowspan
- Excel
- html5
- radius
- 셀렉터
- json
- Chart
- grid
- css3
- 프로시저
- WCF
- WebApi
- MSSQL
- 제이쿼리
- SVG
- jquery chart
- JavaScript
- Ajax
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함