PDA

View Full Version : سوال: ارسال فايل به ايميل



Yasersadegh
یک شنبه 27 اردیبهشت 1388, 20:28 عصر
سلام به دوستان عزيز
من مي خوام يه فايل متني رو به يه آدرس ايميل ارسال كنم.!! حالا مثلا اون آدرسم تويه Gmail باشه !! چطوري مي تونم اين كار رو انجام بدم!؟:متفکر:
ممنون ميشم اگه دوستان تو اين زيمنه يه راهنمايي بفرمايند!!:لبخندساده:

Yasersadegh
دوشنبه 28 اردیبهشت 1388, 10:28 صبح
كسي نمي خواد به من كمكي كنه!!؟:ناراحت:

saeedenferadi
دوشنبه 28 اردیبهشت 1388, 11:50 صبح
خوب شما باید اول فایلی که میخواید ارسال کنید رو تو emailیاgmailخودتون بوسیلهattachوارد کنید وسپس به آدرس مورد نظرتون بفرستید

Yasersadegh
دوشنبه 28 اردیبهشت 1388, 12:17 عصر
:متعجب:دوست عزيز منظورم اينه كه يه فايل رويه سيستم هست مي خوام اينو با يه كد به يه ايميلي بفرستم!!:متفکر:
مي خوام تويه سي پلاس پلاس براش كد بنويسم!!:متفکر:
كه فكر مي كنم بايد با سوكت اين كارو بكنم!!
لطفا اگه قبلا كسي كار كرده يه كمكي كنه!!:خجالت:

Yasersadegh
دوشنبه 28 اردیبهشت 1388, 13:52 عصر
دوستان هر كسي در مورد پورت ارسال ايميل مي دونه، لطفا يه كمكي كنه!!؟:لبخندساده:

pswin.pooya
دوشنبه 28 اردیبهشت 1388, 14:17 عصر
در مورد پورتهای مربوط به پروتکلهای smtp و pop3 سرچ کن. همینطور باید این پروتکلها رو یاد بگیری. برای اینکار هم باید socket programming بکنی که یا باید از winsock استفاده کنی و یا اینکه باید از کتابخونه های دیگه مثل sdl_net استفاده کنی.

Yasersadegh
دوشنبه 28 اردیبهشت 1388, 14:21 عصر
دوست عزيز ممنون
ولي الان من سوكتش رو نوشتم ولي تويه كانكتش به سرور Gmail ارور ميده . ارور 10061 رو ميده كه همون
connection Refused.
الان من چكار كنم كه اين مشكل حل شه!!؟:متفکر:
برايه كانكت به سرور ايميل قلق خاصي داره!!؟:متفکر:

mehdi.mousavi
دوشنبه 28 اردیبهشت 1388, 14:31 عصر
دوست عزيز ممنون ولي الان من سوكتش رو نوشتم ولي تويه كانكتش به سرور Gmail ارور ميده . ارور 10061 رو ميده كه همون connection Refused. الان من چكار كنم كه اين مشكل حل شه!!؟:متفکر: برايه كانكت به سرور ايميل قلق خاصي داره!!؟:متفکر:

