0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PDF添付送信 送信たくさん セキュ強

Posted at

前提条件

  • 1️⃣ メールサーバーアカウント作成
  • 2️⃣ ライブラリ インスト
  • 3️⃣ コード実行、token.json先に作っとく

1️⃣ メールサーバーアカウント作成


メール、改行送りたい

インスト
body = """こんにちは、

こちらは長文のメールです。
改行を入れる場合は、以下のように書きます。

よろしくお願いします。
"""

メールの実行結果

スクリーンショット 2025-02-19 23.19.05.png


2️⃣ ライブラリ インスト

インスト
pip install mailjet-rest

コード解説

qiita.rb
encode_pdf関数 :PDFをBase64に変える
複数の受信者設定
受信者情報を recipients リストに追加リスト全員に同じPDF送信
メールの送信
mailjet.send.create(data=data)  : 送信時送信者受信者件名本文添付ファイルの情報を設定します
結果確認
result.status_code : 成功したか確認

manypdf.py
from mailjet_rest import Client
import base64

# Mailjet APIキー設定
api_key = 'Api key'  
api_secret = '秘密鍵key'  
mailjet = Client(auth=(api_key, api_secret), version='v3.1')

# PDFファイルをBase64にエンコードする関数
def encode_pdf(file_path):
    with open(file_path, "rb") as f:
        pdf_data = f.read()
    return base64.b64encode(pdf_data).decode('utf-8')

# メール送信関数
def send_email_with_pdfs():
    # 送信するPDFファイルをBase64にエンコード
    resume_base64 = encode_pdf('履歴書 hoge.pdf') 
    cv_base64 = encode_pdf('職務経歴書 hoge.pdf')  

    # 複数の受信者リスト
    recipients = [
        {'Email': '送りたいメアド', 'Name': ''},
        {'Email': '送りたいメアド', 'Name': ''},
        {'Email': '送りたいメアド', 'Name': ''}
    ]

    # メッセージリスト(受信者ごと)
    messages = []
    for recipient in recipients:
        message = {
            'From': {
                'Email': 'hoge@gmail.com',
                'Name': 'hoge'
            },
            'To': [recipient],  
            'Subject': '書類のご送付',
            'TextPart': """
                           メールアドレスを教えていただき、
                           ありがとうございます。
                           書類を送ります。""",
            'Attachments': [
                {
                    'ContentType': 'application/pdf',
                    'Filename': '履歴書 hoge.pdf',
                    'Base64Content': resume_base64
                },
                {
                    'ContentType': 'application/pdf',
                    'Filename': 'hoge 職務経歴書.pdf',
                    'Base64Content': cv_base64
                }
            ]
        }
        messages.append(message)

    # メール送信データ
    data = {'Messages': messages}

    # メール送信
    result = mailjet.send.create(data=data)

    # 結果表示
    if result.status_code == 200:
        print('成功!')
    else:
        print(f"送れてないよ")
# 実行
send_email_with_pdfs()

スクレイピング 禁止理由

qiita.rb
利用規約に違反
サーバーに過剰な負荷
他の利用者が使いづらくなる

サイトがスクレイピング検出でアクセス制限かかる

著作権や知的財産の保護
求人情報や会社情報は知的財産
情報を無断で収集再利用は著作権や法的権利を侵害

PDF自動送信 セキュリティが一番高いもの

qiita.rb
一番 : OAth認証
二番目 : メールサーバー(SendGridやmailjet)
一番セキュリティが低い : Googleのアプリキー


OAth API 無料利用枠の多さと、設定のしやすさおすすめ

qiita.rb
GitHub:OAuth設定がちょー簡単
初心者でも設定しやすい
無料で利用できるAPIの制限も高

APIでスクレイピング 種類

qiita.rb
1. 求人情報API
求人情報を取得するために
ウェブサイトが提供している公式APIを使う方法です

Indeed API
Indeedは求人情報を提供している大手プラットフォームでAPIを使って求人情報を取得できますAPIの利用には利用申請やAPIキーの取得が必要です
Indeed API Documentation

