2011-07-13 13 views
3

Gmailアカウントを使用してC/C++プログラムからメールを送信します。私はいくつかのリソースを見つけるが、彼らはLinuxのためであり、私のために働かなかった。私は窓でこれをやりたいどのようなサンプルプログラムまたは提案、どのように私はこれを行うことができます評価されます。Gmailアカウントを使用してC++でメールを送信

おかげ

#define WIN32_LEAN_AND_MEAN 

#include <stdio.h> 
#include <stdlib.h> 
#include <fstream.h> 
#include <iostream.h> 
#include <windows.h> 
#include <winsock2.h> 

#pragma comment(lib, "ws2_32.lib") 

// Insist on at least Winsock v1.1 
const VERSION_MAJOR = 1; 
const VERSION_MINOR = 1; 

#define CRLF "\r\n"     // carriage-return/line feed pair 

void ShowUsage(void) 
{ 
    cout << "Usage: SENDMAIL mailserv to_addr from_addr messagefile" << endl 
     << "Example: SENDMAIL smtp.myisp.com [email protected] [email protected] message.txt" << endl; 

    exit(1); 
} 

// Basic error checking for send() and recv() functions 
void Check(int iStatus, char *szFunction) 
{ 
    if((iStatus != SOCKET_ERROR) && (iStatus)) 
    return; 

    cerr << "Error during call to " << szFunction << ": " << iStatus << " - " << GetLastError() << endl; 
} 

int main(int argc, char *argv[]) 
{ 
    int   iProtocolPort  = 0; 
    char  szSmtpServerName[64] = ""; 
    char  szToAddr[64]   = ""; 
    char  szFromAddr[64]  = ""; 
    char  szBuffer[4096]  = ""; 
    char  szLine[255]   = ""; 
    char  szMsgLine[255]  = ""; 
    SOCKET  hServer; 
    WSADATA  WSData; 
    LPHOSTENT lpHostEntry; 
    LPSERVENT lpServEntry; 
    SOCKADDR_IN SockAddr; 

    // Check for four command-line args 
    if(argc != 5) 
    ShowUsage(); 

    // Load command-line args 
    lstrcpy(szSmtpServerName, argv[1]); 
    lstrcpy(szToAddr, argv[2]); 
    lstrcpy(szFromAddr, argv[3]); 

    // Create input stream for reading email message file 
    ifstream MsgFile(argv[4]); 

    // Attempt to intialize WinSock (1.1 or later) 
    if(WSAStartup(MAKEWORD(VERSION_MAJOR, VERSION_MINOR), &WSData)) 
    { 
    cout << "Cannot find Winsock v" << VERSION_MAJOR << "." << VERSION_MINOR << " or later!" << endl; 

    return 1; 
    } 

    // Lookup email server's IP address. 
    lpHostEntry = gethostbyname(szSmtpServerName); 
    if(!lpHostEntry) 
    { 
    cout << "Cannot find SMTP mail server " << szSmtpServerName << endl; 

    return 1; 
    } 

    // Create a TCP/IP socket, no specific protocol 
    hServer = socket(PF_INET, SOCK_STREAM, 0); 
    if(hServer == INVALID_SOCKET) 
    { 
    cout << "Cannot open mail server socket" << endl; 

    return 1; 
    } 

    // Get the mail service port 
    lpServEntry = getservbyname("mail", 0); 

    // Use the SMTP default port if no other port is specified 
    if(!lpServEntry) 
    iProtocolPort = htons(IPPORT_SMTP); 
    else 
    iProtocolPort = lpServEntry->s_port; 

    // Setup a Socket Address structure 
    SockAddr.sin_family = AF_INET; 
    SockAddr.sin_port = iProtocolPort; 
    SockAddr.sin_addr = *((LPIN_ADDR)*lpHostEntry->h_addr_list); 

    // Connect the Socket 
    if(connect(hServer, (PSOCKADDR) &SockAddr, sizeof(SockAddr))) 
    { 
    cout << "Error connecting to Server socket" << endl; 

    return 1; 
    } 

    // Receive initial response from SMTP server 
    Check(recv(hServer, szBuffer, sizeof(szBuffer), 0), "recv() Reply"); 

    // Send HELO server.com 
    sprintf(szMsgLine, "HELO %s%s", szSmtpServerName, CRLF); 
    Check(send(hServer, szMsgLine, strlen(szMsgLine), 0), "send() HELO"); 
    Check(recv(hServer, szBuffer, sizeof(szBuffer), 0), "recv() HELO"); 

    // Send MAIL FROM: <[email protected]> 
    sprintf(szMsgLine, "MAIL FROM:<%s>%s", szFromAddr, CRLF); 
    Check(send(hServer, szMsgLine, strlen(szMsgLine), 0), "send() MAIL FROM"); 
    Check(recv(hServer, szBuffer, sizeof(szBuffer), 0), "recv() MAIL FROM"); 

    // Send RCPT TO: <[email protected]> 
    sprintf(szMsgLine, "RCPT TO:<%s>%s", szToAddr, CRLF); 
    Check(send(hServer, szMsgLine, strlen(szMsgLine), 0), "send() RCPT TO"); 
    Check(recv(hServer, szBuffer, sizeof(szBuffer), 0), "recv() RCPT TO"); 

    // Send DATA 
    sprintf(szMsgLine, "DATA%s", CRLF); 
    Check(send(hServer, szMsgLine, strlen(szMsgLine), 0), "send() DATA"); 
    Check(recv(hServer, szBuffer, sizeof(szBuffer), 0), "recv() DATA"); 

    // Send all lines of message body (using supplied text file) 
    MsgFile.getline(szLine, sizeof(szLine));    // Get first line 

    do   // for each line of message text... 
    { 
    sprintf(szMsgLine, "%s%s", szLine, CRLF); 
    Check(send(hServer, szMsgLine, strlen(szMsgLine), 0), "send() message-line"); 
    MsgFile.getline(szLine, sizeof(szLine)); // get next line. 
    } while(MsgFile.good()); 

    // Send blank line and a period 
    sprintf(szMsgLine, "%s.%s", CRLF, CRLF); 
    Check(send(hServer, szMsgLine, strlen(szMsgLine), 0), "send() end-message"); 
    Check(recv(hServer, szBuffer, sizeof(szBuffer), 0), "recv() end-message"); 

    // Send QUIT 
    sprintf(szMsgLine, "QUIT%s", CRLF); 
    Check(send(hServer, szMsgLine, strlen(szMsgLine), 0), "send() QUIT"); 
    Check(recv(hServer, szBuffer, sizeof(szBuffer), 0), "recv() QUIT"); 

    // Report message has been sent 
    cout << "Sent " << argv[4] << " as email message to " << szToAddr << endl; 

    // Close server socket and prepare to exit. 
    closesocket(hServer); 

    WSACleanup(); 

    return 0; 
} 