سلام.
SMTP Server شما کی هستش؟ اگر میخواهید از طریق خود gmail، پیامی ارسال کنید (مقصد مهم نیست)، باید تو برنامه ای که می نویسید کلیه تنظیماتی که Gmail برای POP3 انتظار داره رو شما هم اعمال کنید. این تنظیمات رو (بعنوان نمونه) برای برنامه Thunderbird میتونید اینجا بخونید. (http://mail.google.com/support/bin/answer.py?answer=13285) درواقع تو برنامه خودتون، باید همون تنظیماتی رو اعمال کنید که روی Thunderbird اعمال می شه.

پاورقی: نگاهی به این Sample بندازید، (http://www.example-code.com/vcpp/gmail_smtp_587.asp)نقطه شروع خوبیه.

Yasersadegh
دوشنبه 28 اردیبهشت 1388, 14:43 عصر
سلام دوست عزيز
نه من مي خوام به خود جميل پيامي رو ارسال كنم و مبدا مهم نيست. مبدا برنامه اي كه نوشتم و مقصد جميل است و مي خوام پيامي كه ارسال مي كنم بره به inbox يه آدرس ايميل تويه سرور جيميل!!:لبخندساده:
الان من يه سوكت ايجاد مي كنم و رويه پورت 25 به سرور جميل كانكت مي كنم تا بتونم به زبون خودش براش اطلاعات ارسال كنم ولي كانكت نمي شه!!
لطفا راهنمايي كنيد!!

mehdi.mousavi
دوشنبه 28 اردیبهشت 1388, 15:09 عصر
سلام دوست عزيز
نه من مي خوام به خود جميل پيامي رو ارسال كنم و مبدا مهم نيست. مبدا برنامه اي كه نوشتم و مقصد جميل است و مي خوام پيامي كه ارسال مي كنم بره به inbox يه آدرس ايميل تويه سرور جيميل!!:لبخندساده: الان من يه سوكت ايجاد مي كنم و رويه پورت 25 به سرور جميل كانكت مي كنم تا بتونم به زبون خودش براش اطلاعات ارسال كنم ولي كانكت نمي شه!!
لطفا راهنمايي كنيد!!

شما مگه می خواهید یه SMTP Server بنویسید؟ احتمالا، هدفتون کاری هستش که Thunderbird، Outlook و بقیه Mail Client ها انجام میدن، یعنی استفاده از یک SMTP Server که وظیفه ارسال email رو بعهده داره. شما ابتدا مشخص کنید که یک SMTP Server می خواهید بنویسید، یا یک Mail Client:


اگر می خواهید یک SMTP Server بنویسید، Source های EXIM، POSTFIX، SENDMAIL و ... که سیستمهای Mail Server و Open Source هستن رو نگاه کنید.
اگر میخواهید یک Mail Client بنویسید، باید بگید که از چه SMTP Server ای قصد دارید استفاده کنید، تنظیمات اونو در کد خودتون انجام میدید و mail رو بسادگی ارسال می کنید.

برای ارسال Email از یک node به node دیگه، به چیزی فراتر از باز کردن یک ارتباط و ارسال یک packet روی پورت 25 نیاز هستش. SMTP Protocol (http://www.ietf.org/rfc/rfc0821.txt) این نیازمندیها رو توضیح داده!

Yasersadegh
دوشنبه 28 اردیبهشت 1388, 15:35 عصر
اگر می خواهید یک SMTP Server بنویسید، Source های EXIM، POSTFIX، SENDMAIL و ... که سیستمهای Mail Server و Open Source هستن رو نگاه کنید.
اگر میخواهید یک Mail Client بنویسید، باید بگید که از چه SMTP Server ای قصد دارید استفاده کنید، تنظیمات اونو در کد خودتون انجام میدید و mail رو بسادگی ارسال می کنید.


شما خودتون رويه كدوم كار كرديد!! و فكر مي كنيد كه قابل انجامه!!؟
من مي خوام يه فايل متني كه رو سيستمم هست رو اطلاعات داخل اون رو توسط برنامه به يه آدرس ايميل بفرستم!!
حالا ديگه نمي دونم كدوم روش ميشه!!؟

mehdi.mousavi
دوشنبه 28 اردیبهشت 1388, 16:03 عصر
شما خودتون رويه كدوم كار كرديد!! و فكر مي كنيد كه قابل انجامه!!؟ من مي خوام يه فايل متني كه رو سيستمم هست رو اطلاعات داخل اون رو توسط برنامه به يه آدرس ايميل بفرستم!! حالا ديگه نمي دونم كدوم روش ميشه!!؟

بسیار خوب. برگشتیم جای اول. شما باید از یک SMTP Server استفاده کنید. در واقع Mail رو به اون می فرستید، و اون خودش برای شما به سمت مقصد بر اساس سیاستهای موجود، Route میکنه. برای اینکار، چند روش وجود داره:


می تونید یه Component خریداری کنید، که اینکارو براتون انجام بده (که احتمالا اون کاری نیست که شما بخواهید انجام بدید).
می تونید با خوندن این مقاله، و استفاده از کلاسهای رایگان ضمیمه اون (http://www.codeguru.com/cpp/i-n/internet/email/article.php/c6177)، به هدفتون برسید.
می تونید از CDO استفاده کنید. به این منظور به این نمونه کد در MSDN مراجعه کنید (http://msdn.microsoft.com/en-us/library/ms870485%28EXCHG.65%29.aspx).

در روشهای 2 و 3، باید با COM آشنا باشید.

پاورقی: من عموما از روش سوم استفاده می کنم.

Yasersadegh
دوشنبه 28 اردیبهشت 1388, 16:36 عصر
می تونید با خوندن این مقاله، و استفاده از کلاسهای رایگان ضمیمه اون (http://www.codeguru.com/cpp/i-n/internet/email/article.php/c6177)، به هدفتون برسید.


ممكنه يه راهنمايي در مورد نحوه استفاده از اين كلاسها بفرماييد!!:لبخندساده:

mehdi.mousavi
دوشنبه 28 اردیبهشت 1388, 17:23 عصر
ممكنه يه راهنمايي در مورد نحوه استفاده از اين كلاسها بفرماييد!!:لبخندساده:

حتما دارید شوخی می کنید و میخواهید صبر و حوصله منو محک بزنید. :) مقاله ای که URL اش رو دادم، خودش حاوی Sample هستش و اینقدر واضحه که نیازی به توضیح نداره:


Setup is pretty straightforward. Just insert the smtp.cpp, base64.cpp, smtp.h and base64.h files into a new ATL project or into your existing ATL project. A very simplistic .cpp file to implement SMTP would look like this:

راه اندازی بسیار سر راست است. تنها فایلهای smtp.cpp، base64.cpp، smtp.h و base64.h را درون پروژه ATL جدید یا پروژه ATL موجود خود قرار دهید. پیاده سازی بسیار ساده در یک فایل cpp چیزی شبیه کد زیر است:


#include "stdafx.h"
#include "resource.h"
#include "smtp.h"
و بقیه کد...

نمیدونم چه چیزی براتون مبهمه. تو همین صفحه، نحوه Attach کردن فایل هم با یک مثال نمایش داده شده:



// The MimeType must be explicitly set for this type of message
msg.MimeType = mimeRelated;

body = _T("<html><body>This is an inline image<br><img src="cid:1234567"></body></html>");
body.Encoding = _T("text/html");

attach = _T("c:\\web\\myimage.jpg");
attach.ContentId = _T("1234567");

msg.Message.Add(body);
msg.Attachments.Add(attach);تنها مساله ای که می مونه، اینه که ID/PWD و مشخصات SMTP Server رو چطور میشه بهش داد؟ برای دونستن این مطلب، کافیه تا نگاهی به فایل smtp.h بندازید. اونجا member variable های زیر رو می بینید:



BOOL m_bExtensions; // Use ESMTP extensions (TRUE)
DWORD m_dwCmdTimeout; // Timeout for issuing each command (30 seconds)
WORD m_wSmtpPort; // Port to communicate via SMTP (25)
String m_strUser; // Username for authentication
String m_strPass; // Password for authentication

که کاملا گویا هستن... (اگر چه نباید اینطوری اینا رو public میذاشت، اما خوب، فعلا کار شما رو راه میندازه). در نهایت، با استفاده از متود Connect هم، می تونید نام SMTP Server رو تعیین کنید...

پاورقی: واسه استفاده از این کلاس نیازی به دونستن ATL/COM ندارید (بر خلاف پست اولی که دادم).

amir_civil
سه شنبه 29 اردیبهشت 1388, 12:48 عصر
با سلام
شما کافیه پروتوکل smtp رو یاد بگیرید + برنامه نویسی شبکه
به پورت 25 وصل بشید و :


S: 220 smtp.example.com ESMTP Postfix
C: HELO relay.example.org
S: 250 Hello relay.example.org, I am glad to meet you
C: MAIL FROM:<bob@example.org>
S: 250 Ok
C: RCPT TO:<alice@example.com>
S: 250 Ok
C: RCPT TO:<theboss@example.com>
S: 250 Ok
C: DATA
S: 354 End data with <CR><LF>.<CR><LF>
C: From: "Bob Example" <bob@example.org>
C: To: Alice Example <alice@example.com>
C: Cc: theboss@example.com
C: Date: Tue, 15 Jan 2008 16:02:43 -0500
C: Subject: Test message
C:
C: Hello Alice.
C: This is a test message with 5 header fields and 4 lines in the message body.
C: Your friend,
C: Bob
C: .
S: 250 Ok: queued as 12345
C: QUIT
S: 221 Bye
{The server closes the connection}

Yasersadegh
سه شنبه 29 اردیبهشت 1388, 12:58 عصر
آهان همينه!!:تشویق::تشویق:
ولي مي دونيد مشكل كجاست!!:ناراحت:
مشكل اينه كه وقتي من به Server كانكت مي كنم پيام اول يعني
HELO relay.example.org
رو ارسال مي كنم جوابي دريافت نمي كنم كه بتونم پيام بعدي رو ارسال كنم.:افسرده:
لطفا كمك كنيد. نمي دونم مشكل چيه!!؟:گیج:
كلي سايت و مطلب پيدا كردم كه همشون همين پروتكل رو استفاده كردند ولي وقتي براي جميل ارسال مي كنم جواب نمي ده!! اما برايه يه سرور ديگه جواب ميده!! من مي خوام با جميل كار كنم كه جواب نمي ده!!:متفکر:
لطفا راهنمايي كنيد!!

mehdi.mousavi
سه شنبه 29 اردیبهشت 1388, 15:08 عصر
آهان همينه!!:تشویق::تشویق:
ولي مي دونيد مشكل كجاست!!:ناراحت:
مشكل اينه كه وقتي من به Server كانكت مي كنم پيام اول يعني
HELO relay.example.org
رو ارسال مي كنم جوابي دريافت نمي كنم كه بتونم پيام بعدي رو ارسال كنم.:افسرده:
لطفا كمك كنيد. نمي دونم مشكل چيه!!؟:گیج:
كلي سايت و مطلب پيدا كردم كه همشون همين پروتكل رو استفاده كردند ولي وقتي براي جميل ارسال مي كنم جواب نمي ده!! اما برايه يه سرور ديگه جواب ميده!! من مي خوام با جميل كار كنم كه جواب نمي ده!!:متفکر:
لطفا راهنمايي كنيد!!

احتمالا بخاطر TLS هستش. STARTTLS رو میزنید؟

Yasersadegh
سه شنبه 29 اردیبهشت 1388, 15:59 عصر
نه!!
TLS چيه ؟ :متعجب: كجا و چطوري بايد استارتش كنم؟:متفکر:

mehdi.mousavi
سه شنبه 29 اردیبهشت 1388, 17:23 عصر
نه!! TLS چيه ؟ :متعجب: كجا و چطوري بايد استارتش كنم؟:متفکر:


TLS یعنی Transport Layer Security... پروتکلی شبیه SSL (البته این فقط یک مثاله برای اینکه شما مساله رو سریع متوجه بشید. و الا دو پروتکل مزبور کاملا مجزا هستن). برای شروع، میتونید STARTTLS بزنید. البته باید اطلاعات Header در اینصورت Encrypt بشه و گمان نمیکنم این کار دستی امکان پذیر باشه. بهمین دلیل بود که از همون اول گفتم با یک Component اینکارو انجام بدید راحتتره. البته احتمالا میتونید Implementation های TLS رو بصورت Open Source روی اینترنت پیدا کنید...

در هر حال، افراد دیگه ای قبلا همین سوال شما رو مطرح کردن، می تونید یکی از اونها بهمراه پاسخی که بهش دادن اینجا بخونید. (http://groups.google.com/group/Gmail-Help-POP-and-IMAP-en/browse_thread/thread/0854be57c5994308)

amir_civil
سه شنبه 29 اردیبهشت 1388, 23:09 عصر
100% smtp رو اشتباه پیدا کردید یعنی smtp جی میل اونی که شما فکر میکنید نیست

Yasersadegh
چهارشنبه 30 اردیبهشت 1388, 10:39 صبح
smtp جيميل رو كه پيدا كردم و خيلي جاها از اين استفاده كردند
Smtp.gmail.com
بود كه فقط با اين تونستم كانكت بشم. بقيه مواردي كه نوشتم جواب نگرفتم.
اينم فقط رويه پورت 465 جواب داد و نه رويه پورت 25 و نه رويه پورت 587 جواب نداد.!!
حالا نظر شما چيه راجع به smtp اي كه وصل ميشم. درسته يا غلطه!؟ :متفکر:
با چه smpt اي بايد وصل بشم!!؟:متفکر:

Yasersadegh
چهارشنبه 30 اردیبهشت 1388, 14:33 عصر
برای شروع، میتونید STARTTLS بزنید.

دوست من چطوري مي تونم اين كار رو كنم!! البته منظورم با استفاده از سوكت پروگرامينگ هست!!
آيا اين يه دستوره كه تويه برنامه بايد اجرا كنم و يا يه پيغامه بايد به سرور ارسال كنم!!؟:متفکر:

mehdi.mousavi
چهارشنبه 30 اردیبهشت 1388, 16:47 عصر
دوست من چطوري مي تونم اين كار رو كنم!! البته منظورم با استفاده از سوكت پروگرامينگ هست!! آيا اين يه دستوره كه تويه برنامه بايد اجرا كنم و يا يه پيغامه بايد به سرور ارسال كنم!!؟:متفکر:

شما ابتدا باید اون Command رو به سمت Gmail ارسال کنید، به این معنا که می خواهید مابقی ارتباط روی TLS رخ بده. Gmail هم بنوبه خودش، TLS رو فعال میکنه و منتظر گرفتن Packet ها از شما می مونه. اما برای اینکه Gmail ارتباط رو قطع نکنه، باید اطلاعات رو از اون به بعد طبق پروتکل TLS ارسال کنید. Socket ای که شما باز کردید، به خودی خود، TLS رو Support نمیکنه.

لطفا به این لینک مراجعه کنید. (http://msdn.microsoft.com/en-us/library/ms678421.aspx) اینجا، نحوه استفاده از SChannel، یعنی Package ای که حاوی پیاده سازی مایکروسافت از پروتکلهای TLS، SSL و PCT هستش توضیح داده شده.

اینجا، در این مقاله 3 صفحه ای (http://www.ddj.com/cpp/184401688?pgno=1)، نحوه نوشتن یک برنامه Client/Server ای TLS/SSL Enabled توضیح داده شده.

اینجا در این مقاله از CodeProject (http://www.codeproject.com/KB/IP/sslclasses.aspx)نیز، با استفاده از SSPI API ها و همینطور Open SSL اینکار رو در C# انجام داده.

موفق باشید.

Yasersadegh
پنج شنبه 31 اردیبهشت 1388, 14:04 عصر
كدي من نوشتم يه چيزي شبيه اين كد:



void main()
{
SOCKET s, newsock;
SOCKADDR sa;
WSADATA wsData;
WORD wVer = MAKEWORD(2,2);
char sendbuf[100];
char recvbuf[512] = "";
struct sockaddr_in sa_in;
INT status;
WCHAR wszRecvBuf[100];
u_short port = 465;
status = WSAStartup(wVer,&wsData);
s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if (INVALID_SOCKET == s)
{
printf("\nFailed to create socket: %d\n",GetLastError());
WSACleanup();
return;
}
else
{
printf("\nSuccessful to create socket");
}
hostent* Host;
char* ip;
sockaddr_in clientService;
Host = gethostbyname("smtp.gmail.com");
ip = inet_ntoa (*(struct in_addr *)*Host->h_addr_list);
clientService.sin_family = AF_INET;
clientService.sin_addr.s_addr = inet_addr( ip );
clientService.sin_port = htons( port);
if ( connect( s, (SOCKADDR*) &clientService, sizeof(clientService) ) == SOCKET_ERROR) {
printf( "\nFailed to connect %s. (%d)",ip,WSAGetLastError() );
WSACleanup();
getch();
return;
}else{
printf( "\n connected successfuly to %s.",ip );
}
int bytesSent=-1;
int bytesRecv = SOCKET_ERROR;
strcpy(sendbuf,"HELO Gmail.com\r\n");
bytesSent = send( s, sendbuf, strlen(sendbuf), 0 );
if(bytesSent ==SOCKET_ERROR)
{
printf( "\nSent Failed (%ld)\n", WSAGetLastError() );
}
else{
printf( "\nBytes Sent: %ld\n%s", bytesSent,sendbuf );
}

printf( "\nReciving... ");
while( bytesRecv == SOCKET_ERROR ) {
bytesRecv = recv( s, recvbuf, 512, 0 );
if ( bytesRecv == 0 || bytesRecv == WSAECONNRESET ) {
printf( "Connection Closed.\n");
break;
}

}
printf( "Bytes Recv: %ld\n%s", bytesRecv,recvbuf );
}

با اين كد من پيام HELO رو به جيميل ارسال مي كنم ولي هيچ جوابي دريافت نمي كنم !:عصبانی: از دوستان عزيز خواهش مي كنم هر كس مي دونه مشكلش چيه يا توضيح بده يا خودش زحمت تغييرش رو بكشه!!:لبخندساده:
ممنون!

Yasersadegh
شنبه 02 خرداد 1388, 12:25 عصر
دوستان عزيز كسي نمي خواد يه نگاهي به اين كد ما كنه و مشكلش رو حل كنه!!:گریه:

saeedr22
پنج شنبه 30 مهر 1388, 00:30 صبح
میتونین با این مثال جهت ارسال ایمیل کار کنین