Careerjet API
Careerjetも求人情報を提供するサービスでAPIを提供していますこれを使えば複数の求人サイトから情報を集めて利用することができます
Careerjet API Documentation

Adzuna API
Adzunaは求人情報を集めるためのサービスでAPIを提供しており求人情報を簡単に取得できます
Adzuna API Documentation

LinkedIn API

2. ScraperAPI
ウェブサイトのコンテンツをプログラムから簡単に取得
リクエスト時にIPローテーションやCAPTCHAの回避を自動的に行ってくれる

3. BeautifulSoupやSeleniumを使ったスクレイピング


4. Google Custom Search JSON API
Google使って情報検索

メールで文字を取得し、文字を加工

qiita.rb
pip install email
qiita.rb
pip install email

import imaplib
import email
from email.header import decode_header

# GmailのIMAPサーバーに接続
def connect_to_gmail():
    # IMAPサーバーに接続
    mail = imaplib.IMAP4_SSL("imap.gmail.com")
    
    # Gmailにログイン(アプリケーション専用パスワードを使って)
    mail.login("your-email@gmail.com", "your-app-password")
    
    # 受信トレイを選択
    mail.select("inbox")
    
    return mail

# メールを取得する関数
def get_emails(mail):
    # 検索条件を指定してメールを取得
    status, messages = mail.search(None, 'ALL')  # 'ALL'で全てのメールを取得
    email_ids = messages[0].split()  # メールIDリスト
    
    # 最新のメールから順番に処理
    for email_id in email_ids[::-1]:  # 最新から処理
        _, msg_data = mail.fetch(email_id, "(RFC822)")  # メールのデータを取得
        
        for response_part in msg_data:
            if isinstance(response_part, tuple):
                msg = email.message_from_bytes(response_part[1])  # メールの本文を取得
                subject, encoding = decode_header(msg["Subject"])[0]  # 件名をデコード
                if isinstance(subject, bytes):
                    subject = subject.decode(encoding if encoding else "utf-8")
                print("Subject:", subject)

                # メールの本文を取り出す
                if msg.is_multipart():
                    # メールがマルチパートの場合(添付ファイルなど)
                    for part in msg.walk():
                        content_type = part.get_content_type()
                        content_disposition = str(part.get("Content-Disposition"))
                        
                        if content_type == "text/plain" and "attachment" not in content_disposition:
                            # 本文がテキストで、添付ファイルでない場合
                            body = part.get_payload(decode=True).decode()
                            print("Body:", body)
                else:
                    # 単一のテキストメールの場合
                    body = msg.get_payload(decode=True).decode()
                    print("Body:", body)

# Gmailからメールを取得
mail = connect_to_gmail()
get_emails(mail)

# 接続を終了
mail.logout()

コード解説

qiita.rb
connect_to_gmail()関数:
GmailのIMAPサーバーimap.gmail.comに接続しログインしますアプリ専用のパスワードを使ってログインすることが重要です
mail.select("inbox")で受信トレイを選択します
get_emails()関数:
mail.search(None, 'ALL')で全てのメールを取得しますここではALLを指定していますが条件を変更して未読メールや特定のラベルがついたメールだけを取得することもできます
取得したメールIDをmail.fetch()で各メールの内容を取得しemail.message_from_bytes()を使ってメールを解析します
メールの件名や本文を表示しますもしメールがマルチパート複数の部分から成るであれば本文をテキストとして取得します
decode_header():
メールの件名Subjectエンコーディングされている場合があるのでdecode_header()を使ってエンコーディングを適切にデコードします
メールの本文取得:
メールの本文がプレーンテキストtext/plainの場合get_payload()を使って本文を取り出します
<li>
転職でもバイトでも理不尽を起こすのは全部採用側の事情次第

モヤモヤするけど今回の件で面接前に募集状況を再確認するのが大事って気づけたのは収穫無駄足を防ぐためにも次回からは応募の際に面接時にまだ枠があるか確認を習慣にしたらいいよ
</li>
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?