が、私はそれはGmailにはないと思います。 Googleのメールはさまざまな手法を使用しているためです。リンクTLS SSL、

+3

「CまたはC++のどちらか」を意味する場合は、「C/C++」ではなく「おそらく」と言わなければなりません。 "C/C++"は厄介なテーマです。 – Steve314

+0

あなたのために働かなかったコードを書いてください。多分それを修正することはできますか? – Ulterior

答えて

0

セキュリティで保護された接続(GNUTLS)をサポートするライブラリが必要です。安全な接続を確立した後、我々は認証データを交換することができ、サーバーによって承認されると、私たちはGmailの認証情報を使って電子メールを送信することができます。これが他の同様の問題に直面するのを助けることを願ってあなたの親切な返答をありがとう。

+1

答えに質問を追加し、それをスレッドの回答としてマークするのは正しい方法ではありません。あなたはあなたの質問を更新したか、もう1つ質問してください。 – Offirmo

3

SMTPを実装するライブラリが必要です。

VMimeを参照することをお勧めしますが、Windowsでサポートされているかどうかは完全にはわかりませんが(MingWでコンパイルするセクションがありますので、ネイティブWinsockサポートがあると思います)。

また、Cライブラリlibcurlは、SMTPを含む多くのプロトコルを処理します。

2

TLSをサポートするlibcurlに基づいてlibquickmail(http://sourceforge.net/projects/libquickmail/)をチェックしてください。 また、添付ファイルを送信でき、認証を使用できます。 このライブラリはMinGWでコンパイルされ、Windows上で動作します。

関連する問題