1

CSmtp classを使用して添付ファイルを送信する際に問題があります。
そのリンクのコードは次のとおりです。

int SendMail()
{
  bool bError = false;

  try
  {
    CSmtp mail;

#define test_gmail_tls

#if defined(test_gmail_tls)
    mail.SetSMTPServer("smtp.gmail.com",587);
    mail.SetSecurityType(USE_TLS);
#elif defined(test_gmail_ssl)
    mail.SetSMTPServer("smtp.gmail.com",465);
    mail.SetSecurityType(USE_SSL);
#elif defined(test_hotmail_TLS)
    mail.SetSMTPServer("smtp.live.com",25);
    mail.SetSecurityType(USE_TLS);
#elif defined(test_aol_tls)
    mail.SetSMTPServer("smtp.aol.com",587);
    mail.SetSecurityType(USE_TLS);
#elif defined(test_yahoo_ssl)
    mail.SetSMTPServer("plus.smtp.mail.yahoo.com",465);
    mail.SetSecurityType(USE_SSL);
#endif

    mail.SetLogin("email@email.com");
    mail.SetPassword("password");
    mail.SetSenderName("");
    mail.SetSenderMail("email@email.com");
    mail.SetReplyTo("");
    mail.SetSubject("Subject");
    mail.AddRecipient("email@email.com");
    mail.SetXPriority(XPRIORITY_NORMAL);
    mail.SetXMailer("The Bat! (v3.02) Professional");
    mail.AddMsgLine("Hello,");
    mail.AddMsgLine("you have been successfully registered!");
    mail.AddMsgLine(" ");
    mail.AddMsgLine("Username: ");
    mail.AddMsgLine("Password: ");
    mail.AddMsgLine(" ");
    mail.AddMsgLine("See ya!");

    mail.AddAttachment("C:\\Users\\Jenda\\AppData\\Roaming\\text.dat");
    mail.Send();
}
catch(ECSmtp e)
{
    std::cout << "Error: " << e.GetErrorText().c_str() << ".\n";
    bError = true;
}
if(!bError)
    std::cout << "Registration E-Mail was sent on given address.\n";
return 0;
}

添付ファイルの行にコメントを付けると、電子メールが正常に送信されます。しかし、その添付ファイルを送信しようとすると、そこで停止して何もしないように見えます-エラーも何も返されません。何もしないだけです(ただし、タスクマネージャーによると、応答しています)。

また、2 つ目の質問があります。添付ファイルのパス (C:\Users\Jenda\AppData\Roaming\text.dat) が表示されますか? プログラムがユーザー (名前) に関する情報を取得する方法と、それをパスに追加してすべてのコンピューターで機能する方法を教えてください。C:\Users\ WINDOWSUSERNAME \...

以上です。すべての回答とアイデアに感謝します。

PS Windows7 32bit と Visual c++ Express 2010 を使用しています。

4

1 に答える 1

1

最初の質問については、この コードを参照していると思います。

考えられる問題:

A)

CSmtp.cpp:

hFile = fopen(FileName.c_str(), "rb");

する必要があります(fopen_sも考慮する必要があります):

hFile = fopen(Attachments[FileId].c_str(), "rb");

B)

ヘッダー ファイル CSmtp.h には、メールの最大サイズを指定する行があります。添付ファイルが 5MB を超えている可能性があります。25MB に変更します。

#define MSG_SIZE_IN_MB 5  // the maximum size of the 
                          // message with all attachments

ハ)

コードには Windows/Linux 固有の部分が多数あります。そのような例の1つは次のとおりです。

pos = Attachments[FileId].find_last_of("\\");

このため、Windows を使用している場合は、添付ファイルのパスに「/」ではなく「\\」を含める必要があります。より良いアプローチは、システムから分離を取得することでした。簡単に言うと、パスが適切に定義されているかどうかを確認します (例: "c:\\test3.txt")。

D)

main.cpp の最後に次の行を追加することを強くお勧めします (システム メッセージを表示できるようにするため)。

Sleep(4000);

2 番目の質問については、次のようなことができます (こちらも参照してください)。

#include <cassert>
#include <fstream>
#include <string>
#include <Windows.h>

std::string getPath(void){
    //Get local dir
    TCHAR szBuf[MAX_PATH] = { 0 };
    ::GetEnvironmentVariable("USERPROFILE", szBuf, MAX_PATH);
    std::string path = szBuf;
    path += "\\AppData\\Roaming\\text.dat";
    return path;
}
于 2015-02-04T23:44:31.623 に答える